拓冰建站拓冰建站
首页 / 资讯中心 / 正文

电子设计竞赛单片机方案:从选型到现场调试的完整实践链路

广东赛区G题拿了省一这套单片机方案最值钱的不是某块开发板也不是哪段炫技代码而是从题目拆解、芯片选型、软件架构到现场演示的一整条“不翻车”链路。很多队伍功能都做出来了最后败在调参效率低、现场硬件不稳定、答辩讲不清决策过程。这篇就把我们的单片机方案完整拆开按实际备赛顺序写一遍适合正在准备电子设计竞赛、单片机课设或毕业设计的人参考。不管你用51、STM32还是国产M0内核核心思路都一样先想清楚题目要什么再决定硬件和代码长什么样。1. 先看清G题的“题眼”再决定单片机方案1.1 G题和传统课设题最大的区别单片机课程设计通常给你两周时间功能表列得明明白白做完截图交报告。竞赛G题完全不是这个节奏。从拿到题目到封闭测试时间被压缩到几天甚至一天多而且现场要实际演示、现场调参、现场回答评委提问。这意味着什么意味着你根本没有机会慢慢试错方案一开始就必须是“能稳定跑完比赛”的形态而不是“理论上能实现所有功能”的形态。我自己见过很多队伍用STM32堆了一堆外设功能全驱动起来了但到了现场发现某个传感器漂移、某个按键误触发、显示偶尔花屏时间全花在查问题上。反观拿奖的队伍功能不一定最多但每个模块都是“验证过边界”的。G题和课设题的第二个区别是验收方式。课设老师主要看你交的东西对不对竞赛评委看的是你“怎么实现、为什么这样实现、现场能不能撑住”。所以方案不能只追求能跑还要能解释、能复现、能快速降级。1.2 方案设计要从“现场演示”倒推拿到G题后第一件事不是画原理图而是想象比赛当天的场景桌子多宽、供电是不是稳定、评委会不会突然碰一下板子、演示时间是几分钟、有没有二次抽测题目参数。我一般把题目要求拆成三类先做个表格贴在电脑旁边分级定义例子投入策略必须项不实现就没分基本控制、显示、指定信号处理优先做做稳做冗余加分项题目里可能有开放空间精度提升、友好交互、上位机显示排第二不挤占必须项时间风险项可能与现场条件冲突依赖特定供电、特定传感器型号提前准备替代方案或降级逻辑这个表格看起来简单实际作用很大。很多队伍不是能力不够而是把时间花在了“好像能加分”的选项上最后必须项反而没有充分验证。G题省一和二等奖之间的差距经常不在功能多少而在必须项有没有在极限条件下仍然稳定。1.3 先列接口清单再选单片机型号常有人一上来就问“G题用51行不行”“STM32是不是更好”。这个问题没有标准答案要看题目到底需要哪些外设。我建议先把下面这张清单拉出来GPIO口按键、LED、蜂鸣器、继电器、方向信号占多少个。定时器测速、PWM舵机、PWM电机、输入捕获、红外解码占几个通道。ADC通道电位器、温度、光敏、电流采样、电池电压占几个。通信接口UART、I2C、SPI、单总线分别接什么传感器。显示LCD1602、OLED、数码管还是TFT彩屏数据线占多少IO。外部中断编码器、按键、流量计这些需要立刻响应的事件有几个。把清单拉完之后芯片型号基本就固定了。如果只是温度上下限报警、LCD1602显示、舵机控制、测速这类基础功能51单片机完全够用如果涉及多路ADC、复杂通信协议、浮点运算或者要刷屏那再用STM32或更强内核的芯片。2. 单片机选型不是越贵越好关键是够用、好调、好换2.1 51还是STM32取决于系统复杂度G题里大量题目用51都能做。51单片机定时器计数器的基本功、中断优先级、GPIO直接操作在简单控制场景里非常实用。比如做一个电子时钟、电磁炉功能模拟、温度上下限报警51加上LCD1602和几个按键就能完成。它的优点是资料多、好查、寄存器透明赛前临时改逻辑也容易。STM32的优势在于外设丰富和性能余量。像输入捕获的FIFO深度、多路PWM输出、DMA搬运数据、硬件I2C/SPI这些在复杂系统里能省非常多CPU时间。G题如果涉及信号采集、通信协议、电机闭环控制这类任务用STM32是更稳的选择。我实际更看重的一点是“好换”。比赛现场最怕某个型号下载器出问题、芯片锁死或者引脚定义记错。选型时尽量选自己最熟的板子而不是追求性能最强。江科大的STM32笔记、正点原子或野火的例程哪个你手边资料多就用哪个不要现场学新框架。2.2 硬件设计不追求一步到位模块化最稳很多人觉得硬件设计就是画一块完整PCB。竞赛现场最稳的反而是“最小系统板模块化外设”。原因很简单坏了换模块不换整板。供电方面如果系统里有舵机、电机、继电器一定要把功率电和逻辑电分开共地但不要共用一条长线。MOS管驱动感性负载时要加续流二极管IO口保护二极管该加就加。单片机IO口推挽输出被灌电流、反电动势打坏这类硬件故障在比赛现场非常常见而且很难排查。前期用模块化连接至少能把问题定位到单块板子上。还有一个容易忽略的点是下载接口。部分51芯片使用IAP方式下载或者需要冷启动时序。如果现场频繁出现“下载失败”排查顺序是驱动有没有装、串口号换没换、芯片是否被程序锁住、下载器是否接触良好、板子是否在上电状态下短路过。2.3 最小系统验证比花哨功能更重要不管用哪块板子我都建议先做一次“最小系统验证”只点一个LED、读一次按键、用一个定时器翻转IO。不是为了学语法而是确认三件事编译器、下载器、芯片三者能正常通信。时钟初始化正常系统频率和延时一致。调试器能看到变量或引脚电平变化比如Keil5里面监控一个引脚的高低电平。这一步看着简单却能把后期80%的环境问题挡在门外。有人跳过了这个直接在Proteus里仿真结果实物下载后灯不亮、晶振不起振、串口乱码到最后都不知道是代码问题还是硬件问题。仿真器只能验证逻辑验证不了实物的电源、接触、电平匹配。3. 软件架构直接决定现场改参效率3.1 主循环定时器轮询不要盲目上RTOSG题备赛阶段很多队伍一听“多个任务同时运行”就想到RTOS、想到FreeRTOS。但题目里大多数场景用“主循环定时器标志”就够了。核心思路是这样的主循环一直轮询各种标志位定时器中断负责计时和置标志按键扫描放在固定时间片内显示刷新单独控制频率传感器采样按不同周期执行。这样51单片机也能很流畅地同时管理按键、显示、采集和输出。STM32如果用HAL库可以直接在定时器回调里翻转标志。有些同学问“单片机怎么同时运行多个任务”其实就是分时轮询加上状态机。比RTOS更直接也不会因为任务切换带来优先级问题。你真正需要的是一个调度结构而不是一个操作系统。3.2 主程序和子程序要有清晰的权限边界G题调试时最容易出现的问题是按键功能写进中断里、延时函数写太长、一个模块的初始化代码到处乱调用。表面上都能跑但现场改参数时一改一个错。我最后整理代码时坚持几条规定每个硬件模块对应一个文件比如key.c、lcd1602.c、sensor.c。中断服务函数里只做标志位置位和简单读取不处理业务逻辑。延时只在主循环或特定子程序里使用不在中断里做长时间延时。主程序只负责流程调度不直接操作底层寄存器。这样做的原因是比赛现场你根本来不及读完整份代码只能通过文件定位问题。如果某次按键没响应先看按键扫描函数是否被阻塞如果显示卡住先看显示刷新是否和延时冲突。3.3 把阈值、系数、目标值全部做成变量这一条几乎是最重要的现场应急手段。G题现场很可能要求修改某个设定值比如温度报警上限、目标转速、PWM占空比。如果这些数值被写死在源码里每次都要重新编译下载不仅慢而且容易出错。更稳的做法是用按键配合LCD1602或OLED做菜单式参数修改。参数掉电存储到单片机内部Flash或AT24C02。如果时间不够至少也要在代码顶部用#define或全局变量集中管理所有阈值。另外要提醒一点串口调试非常有用。如果现场允许连接电脑或者能通过蓝牙/WiFi模块传到手机就把关键中间量打印出来。否则盲调参数效率极低。别小看这个很多队伍现场“看不到内部状态”只能靠猜。4. 关键模块的调试顺序和验收标准4.1 先点灯、再点亮外设最后才联调很多人拿到新模块第一步就写完整驱动结果出了问题不知道是硬件、接线、时序还是逻辑。我习惯的做法是每个模块单独验证验证通过才算“集成完成”。以外设为例顺序大概是LED、按键、蜂鸣器确认最小系统正常。定时器、PWM、外部中断确认时间基准正确。LCD1602或OLED确认显示驱动时序看初始化后是否出现方块或黑屏。ADC、传感器确认数据在合理范围变化。舵机、电机、继电器确认驱动能力和电源稳定性。最后再把这些模块拼到主循环里。每个模块都定一个“验收标准”比如LCD1602能稳定显示两行、按键去抖后不误触发、PWM频率稳定、温度采样值与万用表偏差在1度以内。联调时如果出问题就可以直接锁定是数据流冲突还是时序冲突而不是重新排查整个电路。4.2 传感器数据的稳定性比精度更重要竞赛现场环境一般不会太理想。实验室里很准的温度传感器、测速编码器可能因为现场供电纹波、长导线干扰、附近电机启停导致数值跳动很大。这时候如果直接用原始值去判断、去控制系统会非常不稳定。滤波这块我建议按数据特性选择温度、光强这类慢变量用多次采样取平均或去极值平均。测速脉冲、编码器计数用定时器闸门法累计脉冲再换算转速。触摸按键或电容感应用阈值加连续确认避免单次抖动触发。滤波不是越复杂越好。滑动平均在51上也很容易实现但要注意数组长度和采样周期匹配。只要保证“数据在目标区间内平滑、不误触发、响应不过慢”就是合格。4.3 执行机构和闭环控制的调参思路G题如果包含舵机、电机、追光、小车测速这类执行机构那闭环控制是绕不开的。最基础的PID一定要准备一套能用的框架至少位置式和增量式二选一。调参时不要一上来就改大比例项那样系统非常容易振荡。我调PID的顺序通常是这样只加比例项从小到大加观察系统是否响应快速但不会持续振荡。如果存在稳态误差再加积分项。如果超调明显再加微分项。每次改参数只改一个变量记录现象。注意51单片机做浮点PID也可以但运算速度会慢一些。能用定点数就定点数或者把目标值控制在合理范围。STM32可以用FPU但如果开了浮点也要确认编译选项和启动文件否则可能出现计算错误。4.4 显示和外设时序LCD1602、OLED的坑LCD1602和OLED大概是竞赛里最常用的显示器件。这两个模块本身的时序并不难难在和其他模块共用总线或共用延时。LCD1602最常见的问题是初始化时序不对导致屏幕无显示或只显示一行方块。排查顺序是查硬件地址和对比度电位器查初始化延时查忙标志是否等待查数据位接线是否正确。注意LCD1602的Enable信号宽度、命令和数据类型选择信号切换顺序都有严格要求。使用I2C转接板时地址写错也是新手高频问题。OLED用I2C时要小心总线上其他设备的地址冲突。如果有多个I2C设备建议给每个设备加地址确认。STM32硬件I2C有时会出现Busy标志卡死可以尝试软件模拟I2C或者复位外设。5. 效果展示怎么整理才像“实际做过”而不是“背稿子”5.1 效果展示不是只拍一段运行视频比赛评审通常分为作品演示和答辩答辩。很多队伍拍一段视频把功能从头到尾演一遍然后就结束了。这种方式评分不会高因为评委看不出你的系统边界、稳定性、可维护性。我建议把演示脚本拆成三部分标准流程按题目要求把功能完整做一遍展示正常结果。边界测试比如温度超过上限蜂鸣器报警参数修改后不重启立即生效断电重新上电后参数保持。异常处理如果现场出现数据异常、按键误触系统如何恢复。一个能现场控制参数的菜单界面比一段花哨动画更能体现工程能力。因为直接说明你的软件架构是“可配置”的而不是写死的。5.2 用数据和日志证明“达到了指标”演示时尽量有可量化证据。比如小车测速可以用串口打印或屏幕显示当前转速和目标转速温度上下限报警显示实时温度和阈值追光舵机显示光敏传感器电压值和舵机角度。这些数据比“效果不错”更有说服力。如果条件允许提前记录几组典型测试数据做成表格或截图。答辩时直接告诉评委在某个条件下误差是百分之几响应时间是几秒。即使不是特别精确也说明你真的测过。很多队伍只展示了“能亮”和“能动”没有展示“能稳”。而评委最关心的恰恰是稳定性和重复性。一个演示做三遍都能成功比一个演示做得惊艳但只能跑一次分数高得多。5.3 答辩时重点讲“方案为什么这么做”答辩环节是拉分的关键。评委通常不会问“你用了什么芯片”这种送分题他们更关心为什么选这个单片机不选另一个为什么用定时器中断而不是死循环延时这个滤波算法为什么适合这个传感器如果现场环境变化系统的哪个参数会影响结果哪个模块最容易坏你有没有备份方案回答这些问题时不要按开发过程流水账讲。应该讲决策过程比如“因为A方案有XX风险B方案在实验中发现XX问题最后选择C”。如果一个问题确实没考虑到也不要硬编就直接说“这个点我们在测试中发现过处理方式是……”。现场应变比背稿子更有价值。6. 现场常见的故障和兜底策略6.1 按“先硬件后软件、先电源后信号、先现象后代码”排查比赛现场的高压环境一报错就容易慌。我给自己定了一条强制排查顺序每次按顺序走不跳步看现象是没反应、反应错误、反应不稳定还是偶发死机查电源板子供电电压是否正常电机或舵机启动时会不会把电压拉低。查接线杜邦线是否松动共地是否可靠信号线是否过长。查下载程序是否成功写入芯片是否被锁死。查代码先看主循环结构再看中断再看外设配置。查参数现场条件是否超出了程序预设范围。这条顺序看起来很基础但非常有效。很多时候“按键没反应”最后查出来是GND线路接触不良“显示花屏”是供电电压在被电机拉低后瞬间超过上限“数据不对”是通道配置错误或者信号线接到了相邻引脚。6.2 比赛现场最怕的几类问题第一类下载失败。提前准备好备用下载器、备用USB线、重新插拔的顺序以及芯片解锁工具。千万别现场装驱动。第二类供电不稳。比赛现场通常提供开关电源或USB供电但大功率执行机构一启动就会让电压波动。我建议所有逻辑电路用稳压芯片独立供电不要和电机共用一个电源出口。第三类传感器漂移。大多数传感器上电前几分钟会有温漂或自热现象。如果系统对绝对精度有要求提前预热至少5分钟再开始测试。现场演示前不要频繁断电。第四类程序跑飞或死机。这种情况最容易被误判为“硬件坏了”。如果用了看门狗要确认喂狗位置合理如果没有看门狗可以在主循环里加一个恢复机制比如连续按键超时复位、异常标志触发复位。第五类按键抖动。现场环境电磁噪声大机械按键更容易误触。软件里一定做消抖最好做“按下确认松开确认”双向判断。6.3 准备一套“紧急模式”有些问题没办法现场彻底修复这时候需要一套快速降级策略准备一组“出厂默认参数”一键恢复。把关键功能改成手动控制比如自动PID失效时切到开环PWM。用短接线或拨码开关切换传感器通道。提前烧录一个“最小系统测试程序”用于排查硬件是否正常。我通常会在比赛前一天烧录一个专门的诊断程序按键显示键值、ADC显示电压、定时器显示频率、LED全亮全灭。现场如果系统异常先烧这个程序快速判断是硬件问题还是业务代码问题。这样做虽然会多花几分钟但比瞎猜快得多。7. 从省赛到国赛真正沉淀下来的是什么7.1 省一不是终点而是代码和硬件资产化的起点省一带给你的不只是奖项更是一套经过实战验证的软硬件模板。比赛结束后建议把代码按模块重新整理一遍把注释补全把参数表贴到代码头部。这不仅是给老师或学弟学妹看更是为后续做更复杂的项目做准备。比如你在G题里写的定时器调度框架、按键菜单、LCD显示驱动、PID控制器、传感器滤波这些模块到国赛或者毕业设计中都能复用。不要比赛一结束就把工程删掉那才是最可惜的浪费。7.2 可复用资产清单建议赛后整理这几个东西硬件核心板型号、外设模块连接表、供电方案、原理图或接线图。代码每个模块单独一个文件夹包含驱动、示例、注释。调试记录什么问题怎么排查最终怎么解决。演示脚本和答辩问题清单下次比赛直接在这个基础上迭代。这些资产的价值会随着时间递增。越到后面你越会发现很多看似复杂的项目不过是以前模块的组合。7.3 给备赛者的几个实际建议第一别在赛前临时换主控型号。如果你一直用STM32就不要因为听说“51简单”而临时切到51如果你一直用51也不要因为“STM32功能强”而冒险换平台。现场最熟悉的东西才是最快能跑通的东西。第二一定留足时间做联调和演示预演。代码功能全部写完只算完成一半另一半是连续跑30分钟看稳定性、断电重新上电看恢复能力、参数改来改去看会不会崩溃。竞赛现场最不缺的就是“功能没跑完”的队伍缺的是“功能跑完还能反复演示”的稳定系统。第三学会记录。每改一次参数记下时间、现象、结果。这不但帮你找到最佳参数也为答辩提供了真实数据。很多队伍现场凭感觉调参调完就忘最后自己也说不清哪个值最合理。第四队友分工要清楚。硬件、软件、文档答辩分别由谁负责比赛前一天统一检查。G题不是单打独斗的题目现场出现问题时有人查硬件、有人改代码、有人准备备用板效率差距很大。第五如果题目允许尽量做一个简单的人机交互界面。按键、菜单、显示当前状态这种看起来很“普通”的细节在评委眼里恰恰代表系统“可配置、可维护、可扩展”。真正到了比赛现场比的并不是谁更聪明而是谁在有限时间里把系统做得更稳、更可调、更经得起反复验证。把环境搭好把基础模块调稳把参数做成可配置把演示流程提前走三遍这套单片机方案就很难出大问题。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门