简介:2018年TI杯大学生电子设计竞赛C题“无线充电电动小车”的完整题目与答案资源包,面向电子设计竞赛参赛者、嵌入式爱好者和相关课程学生,可辅助备赛训练与课程设计。内容围绕电磁感应无线充电原理,涵盖发送端逆变、接收端整流、DC-DC电源管理、直流电机PWM调速、PID控制算法,以及红外或磁感应传感器辅助的对准充电机制,并涉及51单片机或STM32的嵌入式编程实现。压缩包共166个文件,以C源码、H头文件、Keil工程文件与编译输出文件为主,另有DOCX文档、说明文本及调试备份文件,包体约4.15MB,目录结构清晰,便于按模块查阅。目前已有1888人学习下载。通过这套资源可从电磁场理论、控制策略到系统联调完整梳理赛题设计流程,获取可参考的工程源码、硬件方案及详细解答步骤,直接用于竞赛复现、课程设计或项目开发。
1. 一个赛题,把无线充电和小车控制全串起来了
2018年大学生电子设计竞赛题C「无线充电电动小车」在当年算是性价比非常高的一道题:不需要复杂的图像处理,也不涉及高深的控制理论,但电磁感应、谐振补偿、储能充电、电机驱动、循迹传感器和单片机状态机全都在一台小车上串起来了。网上流传的「题目加答案」资料包很多,下载下来一看,电路图、代码、参数写得密密麻麻,但真按着做的人大多在充电效率和小车启动这两步翻车。拿到资料先别急着照抄,这道题真正值钱的地方在于:它逼你把一条完整的能量链和控制链打通。
这道题适合两类人:一类是刚接触控制系统、想在一个月内做出完整作品的学生,另一类是已经能跑通基本循迹、想补无线充电这块短板的人。题目本身不算难,难的是「稳定复现」——充电充得进去、车发得起来、线跟得住、点停得准,四件事全部做到,才有底气拿出去参赛。下面从拆题开始,把方案选型、硬件搭建、软件状态机和调试坑一条条讲清楚。
2. 拆解题C:功能指标、系统框图与无线充电方案选型
2.1 题目到底考什么:从功能要求反推系统组成
把当年的题目要求转成白话,核心功能链只有四步:发射端通电,小车底部接收线圈取电;储能器件充满,启动判定成立;小车沿黑色引导线行驶到指定停泊区;到点停车,动作停止。评分点也是沿着这条链设的:能不能在限定时间内充到足够电量、能不能稳定沿黑线走完规定距离、最终停车位置偏不偏。
从这三个评分点反推系统组成,至少需要四个独立但又互相耦合的部分:
第一部分是无线充电链路,负责把电能从发射线圈隔空送到车上;第二部分是储能与充电管理,决定电能存到哪里、什么时候算充满;第三部分是驱动与转向机构,把电能变成车轮的转动;第四部分是循迹与停车检测,让车知道自己在哪、该往哪走、何时停。四个部分任一个出问题,整车就动不了。
资料包里的「答案」通常会把重点放在无线充电链路和程序代码上,因为这两块最容易被卡住。但实际做下来你会发现,硬件连接和电源分配才是第一个坑:接收线圈的交流输出直接进整流桥,整流后的大电流充电通路和单片机的小信号供电如果共用地线,ADC采样值会飘得没法看。所以画系统框图时,一定要把功率通路和信号通路分开画。
我的习惯是先画一张能量流向图:发射端电源→全桥逆变→发射线圈→磁场耦合→接收线圈→整流滤波→储能器件→电机驱动。再把控制信号叠加进去:单片机采集电压、读取传感器、输出PWM。这样画完,每个模块的输入输出就清楚了,后面选型和接线都有依据。
2.2 无线充电链路怎么选:电磁感应与谐振补偿
无线充电在小车这个场景下,能用的方案基本只有电磁感应,Qi 标准和磁谐振两种路线差别很大:Qi 标准是现成的模块,买来就能用,但发射和接收位置对准要求高,小车行驶中线圈本身不动还好,可固定位置的发射端和车底接收端之间如果有几毫米偏差,效率掉得很快;磁谐振(磁耦合谐振)对位置偏差容忍度高一些,但需要自己绕线圈、调补偿电容,工程量大不少。
电赛题C的普遍做法是自绕线圈加谐振补偿,因为题目要求的是「设计一个无线充电装置」,直接用成品模块拿不到设计分。谐振补偿的常规接法有四种:发射端串联电容、接收端串联电容,简称SS;还有SP、PS、PP。小车场景我用SS最多,理由有两个:第一,SS补偿在负载变化时输出电压相对平缓,而小车充电过程中储能器件电压一直在上升,负载特性是变化的;第二,SS结构简单,两边各一个电容,调试时只需关注谐振频率是否对准。
谐振频率的计算公式没什么玄学:f = 1 / (2π√(LC))。关键是L的取值。发射线圈和接收线圈绕好后,用电桥或LCR表实测电感量,而不是按理论公式估算,因为绕线的松紧、层数、磁芯位置都会让实际电感偏离计算值。实测出L之后,反推C,再就近选标准容值的电容,最后用示波器看发射端波形,微调电容让波形最干净、传输效率最高。
频率选多少也是经验活,常见做法是跑100kHz到200kHz这个区间。频率太低,线圈要绕很多匝,体积大;频率太高,开关管的开关损耗和线圈的趋肤效应会吃掉效率。我一般定在130kHz左右,兼顾效率和器件要求。这里有个容易忽略的点:接收端整流之后如果直接接超级电容,电容电压上升会导致等效负载电阻变小,谐振点会偏移。所以不能只调一次参数就完事,要在储能器件电压最低和最高两个状态下分别测效率,取折中补偿值。
2.3 接收端到小车平台的四个关键模块
接收线圈感应出来的交流电压,不能直接给单片机用,中间要过四个模块:整流、滤波、充电控制、电源分配。
整流桥最常见的是四个肖特基二极管搭成桥式整流。选肖特基是因为正向压降只有0.3V左右,比普通整流管少掉零点几伏,在低电压接收场景下这些压降直接决定能不能充进电。滤波电容用一个几百微法的电解电容,并联一个0.1μF瓷片电容滤高频。这里的容量不能太大,太大会让电压建立变慢,影响充电启动的响应。
充电控制这一级,视储能器件而定。用超级电容的话,充电控制可以做得非常简单:设定一个最大充电电压,用比较器或单片机ADC判断到达阈值就切断充电通路,因为超容本身耐过充能力比锂电池强得多;用锂电池的话就要上充电管理芯片,还要考虑保护板,复杂度上了一个台阶。多数参赛方案选超级电容,理由很现实:充电电流可以做很大,60秒内能充进去的能量比锂电池多,而且不需要复杂管理电路。
电源分配是新手最容易踩的地方。电机启动瞬间电流可能到1A甚至更高,如果单片机供电直接和电机电源并在一起,电压跌落会直接造成复位。常见做法是:储能器件电压先给电机驱动板,再从储能器件经过一级低压差稳压器(LDO)降到单片机工作电压,且功率地和信号地在主板上单点汇合。这样电机浪涌电流走功率回路,不会干扰控制回路的电压。
硬件选型这块,资料包的答案一般会给出具体的芯片型号和电路图,但不同板子的线材、线圈、电机参数都不一样,照着抄大概率要重调。我一般把答案当参考框图用,重点看它的能量走向和地线处理,具体器件按自己手头有的来。
3. 硬件搭建:线圈绕制、充电管理与小车主板的连接
3.1 线圈和补偿电容:一组可复用的绕制参数
线圈是整个无线充电链路里变量最大的部分,也是效率上不去的头号原因。这里给一组我用过的参数,效率在70%上下,适合10cm×10cm以内的车底空间:
发射线圈用直径0.1mm×100股的利兹线,绕12匝,外径80mm,不加磁芯时实测电感约35μH;接收线圈同样用利兹线绕14匝,外径60mm,电感约48μH。两个线圈不用完全同尺寸,接收线圈略小,方便装在车底,耦合系数低一点但能接受。加上磁芯可以显著提高耦合系数,E型或圆形铁氧体磁片贴在接收线圈背面,每片厚2mm,能让感应电压提升20%以上。
补偿电容的计算按SS补偿来:发射端用C1和L1谐振,接收端用C2和L2谐振。以发射端为例,L=35μH,目标频率130kHz,代入公式C = 1/(4π²f²L),算出来约43nF,选两个22nF的CBB电容并联,耐压选250V。接收端L=48μH,算出约31nF,用33nF的标准值凑合。注意电容必须用CBB电容,高频损耗小;普通电解电容在这个频率下损耗太大,充其量当滤波用。
装好之后必须用示波器验证:发射端全桥输出端看波形,接收端空载时看整流前波形。发射频率要落在LC谐振峰上,判断标准是发射线圈电流波形正弦度高、无明显畸变,接收端空载电压达到设计值。如果发现接收电压比理论值低很多,先查两个谐振频率是否一致——发射端和接收端各自谐振频率差超过5%,效率就会掉到30%以下。
绕线圈时的力学细节也很关键:线圈要绕紧,匝间不能有松动;引线要短,而且两根引线不要平行走线,否则会引入额外的寄生电感。绕完后用热熔胶固定,避免搬运时变形。电感量一旦因为线圈变形改变,补偿电容就要重算,所以固定好再测L值是省时间的习惯。
3.2 充电到发车的门槛电路:电压检测与软启动
储能器件选超级电容后,充电门槛电路只需要回答一个问题:电压到多少算充满,可以发车。以6个2.7V/10F的超级电容串联为例,串联后总耐压16.2V,实际充电限制设定在14.4V,留10%余量防止过压。这个值定太低会充不足,跑的距离短;定太高,接近耐压上限,电容发热和寿命都会恶化。
电压检测用单片机的ADC引脚分压采样。分压电阻选100k和10k,把14.4V映射到ADC量程的合适位置。这里有个坑:超级电容电压上升比较慢,ADC采样值在最后阶段会跳变,直接拿单次采样值做阈值判断,可能在临界点反复抖动。处理办法是加回差,设定充电完成阈值14.4V,启动阈值降到13.8V,这样充满后即使电压自然跌落一点,也不会立刻回到充电状态。
下面是一段常见的充电判定代码,用状态机的思路写,避免在循环里反复切换状态。注意这段只是通用实现思路,不是资料包原代码,抄的时候要按自己板子的ADC位数和参考电压改参数。
// 伪代码:充电判定与软启动 #define V_FULL 14.4f // 充满阈值(V) #define V_START 13.8f // 允许发车电压(V) #define HYST_DELTA 0.6f // 回差宽度,防止临界抖动 float read_batt_voltage(void) { uint32_t sum = 0; for (int i = 0; i < 16; i++) { sum += adc_read(); // 连续采16次 } float avg = sum / 16.0f; // 取平均,滤掉纹波 return avg * VOLT_PER_LSB; // 按分压比换算成实际电压 } int check_charge_state(float vbat, int current_state) { if (current_state == STATE_CHARGING) { if (vbat >= V_FULL) { return STATE_READY; // 充满,允许发车 } } else { if (vbat < V_START) { return STATE_CHARGING; // 电压跌回阈值以下,重新充 } } return current_state; }这段逻辑说明两点。第一点是多次采样取平均,超级电容是容性负载,纹波比电池大,单次采样容易误判;16次采样在大多数单片机上耗时不到1ms,不影响主循环。第二点是回差设计,V_FULL和V_START之间留0.6V的窗口,防止电压在临界点附近反复触发状态切换。实际调试时先用串口把电压值打出来,看充满时电压波动范围,再确定回差宽度,不要拍脑袋定。
3.3 电机驱动与循迹传感器的接线和电源分配
电机驱动芯片常见的是DRV8833或TB6612,两种都支持双路直流电机,内置过流保护,逻辑输入兼容3.3V和5V。电机选N20减速电机,减速比1:50左右,空载转速约300rpm,扭矩足够推动小车,速度也压得住。两个电机做成差速驱动,转弯靠左右轮速差实现,不需要额外的舵机转向机构,结构简单不少。
接线时的电源分配直接决定系统稳不稳。我的接法是这样的:超级电容正极先到电机驱动板的VM引脚,电机驱动板的地(GND)单独一条粗线回到电容负极;单片机供电从电容正极串联一个LDO(比如低压差稳压器)取电,输出3.3V或5V,LDO的地和电机驱动的地在电容负极单点汇合。这样做的目的是让电机的大电流完全走自己的回路,不经过LDO和单片机的参考地。
循迹传感器一般用4到5路红外对管排成一排,间距1.5cm,跨距覆盖黑线宽度(黑线通常2cm)。传感器输出是模拟电压,可以直接接ADC,也可以接比较器转成数字量。两种方式各有适用场景:数字量处理简单,但阈值固定,换场地就得重新调;模拟量多花几个ADC引脚,配合软件自校准,能在现场快速适应不同反光条件。我习惯用模拟量,后面讲软件的时候细说。
传感器供电建议和单片机的供电走同一路LDO输出,而不是直接接电容正极。原因是传感器的红外发射管对电压敏感,电压波动会导致输出偏移;而循迹恰恰需要传感器输出稳定,才能保证阈值判断可靠。LDO输出的电压纹波小,能给传感器提供一个干净的工作环境。
电机驱动的PWM输入引脚要选单片机带硬件PWM的通道,软件模拟PWM在低频率下还能用,一旦频率上到10kHz以上,软件模拟会占满CPU,导致ADC采样和传感器读取被挤掉。我用定时器输出两路PWM,分别控制左右电机,方向引脚用普通GPIO,这样控制逻辑最简。
4. 软件状态机:从充电完成到循迹停车的控制流程
4.1 主循环里的四个状态与状态切换条件
整车软件用状态机来组织,比在main函数里写一长串顺序逻辑要稳得多。原因很简单:题目要求的动作是时间驱动的,充电、启动、行驶、停车这几个阶段互相不重叠,每个阶段做的事情完全不同,用状态机可以把每段逻辑隔离,避免充电逻辑干扰循迹逻辑。
我的状态划分是四个:CHARGING(充电中)、READY(待发车)、RUNNING(循迹行驶)、STOPPED(已停车)。再加一个MERGE判断放在主循环开头,处理异常情况,比如充电状态下电压异常掉到过低值,直接原地死等,不动作。
状态切换条件写成这样:
switch (state) { case STATE_CHARGING: if (batt_v >= V_FULL) { state = STATE_READY; // 充满,进入待发车 } break; case STATE_READY: // 启动延时1秒,确认电压稳定后再动 if (timer_expired(&startup_timer, 1000)) { state = STATE_RUNNING; motor_enable(1); } break; case STATE_RUNNING: // 停车传感器触发或到达最大行驶时间 if (stop_sensor_detected() || timer_expired(&run_timer, MAX_RUN_MS)) { state = STATE_STOPPED; motor_set_speed(0, 0); // 立即停车 } break; case STATE_STOPPED: // 停车后什么都不做,等待人工断电 break; }这段逻辑里三个细节值得注意。第一,READY状态的1秒延时非常关键,超级电容刚达到阈值时,内部电荷分布还没稳定,立刻启动电机,电压会被拉低到阈值以下,状态又跳回CHARGING,形成反复重启。加1秒延时让电压稳定。第二,RUNNING状态的停车条件要有双保险,停车传感器触发和最长运行时间两个条件用或的关系,防止传感器漏检导致小车冲过终点后还在跑。第三,STOPPED状态下电机要立即给停止指令,而不是只靠惯性停车,否则停车位置偏差会很大。
主循环的节奏也要控制好。电机PWM用定时器硬件输出,不受主循环影响;主循环只做三件事:读电压、读传感器、跑状态机。ADC采样和传感器读取放主循环里,循环周期控制在10ms以内就够了。千万别在循环里加软件延时,延时会把传感器读取周期拖乱,循迹响应变慢。
4.2 循迹转向:差分值、比例控制和阈值自校准
循迹部分的核心问题是:面对一排传感器数据,怎么决定两个轮子的速度差最合理。常见做法是先把模拟量转成二值,再把传感器排列位置映射成偏差值,最后用比例控制算左右轮速。
我用的映射法是给每个传感器分配一个权重,比如5路传感器从左到右权重是-2、-1、0、1、2。当黑线正居中的时候,中间的传感器压线,计算出的加权偏差接近0;黑线偏左,右边的传感器压线,偏差为正,要右转;黑线偏右,偏差为负,要左转。偏差值除以压线的传感器个数,得到归一化偏差,范围大概在-2到2之间。
有了偏差,转向控制用比例公式:左右轮速 = 基础速度 ± 转向系数 × 偏差。基础速度决定行驶速度,转向系数决定转弯强度。系数太小转不过弯,车会冲出黑线;太大会左右摇摆,走S形。经验值从基础速度的20%开始调,逐步往上加,直到过弯不丢线。
传感器阈值自校准这块特别重要,直接决定换场地后要不要重新调参数。上电后让小车在起始位置静止2秒,此时传感器没有压线,采集一排值作为白色参考;再人为把传感器移到黑线上方采集黑色参考。阈值取黑白两个参考值的中值。有了这个中值,程序运行时每个传感器就动态地判断当前是白还是黑,不但适应不同地面颜色,还能适应环境光变化。
下面给出动态阈值的核心片段:
// 上电自校准:采集黑白参考值 void calibrate_sensors(void) { // 黑线在校准位上,先采集黑参考 for (int i = 0; i < NUM_SENSORS; i++) { black_ref[i] = adc_read_sensor(i); } delay_ms(2000); // 挪车到白区,再采集白参考 for (int i = 0; i < NUM_SENSORS; i++) { white_ref[i] = adc_read_sensor(i); } for (int i = 0; i < NUM_SENSORS; i++) { threshold[i] = (black_ref[i] + white_ref[i]) / 2; } } // 运行时按动态阈值判黑判白 int is_black(int sensor_idx) { return adc_read_sensor(sensor_idx) < threshold[sensor_idx]; }校准代码的思路是让程序自动学习当前环境,而不是把阈值写死。两个陷阱提前说:校准过程中如果手把传感器挡住了,采集的值全是乱的,阈值会出错;黑参考和白参考的采集间隔不能太短,要给程序留出稳定输出的时间。我在实际调试中碰到过一个情况:小车从桌面挪到地面后没重新校准,循迹直接乱跑,就是因为阈值还是桌面上反光较强的值,拿到地面上全判错了。
自校准还有个变体做法:不做上电校准,而是在运行过程中持续追踪每个传感器读数的最大值和最小值,动态更新阈值。这个方法能应对行驶过程中光照变化,但实现复杂,对初学者不推荐,先做好上电校准就够了。
4.3 时间预算与PWM参数:从变量到现场的调参顺序
题目对时间有明确限制,充电时间和行驶时间都得精打细算。以「充电60秒后发车」这类常见要求为例,时间预算表是这样的:
| 时间段 | 时长 | 说明 |
|---|---|---|
| 充电 | 60s | 接收端给超级电容充电 |
| 启动确认 | 1s | 电压稳定,状态切换 |
| 行驶 | 30s-40s | 沿黑线到停泊区 |
| 停车缓冲 | 0.5s | 减速点提前减速到停车点 |
从预算反推指标:基础速度不能太快,太快转弯时离心力大、容易丢线;也不能太慢,太慢超时。按行驶距离5米、时间35秒计算,平均速度约0.14m/s。N20减速电机配65mm直径车轮,这个速度对应PWM占空比大约在35%-45%区间。这个数字只能作起点,实际要按场地调整。
PWM参数里两个变量最值得调:频率和占空比变化率。频率我固定10kHz,人耳基本听不到电机噪音,而且远高于充电频率,避免干扰耦合到充电链路。占空比变化率是软启动的核心——电机从0加速到目标占空比,不要一步到位,用斜坡在300ms内逐步加上去。超容供电时尤其要这样,瞬间大电流会把系统电压拉低,导致单片机复位。
调参顺序我固定为三步,顺序错了会越调越乱。第一步调充电环节,先把充满阈值、回差、软启动时间定下来,保证每次都能在限定时间内充到设定电压。第二步调循迹比例系数,从低系数开始,跑直线看是否走S形,再加系数跑弯道,找到最优值。第三步调停车减速点,在终点前设一个减速传感器,触发后把速度降到30%,再让停车传感器触发制动。
参数最终要在不同场地各跑几遍,取能稳定通过的值。不要在现场临时改大参数,每次改动的影响是连锁的:基础速度变了,转弯系数要跟着变;转弯系数变了,停车减速点的位置也要调。一次只改一个变量,记录数据再改下一个,这是血泪经验。
5. 题C的5个高频坑:现象、原因与处理办法
5.1 充电效率突然掉到20%:谐振频率偏了
现象:发射端和接收端都按参数装好了,示波器看波形也正常,但充电60秒后电压只到目标值的三分之一不到,明显充不进去。
原因:两个线圈的实际谐振频率不一致。绕线时手工误差导致两个线圈电感量有差异,加上补偿电容的标准容值不可能刚好匹配计算值,发射端和接收端的谐振峰错开了,能量传输效率骤降。还有一种情况是接收端负载变化(超容电压从低到高),等效阻抗变化把谐振点拉偏了。
解决:用LCR表重新实测两个线圈的电感量,分别计算补偿电容,尽量让电容实测容值和理论值偏差在5%以内。装好后用示波器在发射端观察电流波形,调整发射端补偿电容,让波形最干净。随后接上接收端和负载,测超容电压从0到充满过程中的充电电流,如果在某个电压区间电流明显下降,就是谐振点偏移,要调整电容或略微改变开关频率来匹配负载区间。
5.2 小车一启动单片机就复位
现象:充电一切正常,状态切到RUNNING的瞬间,电机还没转起来,单片机先重启了,状态又回到CHARGING。
原因:电机启动瞬间电流冲击太大。超级电容虽然内阻小,但电机堵转电流可能到1A以上,这个电流在电源线上产生压降,单片机供电的LDO输入电压瞬间跌破最低工作电压,直接掉电复位。
解决:先在软件上加斜坡启动,占空比从10%逐步升到目标值,把电流冲击摊到几百毫秒内。再检查地线:电机驱动板地、LDO地、传感器地是否都正确汇合到电容负极单点。如果软件和地线都改完还复位,用一个1000μF电解电容并在单片机供电的输入端,提供瞬态缓冲。
5.3 循迹传感器白天误判、晚上正常
现象:晚上在室内调好的阈值,第二天拿到有阳光的场地跑,小车过弯时频繁丢线、乱摆。
原因:红外对管传感器对环境光敏感,阳光里的红外成分会让传感器读数整体偏移。晚上没有阳光干扰,白天阳光一照,白色参考值漂了,原来定的阈值不再适用于当前光照。
解决:把自校准流程做成上电必做,而不是调试时做一次就固化进代码。每次放到起跑线后,给2秒校准时间,程序自动采集当前光照下的黑白参考值。如果场地光线在行驶过程中变化剧烈(比如云飘过),用动态阈值追踪实时最大最小值,但要做到这一步先把上电校准做好。
5.4 充满电放一会,启动判定失效
现象:充电完成指示灯亮了,电压也到了阈值,但等了十几秒再发车,车突然没力,跑一小段就停。
原因:超级电容自放电和电压回落。刚切断充电时电压在14.4V,静置几秒后回落到14.0V以下,启动判定阈值设得过高,电机启动瞬间电压进一步跌落,就直接低于最低工作电压了。
解决:把启动阈值调低到13.5V左右,和充满阈值拉开至少0.9V的窗口。同时软件在READY状态做一次启动前检查:连续读5次电压,全部高于启动阈值才发车,任何一次低于阈值就回到充电状态继续补电。
5.5 停车冲过终点线,位置偏差大
现象:小车在终点处已经触发停车,但车还是滑出去半个车身,有的甚至直接冲出场地。
原因:减速电机的减速比虽然大,但车有惯性,触发停车时如果速度还很高,制动距离就很长。很多方案只在停车点设一个传感器,高速状态下根本刹不住。
解决:在终点前20cm处加一个减速传感器,触发后把速度降到40%,让车以低速滑到停车点,再触发停车传感器彻底制动。两个传感器的距离按车速标定:以0.14m/s的速度,20cm大约需要1.4秒,足够完成降速。如果场地不允许加传感器,可以用行驶距离估算,编码器计数到了就减速,效果差不多。
6. 验收方法与进阶技巧:让小车从「能跑」到「稳定复现」
6.1 一张测试记录表代替感觉
调车最怕凭感觉:这次跑过了觉得没问题,下次换个位置就翻车。我的做法是做一张简单的测试记录表,每跑一趟记一行,至少连续记录十趟。表格字段就是充电时间、起始电压、充满电压、停车偏移量、是否压线、天气和地面说明。十趟跑完看一眼数据,均值和方差比任何体感都说明问题。
| 趟次 | 充电时间(s) | 充满电压(V) | 停车偏移(cm) | 压线/丢线 | 备注 |
|---|---|---|---|---|---|
| 1 | 60 | 14.4 | +3 | 无 | 正常 |
| 2 | 60 | 14.3 | -2 | 无 | 正常 |
| 3 | 60 | 13.9 | +8 | 有 | 阳光直射,未校准 |
第三趟这种数据一出来,就知道问题出在环境变化导致阈值漂移,而不是循迹参数错了。测试记录表还能帮你判断改参方向:连续几趟都偏左,说明转向系数过大或基础速度过快;充电电压一次比一次低,说明电池或电容在衰减。这套方法比反复调参快得多。
6.2 三个值得加的小改进
第一个改进是串口调试日志。把状态切换、电压采样值、传感器原始值、PWM占空比通过串口打印出来,调试时盯着串口看,比看小车跑要高效得多。所有现场翻车都能从日志里定位到是充电没到位还是循迹丢线,而不是靠猜。
第二个改进是拨码开关切模式,调试模式和比赛模式共用一套代码。调试模式下速度降到50%,传感器校准后自动打印每个通道的阈值,方便确认环境没问题;比赛模式下关闭调试输出,全力跑。代码量不大,省下的现场时间不少。
第三个改进是双色LED状态指示,红色表示充电中,绿色表示充满待发车,闪烁表示异常。现场评委看到指示灯状态直接就能判断小车状态,你也能在不碰车的情况下确认程序走到了哪一步。这三个改进都是小成本,但对稳定复现帮助很大。
最后说个教训:有次在现场调车,为了抢时间跳过上电校准直接跑,小车一出弯就压线,来回调了半小时都没好,最后重新校准了一遍,一次就过了。从那以后我定了一条规矩,到新场地第一件事不是跑车,是校准。希望帮到你。
本文还有配套的精品资源,点击获取