简介:2018年TI杯大学生电子设计竞赛C题“无线充电电动小车”完整资料包,面向电子、自动化及相关专业学生与备赛选手,浓缩赛题要求、设计方案和详细解答步骤。压缩包共166个文件、约4.15MB,以C源码、H头文件、编译生成的O/HEX/AXF文件和Keil工程配置(uvprojx、uvopt等)为主,辅以DOCX/TXT说明文档,便于按代码、文档、固件三条线对照学习。这一项目涵盖电磁感应无线充电、PWM电机调速、PID控制、充电状态检测等关键技术,从题目拆解、硬件选型到程序调试均有对应材料,结构清晰,适合入门到进阶的嵌入式爱好者深入研读,也适合课设或竞赛备赛复盘。目前已有1888人学习下载,借助完整工程源码和烧录文件,可以在常见单片机上逐步复现并验证整车逻辑,对理解系统联调与电源管理也有直接帮助。
1. 无线充电电动小车:一份竞赛资源到底值不值得照着做
做电子设计竞赛的人,多半绕不开这道经典题:小车不许带电池,只在发射线圈上短暂停几秒,充满电后自己跑起来,跑完一圈还要带载。很多第一次做这道题的队伍,都在“充电没充满就跑不动”和“充满了但超时”之间反复横跳。这份资源把题目原文和一套完整答案打包在一起,核心思路是“先解决能量获取,再谈控制”,避开了大多数队伍一上来就死磕电机控制、最后被能量预算打脸的坑。适合正在备赛、想用最短时间把无线充电小车跑通的队伍,也适合想快速搞懂谐振充电和PWM占空比控制关系的从业者。它的价值不在题目文字,而在答案里那套能落地的参数取法和调试顺序。
2. 吃透题目要求:先把能量预算算清楚
2.1 题目里的隐藏约束:不是所有参数都在题目上
这道题很多人第一眼看到的是“无线充电”四个字,但真正决定整辆车能不能跑完全程的,是题目里的能量约束。题目给出的是发射端供电电压和充电时间上限,以及小车在无外部供电条件下需要完成的行驶距离。很多队伍把这些当“线路条件”看,忽略了它们实际上是能量预算的硬边界。
我一般拿到题目会先把两个数算出来:充电时间内的最大可获取能量,以及行驶全程(含带载段)的总能耗。前者由接收线圈输出电压、充电电路效率和充电时间共同决定,后者由电机功率、整车重量和行驶时间决定。两份数一对,就能判断这辆车是应该做成轻量化小车、把发射端功率拉到顶,还是干脆放弃部分带载能力、用更大电容换续航。
这道题的典型工况是:充电时间上限大约在几十秒量级,发射端供电为直流稳压电源,接收端用超级电容蓄能,再通过升压电路驱动电机。注意,题目并没有限制接收端的储能方式,实际答案里最常见的是超级电容方案,少数队伍用了锂电池。锂电池能量密度高但充电速度受限制流保护影响,超级电容可以大电流快充,但电压会持续跌落,必须搭配升压电路来稳定母线电压。
2.2 谐振拓扑怎么选:串联还是并联,决定了充电电流上限
无线充电的接收端拓扑,直接决定你充进去多少能量。这道题的主流做法是电磁感应式,发射线圈和接收线圈之间通过高频交变磁场耦合。但同样是感应式,发射端补偿网络有串联和并联两种接法,答案里给的参考方案是串联谐振发射、串联谐振接收(SS),原因是它对负载变化不太敏感,而且设计公式最直接。
谐振频率的计算很简单,关键是选准补偿电容值,公式是 C = 1 / (4π²f²L),f是驱动频率,L是线圈电感。很多队伍在频率上翻车,用的是便宜的信号发生器输出固定频率,但线圈电感会因为温度和小车震动轻微漂移,导致谐振点偏移、电流急剧下降。常见做法是用带调频功能的驱动电路,实际调试时一边看发射端电流一边微调频率,让电流达到最大点,这个点才是真正的谐振点。
一个实操经验:发射端电流不是越大越好。电流大意味着磁场强、耦合功率高,但线圈和电容的发热也会急剧上升。这道题充电时间只有几十秒,热积累不明显,但如果反复调试,线圈温度升起来之后电感会漂移,导致后续测量不准。我一般会在发射端串联一个电流采样电阻,实时监控电流,把频率锁定在让电流稳定的区间,而不是单纯追求峰值。
2.3 超级电容容量怎么定:从“跑完全程”倒推
超级电容的容量选型是答案里最值得抄的部分。很多队伍上来就问“是不是越大越好”,其实完全看行驶功耗。我把计算过程简化成三步:
第一步,估算电机平均功耗。车重1kg左右、带载500g、行驶速度1m/s左右的工况,直流减速电机的平均功耗大约在5W到8W之间。行驶距离如果按10米算(含往返),凑整下来约需15到30秒的行驶时间,总能耗大约120到240焦耳。
第二步,确定电容电压范围。电容可用能量是0.5×C×(V²max−V²min),其中Vmax是充电结束电压,典型值5.4V(两串2.7V超级电容),Vmin是升压电路能够正常工作的最低输入电压,常见取值3.2V到3.6V。低于这个值,升压芯片输出会跌落,电机转速明显下降。
第三步,解出C的最小值。以总能耗150J为例,Vmax=5.4V,Vmin=3.5V,算出来C最小约为7F,留20%余量选10F比较稳。答案里给的方案基本就是这条思路,只不过把升压电路的效率也加进去了,一般按90%算,那么电容容量还要再放大一成。
这里有个容易算错的点:超级电容的标称容量是单体值,两串之后总容量是减半的。比如两个10F/2.7V的电容串联,等效容量是5F,耐压是5.4V。很多队伍没换算,以为买了两个10F就拥有10F的容量,结果就是跑到一半电压掉到底,还没到终点就趴窝。
3. 硬件链路拆解:充电、升压、驱动和循迹的选型逻辑
3.1 接收端电路:从线圈到超级电容之间的整流与保护
接收端放在小车底盘上,零件就几样:接收线圈、整流桥(或同步整流MOS管)、充电限流电路、超级电容、升压电路。参考答案里的接收端用的是全桥整流加一个PMOS做防倒灌保护,逻辑是这样的:线圈感应出的交流电经过整流变成直流,直接给超级电容充电;当发射端断电时,PMOS的体二极管方向反向,电容不会反向回放电到线圈。
这个电路里最容易被忽略的是限流。发射端功率比较大的情况下,接收端如果不限流,充电电流可能冲到十几安培,不仅发热严重,还可能把整流桥和电容打穿。比较稳健的做法是加一个低阻值采样电阻,配合比较器做一个简单的恒流/恒压切换:初始阶段恒流充电,电压升到设定值之后切到恒压,电流自然回落。
参数上,我一般把充电截止电压设在5.4V,恒流段电流设为4A左右,对应一个10F电容从3.5V充到5.4V,所需时间大约是10×(5.4−3.5)/4=4.75秒,实际算上效率和电压上升带来的电流下降,8到10秒能完成充电,在题目限制的充电时间内非常从容。
有些答案用的是DCDC降压芯片做恒压充电,注意这种方案的适用条件是发射端功率预留足够。如果发射端输出能力有限,恒压模式会吃掉大部分电压,导致充电前期电流上不去,实际充电时间会明显拉长。我倾向于用分立元件做限流,虽然精度不如芯片方案,但在这种大电流短期充电场景里,可靠性反而更好。
3.2 升压电路:为什么不能直接把电容电压接电机
超级电容的电压会从5.4V一路跌到3.5V左右,而直流电机在低电压下转速掉得非常厉害,直接驱动会导致“后半程明显减速”。答案里的做法是加一个升压电路到稳定电压再给电机供电,一般是把3.5V到5.4V的输入稳定到5V或6V输出。
升压芯片选型上,常见的型号是TPS61088、FP6291这类低输入电压升压IC,但注意它们的最大输出电流和输入电流限制。以FP6291为例,典型升压到6V、输出电流1.5A时,输入电流接近2.8A,这要求前端超级电容的等效串阻(ESR)足够低,否则电压会被瞬间拉低,触发升压芯片的欠压保护。超级电容的ESR比普通电解电容低很多,这也是它适合这种大电流脉冲场景的原因之一。
实际调试中还发现一个和升压芯片软启动有关的问题:电容充满后第一次启动,升压电路输入端的浪涌电流非常大,如果PCB走线细,电容和芯片之间的寄生电阻会造成压降,导致芯片反复启动失败。解决办法是在升压输入端加一个小的铝电解电容(100µF到220µF),配合超级电容一起承担瞬时电流,同时加粗走线、铜箔加宽。
3.3 电机驱动与循迹方案:PWM频率和转向策略
电机驱动常见做法是TB6612或DRV8837这类小封装驱动芯片,PWM频率一般设15kHz到20kHz。这个频率区间有两个好处:一是超出人耳听觉范围,不会在测试时发出刺耳的啸叫;二是PWM开关损耗和电机电感纹波电流之间达到一个合理的折中。频率太高的话,驱动芯片的开关损耗会让芯片明显发烫,模块上的小散热片根本压不住。
循迹部分,答案里用的是两路灰度传感器,贴在车头下方,根据黑线和白地的反射差输出高低电平。控制逻辑很简单:左侧传感器压到黑线,说明车头往右偏了,要向左转,反之同理。新手容易犯的错误是只调比例参数,不调阈值。灰度传感器的阈值设定最好现场测一遍:把传感器分别放在白纸和黑胶带上方,记录两个值,取中间值作为比较阈值。这样做的好处是不受环境光线波动影响,能稳定跑完全程。
答案里还有一个小细节:转向时不是直接给电机反向电压,而是降低内侧轮PWM占空比,靠两侧轮速差实现差速转向。这种做法的好处是整车不会因为突然反转而打滑,尤其在带载状态下,急转很容易把电容的电量白白浪费在轮胎摩擦上。
3.4 代码框架:状态机比裸奔循环稳定十倍
小车控制代码看起来简单,但如果没有清晰的状态划分,调试时非常容易失控。参考答案用的是标准状态机,几个状态分别是:待机、充电中、启动、循迹行驶、停止。状态之间靠标志位切换,标志位由充电电压阈值、灰度传感器信号和计时器共同决定。
状态机的好处是能处理“充电还没结束但时间到了”这种边界情况:充电状态超时后会强制切到启动状态,避免小车一直停在起点、一分未得。很多队伍用裸循环写,只在main函数里顺序读传感器、驱动电机,结果遇到掉电重启或传感器误触发,整个流程全乱套。
状态机的核心C代码大概长这样:
typedef enum { STATE_IDLE, STATE_CHARGING, STATE_START, STATE_RUNNING, STATE_STOP } car_state_t; car_state_t state = STATE_IDLE; uint8_t charge_timeout_flag = 0; // 简单的非阻塞延时计数,主循环10ms扫描一次 void state_machine_run(void) { switch (state) { case STATE_IDLE: if (sensor_charge_complete()) { state = STATE_CHARGING; timer_start(TIMER_CHARGE_TIMEOUT); } break; case STATE_CHARGING: if (timer_check(TIMER_CHARGE_TIMEOUT)) { charge_timeout_flag = 1; } if (sensor_charge_full() || charge_timeout_flag) { state = STATE_START; motor_pwm_set(MOTOR_LEFT, PWM_START_LEFT); motor_pwm_set(MOTOR_RIGHT, PWM_START_RIGHT); timer_start(TIMER_RUN_STALL); } break; case STATE_RUNNING: // 循迹控制,左右灰度差决定PWM修正 if (!sensor_left() && sensor_right()) { motor_pwm_set(MOTOR_LEFT, PWM_BASE + PWM_CORRECT); } else if (sensor_left() && !sensor_right()) { motor_pwm_set(MOTOR_RIGHT, PWM_BASE + PWM_CORRECT); } if (timer_check(TIMER_RUN_STALL)) { state = STATE_STOP; } break; default: motor_pwm_set(MOTOR_LEFT, 0); motor_pwm_set(MOTOR_RIGHT, 0); state = STATE_IDLE; break; } }这套代码的逻辑说明:主循环每10ms调用一次state_machine_run,整个控制都在这一个函数里完成。TIMER_CHARGE_TIMEOUT是充电超时保护,防止传感器坏了导致小车永远停在起点;TIMER_RUN_STALL是行驶超时保护,防止循迹失败后小车原地打转耗电。sensor_left和sensor_right是灰度传感器的读取函数,返回1表示压到黑线。PWM_BASE是基础占空比,PWM_CORRECT是转向修正量,这两个值在调试时单独调整,互不干扰。
参数说明:PWM_BASE一般取电机额定电压下能维持目标速度的占空比,比如6V供电、15kHzPWM时,50%到60%占空比对应约1m/s的速度。PWM_CORRECT取10%到20%,太大转弯会甩尾,太小则压线后不能及时回正。TIMER_CHARGE_TIMEOUT按题目充电时间上限设置,TIMER_RUN_STALL按最长行驶时间加2秒设置,除非小车卡死,否则不会触发。
4. 竞赛场地调试:五个高频翻车点排查
这道题的坑不在电路原理多深,而在现场环境带来的各种“玄学”问题。我把历年队伍最容易翻车的地方整理成五条,每一条都是实际发生过的。
4.1 充电中断后小车不启动:电容电压保持不住
现象:充电时电压正常升到5V以上,断开发射端电源后,升压电路输出瞬间掉零,小车趴窝。
原因:超级电容的自放电率虽然低,但断开瞬间如果升压电路输入端没有足够的储能电容,“最后几毫秒”的保持电压会快速跌落,触发升压芯片的欠压锁定(UVLO)。另外,很多升压芯片在输入电压刚超过阈值时启动电流很大,输入端没有支撑电容,电压会瞬间塌陷到阈值以下,芯片反复尝试启动失败。
解决:在升压电路输入端并联220µF铝电解电容,位置尽量贴近升压芯片引脚;同时检查UVLO阈值分压电阻,把阈值降低0.2V到0.3V,给启动留出余量。
4.2 充了老半天电却跑不远:充电截止电压偏低
现象:充电指示灯亮、电压显示5.0V左右,但小车跑出去两三米就没电了。
原因:很多队伍的“充电截止”设置成恒压模式掉电流即停止,但恒压阶段后期充电电流已经很小,此时电容实际只充到设定电压的90%。以10F电容为例,5.4V和5.0V之间的可用能量差大约17%,对行驶距离就是硬生生少了两三米。
解决:把截止电压提高到5.4V,同时延长恒压充电的驻留时间,看到充电电流降到0.2A以下再判定充满。另外检查发射端和接收端线圈的间隙,距离拉大1mm,耦合系数会下降不少,充电速度肉眼可见地变慢。
4.3 跑偏严重,明明循迹传感器都正常:转向修正相位反了
现象:小车在直线段正常,一到弯道就朝反方向冲出去,完全不听传感器指挥。
原因:灰度传感器的安装位置装反了,或者左右传感器信号在代码里接反了。这种问题在demo代码里非常常见,因为原作者习惯从左往右定义传感器ID,而实际接线可能从右往左。
解决:做一次开环测试。把小车架起来,手动挡左侧传感器,观察电机的实际转向是否和预设一致。这个方法能十分钟内定位问题,比反复调差速值靠谱得多。我在调这类小车时,永远先做“挡传感器看转向”这一步,调试速度快的队伍都是这么干的。
4.4 充电时发射端电流爆高但小车不跑:谐振频率偏了
现象:发射端电流明显很大,甚至线圈发烫,但接收端输出电压很低,充电极慢。
原因:发射端频率和接收端谐振频率不一致。发射端驱动频率是固定的,接收端的线圈电感因为温度或耦合位置变化导致谐振点偏移,接收到的能量大幅下降。发射端电流大说明发射线圈自身损耗大,并不等于接收端拿到了能量。
解决:用示波器同时测发射端驱动波形和接收端整流后的电压波形,调整驱动频率往接收端谐振点靠。如果没有示波器,可以在接收端加一个峰值检波电路,用万用表看检波电压,微调频率直到读数最大。
4.5 启动瞬间重启,跑一半断电:PWM占空比加得太猛
现象:充电结束后小车刚起步,升压电路输出电压正常,但跑出两米后突然断电重启,之后又恢复正常,反复出现。
原因:起步时PWM占空比瞬间拉满,电机堵转电流很大,升压电路输出端电压被拉低,控制板检测到掉电后复位。复位后PWM归零,电机恢复空转,电流下降,系统又恢复正常,所以看起来是“跑一半断电”。
解决:软件上做软启动,PWM占空比在200ms内从0线性增加到目标值。我一般这么做:先占空比到30%维持50ms,再每秒增加10%到目标占空比。同时检查电机堵转保护,正常行驶中如果遇到障碍物堵转超过500ms,直接切到停止状态而不是反复重启。这个细节在带载跑坡道时非常关键,堵转电流能比正常电流高出三倍。
5. 复现验收技巧:用数据说话,别靠感觉调车
5.1 做一个5分钟快速体检表,每次改完都跑一遍
调试阶段最怕的是“调了参数但不知道是好是坏”。我习惯把验收流程固定成一张自查表,每次改软件或硬件之后全部跑一遍,不跳项。
自查表内容分四块:一是充电段,记录从充电开始到充满的总时间、截止电压;二是起步段,记录从状态切到启动到车速稳定的时间,以及这一瞬间母线电压跌落幅度;三是行驶段,记录完整跑完一圈的时间、中途最低电压、是否有明显降速点;四是停止段,记录刹车距离和余电电压。这张表跑三次取平均值,每次改完对比数据,而不是凭“感觉快了”来判断。
表格里最关键的是“中途最低电压”这一行。如果最低电压低于升压芯片的最低工作电压,说明电容容量不够或者升压效率偏低;如果最低电压在行驶前段就出现,说明起步时电流分配不合理;如果最低电压出现在后半程,则可能是电容容量偏小或者行驶阻力变大。每个现象对应的整改方向完全不同,有数据才能精准定位。
5.2 效率实测:从发射端输入到电机输出的完整链路
这道题看起来是“调小车”,实际上是“调能量效率”。我复现答案时会特意在三个点测数据:发射端直流输入电压和电流、超级电容充到截止电压时的总容量、以及升压输出端在行驶过程中的平均电压和电流。三个数据一除,整条无线充电链路的总效率就出来了。
常见效率分布是:线圈耦合效率70%到85%,整流+限流电路效率90%到95%,升压效率85%到92%,电机驱动效率80%到90%,乘完差不多45%到60%。如果实测总效率低于40%,就说明某个环节损耗异常偏大,逐段排查比盲目加大发射端功率更有效。很多队伍在发射端加大电流,结果只是让线圈更烫,总效率反而更低。
参数上我建议预留一个“电表测试点”:在超级电容正极串联一个0.05Ω采样电阻,用示波器测电压波形再换算电流。这里的采样电阻不能用普通色环电阻,温漂太大,需要用锰铜电阻或者康铜丝,读数才稳定。
5.3 带载测试的边界:电量余量至少留20%
最后说一个容易被忽视的边界问题:全程测试和正式验收之间,环境条件会变。地面摩擦系数、轮胎气压、电池余量都会影响实际表现。我做完一版方案后,会强制带载测试三遍,并且模拟“充电时间缩短20%”和“行驶距离增加20%”两种极限工况,确保即使在最不利条件下小车也能完成全程。
从那以后,我每次调这类无线充电小车,都强制走一遍“充电时间实测→行驶功耗实测→总效率实测”这三步流程,不再凭指示灯判断好坏。数据齐了,翻车的概率会小很多。如果你准备备赛,建议先把能量预算算清楚,再动手焊电路,这样至少不会出现“做完才发现电容选小了”的尴尬。希望帮到你。
本文还有配套的精品资源,点击获取