简介:电赛常用模块是一份面向电子竞赛参赛者的实用笔记,系统梳理了电源、最小系统、键盘、液晶显示、AD/DA转换、传感器、集成运放、可编程逻辑、电机、继电器及信号处理等常用硬件模块的选型与搭配要点,同时覆盖LCD显示、键盘输入、AD数据处理、电机控制、PWM输出、延时计时、寻迹避障算法及无线通信等必备软件程序。资源为1个doc文档,压缩包仅38KB,便于快速查阅。内容以工程实战视角整理,例如推荐RPR220寻迹光耦、A04E霍尔传感器、LM339/LM393比较器、L298/L297驱动等具体器件,并强调控制类题目中驱动模块、传感器模块、显示反馈与键盘输入的搭配思路,帮助参赛者建立系统备赛框架。目前已有3076人学习下载,适合需要集中梳理电赛知识点、快速定位硬件模块和程序模板的备赛人群。
1. 电赛备赛先从模块清单开始:把常用件变成肌肉记忆
电赛备赛这件事,很多人的误区是拼命刷往年题、找大佬要方案,结果真正进实验室一动手,发现手边连一个能调通的比较器模块都没有。我自己的经验是:备赛的第一优先级永远是“常用模块的储备与验证”,而不是某个具体算法的推导。电源、最小系统、键盘显示、传感器、驱动、信号调理、电机控制,这七类东西如果都能做到“随手拿来就能用”,比赛现场你才有资格谈方案选型。这篇就把电赛常用模块的硬件清单、程序储备和踩坑记录全拆开讲,照着清单备一遍,至少能让你在比赛开局少消耗半天去现场焊模块。
2. 常用硬件模块怎么搭:从电源到驱动的全套清单
2.1 先解决电源:12V、9V、5V、3.3V 与负压
电源是所有模块的基础,也是最容易被低估的一块。凡是做过带电机题目的都明白,电机一启动,示波器上能看见整个板子的电压往下掉,主控复位都算常见。所以电源模块我一般分成两套来做:一套是外部直流供电的直接稳压,另一套是电池供电的升压/降压组合。
电源模块里最常用的是 12V、9V、5V、3.3V 这四档电压。12V 一般给电机驱动和继电器,9V 某些传感器或运放供电,5V 给单片机逻辑和多数数字传感器,3.3V 则是现在越来越常见的供电。如果是电池供电,先算清楚系统总电流,再决定升压块怎么做。比如锂电池 7.4V 供电,你要稳定输出 12V 给驱动模块,那就要准备升压模块,注意升压模块的纹波在电机负载下会明显变大,输出端要加电容。
这里有个容易翻车的点:负电压。很多运放和比较器电路要双电源供电,如果不提前准备,现场只能干瞪眼。LM337 是经典的负压可调稳压器,配合正压的 78 系列或 LM317,就能搭出正负对称的电源。我自己是直接把一块“正负 5V 可调电源”的小板子做成标准件,需要时直接跳线进系统。
电源部分的具体做法,我习惯按负载去分层:
| 电压 | 典型用途 | 建议储备方式 |
|---|---|---|
| 12V | 电机驱动、继电器、部分传感器 | 稳压模块或升压模块 |
| 9V | 运放、比较器、个别传感器 | 稳压模块 |
| 5V | 单片机、逻辑电路、多数数字传感器 | 稳压模块,电流要大 |
| 3.3V | 新主控、LCD、存储 | LDO 或降压模块 |
| 负压 | 双电源运放电路 | LM337 可调负压模块 |
2.2 最小系统、I/O 扩展与电机驱动
最小系统板要准备至少一块“独立于大板”的,别把单片机焊死在某个功能板上。比赛题目和平时练习的最大差异是:你永远不知道今年要用多少 I/O。传感器、键盘、显示、电机编码器一接,单片机的 IO 可能就不够。所以我习惯准备一块带 CPLD 的扩展板,或者至少准备 74HC595 做串转并、CD4052 做模拟开关这类扩展芯片。原文里那句话说得特别实在:如果题目允许,干脆直接上 CPLD,逻辑扩展和电平转换一起解决。
驱动模块是控制类的核心硬件之一。电机驱动首选 L298,双 H 桥、电流余量足,新手拿它入门最稳。步进电机可以考虑加一片 L297,它和 L298 配合能省掉大量步进时序逻辑,电路也简洁。继电器驱动我一般用 ULN2803 或 ULN2003 达林顿管阵列,一个芯片能带 8 路,逻辑电平输入、直接驱动继电器,属于每块备赛板必备件。
这块的实际操作顺序是:先把 L298 和最小系统之间的逻辑关系画明白(方向脚、PWM 使能脚、地线共地),再焊板。最容易出的问题是“控制板地和驱动板地没共地”,导致 PWM 信号电平漂移,电机嗡嗡响但不转。所以驱动模块的接线我都是固定色标,地线永远黑色粗线先接。
2.3 显示、键盘与反馈器件
显示模块看着简单,但很多人只备了 LCD 就以为够了。色字:齐备显示方案应该是 LCD、数码管、LED、蜂鸣器全都有。LCD 给调试信息,数码管给关键数据的现场显示,LED 和蜂鸣器给状态反馈。为什么蜂鸣器也算“显示”?因为比赛现场环境嘈杂,人不可能一直盯着屏幕看。风之:算法跑到平衡点时,让蜂鸣器叫一声,所有人都知道它的状态——这是一种反馈设计,不是简单的发声。我在控制类小车题里就是这么干的,摄像头识别到目标后蜂鸣器响,裁判和队员都能直接感知当前状态。
键盘模块是另一面,有输出就要有输入。矩阵键盘、独立按键、拨码开关都备着,程序上写好扫描函数查表那种稳定的消抖版本。LCD 和键盘的程序不用现场写,第 4 章会详细展开。
3. 传感器与信号调理:控制类题目拉开差距的地方
3.1 按“探测对象”把传感器过一遍
控制类题目几乎离不开小车和物理量测量,所以传感器储备要尽量按探测对象来配,而不是按型号来配。
寻迹用光耦,我比较常用 RPR220。它做黑线检测可靠,但要注意的是它对环境光的敏感度,遮光罩要留好。霍尔传感器 A04E 配合磁钢可以做测速和位置检测,装的时候注意磁钢极性和气隙距离,装歪了就输出毛刺。光电槽和码盘做测速是经典方案,码盘的光栅密度决定测速分辨率,想要低速测准可以准备不同密度的码盘。避障用光电开关,探测距离可以选择可调的,也可以自己用比较器搭阈值。趋光用光敏电阻或光敏二极管,别指望它线性好,用它做“有没有光、光在哪边”的判据就行。
还有个容易被忽视的点:接近开关,探测金属物体很好用,当年玩过的题目里出现过;再比如超声波模块做测距,老模块 HC-SR04 精度和稳定性都够用,但注意超声波的波束角,反射面不平整时会跳变。角度传感器在控制题里极其好用,唯一的缺点是贵,所以我建议用加速度计加陀螺估算角度,或者直接用编码器和机械结构做间接角度测量。
常用的传感器对应关系表:
| 传感器 | 探测对象 | 输出类型 | 注意事项 |
|---|---|---|---|
| RPR220 光耦 | 黑线/反射面 | 电流/电压 | 加比较器整形,遮环境光 |
| A04E 霍尔 + 磁钢 | 磁场 | 开关量 | 注意磁钢极性和安装间隙 |
| 光电槽 + 码盘 | 转速 | 脉冲 | 码盘密度影响分辨率 |
| 光电开关 | 障碍物 | 开关量 | 阈值可调,防误触发 |
| 超声波模块 | 距离 | 脉宽/串口 | 波束角与反射面影响大 |
| 接近开关 | 金属物体 | 开关量 | 检测距离有限 |
3.2 比较器与运放:让信号变成单片机认识的形状
很多传感器直接接单片机是没法稳定读取的。最典型的问题就是光耦:大家都希望它输出干净的开关量,但实际用的时候,反射面反光强度不同、距离漂移,输出可能是一会儿高一会儿低,或者卡在中间电平。这时候别指望软件去反复采样判断,正确做法是加比较器整形成开关量。LM339 和 LM393 都可以,LM339 是四路比较器,预留的裕量更大;LM393 是双路比较器,适合空间有限的板子。通过一个电位器调节比较阈值,光耦的输出在过阈值的一瞬间跳变,这才是单片机认识的数字信号。
另一类常见需求是信号放大。有些传感器输出的是毫伏级别的信号,比如某些压力应变片桥路、湿度传感器,直接进 AD 连分辨率的边都摸不到。这时候还要备几块运放芯片,TL082、TL084 这类 JFET 输入运放,输入阻抗高、噪声低,做同相放大或差分放大都顺手。TL082 是双运放、TL084 是四运放,按板子的空间选。
信号调理的整体思路可以概括成三步:传感器输出原始信号,先经过比较器或运放变成干净的模拟/数字量,再进单片机的数字 IO 或 AD 口。别让单片机直接“啃”毛糙信号,这是很多翻车现场的开端。
从常见设计习惯来看,我一般会在每块传感器小板子上预留三个点的焊盘:输入、阈值调节、输出。输出直接做成 “数字/模拟”二选一,通过跳线切换。这样一块板子既能输出开关量,也能输出模拟量,进 AD 还是进 IO 都灵活。
3.3 AD/DA 与数据链路
控制类题目里 DA 出现的频率并不高,历届比赛里真正需要输出模拟电压的场景不多,但 AD 是高频模块。角度传感器进来的电压信号、电位器位置信号、以及某些模拟传感器,都要通过 AD 转换成数字量。所以板子上至少要有一条稳定的 AD 采集链路。
AD 采集的坑主要有两个:一是参考电压不干净,二是采集时序不稳。参考电压建议单独用基准源芯片,不要直接拿电源 VCC 当参考,电机一转 VCC 波动,采集值跟着抖。时序方面,SPI 传输是常用的稳定做法,AD 芯片通过 SPI 与单片机通信,注意片选信号的时序,SCK 频率不要拉太高,数据手册给的典型值比极限值保险得多。以下是一个采集链路的基本骨架(示意写法,不同芯片寄存器不同):
unsigned int read_adc(unsigned char channel) { // 选择通道,启动转换 unsigned int result = 0; CS_LOW(); // 片选拉低,选中 AD 芯片 spi_send(channel_command); // 发送通道选择指令 while (EOC == 1); // 等待转换结束标志 result = spi_receive(); // 读回 12 位转换结果 result |= spi_receive() << 8; CS_HIGH(); // 释放片选 return result; }这段逻辑的含义:先拉低片选,发送通道地址,然后死等转换完成,再通过 SPI 读回数据。实际芯片的操作位数和命令格式要查数据手册,但这个“选通—等待—读取—释放”的框架是通用的。只要每读一批数据前强制给一次 CS 拉低拉高的完整时序,基本就不会遇到数据错位的问题。
4. 软件与算法储备:把常用程序写成可复用的库
4.1 LCD 显示、键盘输入与 SPI 传输程序
比赛时不写新程序是不可能的,但你可以做到让“常用程序”完全不占现场时间。LCD 显示程序、键盘输入程序,这是每个控制类作品的标配。LCD 程序建议封装成两层:底层是写指令和写数据的函数,上层是居中显示字符串、显示数字、显示小数点的函数。现场只调用上层函数,翻车概率会小很多。
键盘方面我遇到过很典型的毛病:矩阵键盘扫描时不做消抖,按键一次触发两次,甚至长按导致状态机乱跳。软件消抖用延时或定时器扫描都可以,重要的是“松开检测”,不然按一次会识别成多次触发。按键状态机就两种:按下有效、松开复位,别在中断里做复杂逻辑,不然主程序一卡键就失灵。
AD/DA 的 SPI 传输程序要单独写好,包括 SPI 初始化、片选控制、读写字节。调试的时候先拿固定波形或电位器测试 AD 读回值的稳定性。SPI 的坑是主机和从机的相位极性问题,极性和相位配置相反时读出的数据全是 0xFF 或 0x00,且毫无规律。
4.2 电机控制:从“会转”到“走准”
电赛的电机控制,光调速是不够的,尤其是那些要求小车走精确距离或者按指定角度转动的题。很多人的误区是以为速度环做好了就万事大吉,但减速电机的变速响应和大惯量会让你在距离上翻大车。一个比较有效的做法是把减速电机当作“有惯性的步进电机”来用:PWM 调速管速度,编码器或码盘测速管反馈,再加上位置环和死区补偿,实现按步逼近。
下面是一个位置环的简化流程,配合编码器使用:
// 控制周期内执行 int target_pos = 2000; // 目标位置,编码器脉冲计数 int current_pos = encoder_count; // 当前编码器计数 int err = target_pos - current_pos; int pwm_out = 0; // 死区判断:误差小于阈值,认为到位 if (abs(err) < 3) { pwm_out = 0; } else { // 比例项,加上限幅 pwm_out = K_P * err; if (pwm_out > PWM_MAX) pwm_out = PWM_MAX; } set_motor_pwm(pwm_out);这个结构的重点在三个参数上:K_P 是比例增益,决定响应快慢;PWM_MAX 是限幅,避免启动瞬间电流过大;死区阈值决定停车精度。减速电机有静摩擦,真实的死区一般要调到 3~5 个脉冲,调得太小电机会在目标点附近来回抖,调太大位置会偏。加上积分项之前,先把比例项和死区调明白,这是最基础的“走准”手段。
步进电机的控制反过来,要通过频率和细分把速度调到满意。L297 帮你做时序,细分驱动电路可以减小低速振动。软件上要写一个“加速—匀速—减速”的梯形速度曲线,别一上来就满频率启动,丢步后位置就再也不准了。
4.3 延时、定时与各类算法储备
延时和计时要分开理解。软件延时(空循环)适合短时间的电平等待,比如按键消抖、传感器上电稳定,但注意它占 CPU 且不可靠;真正的计时必须用定时器来做,比如测速的脉冲周期、秒表、PWM 的输出基准。比赛现场如果哪个模块的时序怪怪的,先检查是不是把软件延时写在了中断服务函数里。
算法储备方面,秒表、测速、测距、寻迹、避障这些是控制类的绝对主力。寻迹的建议是:先用阈值比较做二值化,再用状态机判断是直行、偏左还是偏右,别一上来就搞图像识别,机械结构没调好时花再大力气也不如几个开关量稳定。测速采用 M/T 法测量:高转速用测频法,低转速用测周期法,再根据当前速度自动切换。而这些“不一定要用的算法”里,复线这类东西想证明系统够强,但排优先级要谨慎,核心功能全部跑通再说。
5. 备赛常见问题与避坑:现象、原因、解决
5.1 硬件侧:电源、共地与信号整形问题
现象 1:电机一启动,单片机就复位重启,程序从头跑。
原因:电机是大电流感性负载,启动瞬间电流抽走导致电源电压跌落,单片机供电低于复位电压。根因是电源余量不足,且控制电路与驱动部分共用了同一条供电通路。
解决:电源分级处理,电机驱动单独用 12V 或大电流通道,单片机用独立的 5V LDO,两者之间只在一点共地。板子上还要给电源入口加一个大容量的电解电容(几百微法到几千微法)吸收瞬态跌落。以后我每次接电机驱动,习惯是先看这一路电源的电容够不够。加大电容是假动作,核心是分开供电路径。
现象 2:光耦的输出信号时好时坏,单片机 IO 口读数跳变。
原因:光耦的接收端输出是光电流,直接进 IO 口会受反射面距离、环境光、上拉电阻阻值影响,导致信号沿不陡、电平处于临界区。
解决:光耦后面加一级比较器,LM339/LM393 做阈值整形。用电位器调阈值,输出就是干净的高低电平。比较器的参考电压最好用稳压管或基准源,别直接取 VCC。后面凡是用光耦的板子,我都是默认画上比较器和电位器焊盘,哪怕这次用不上也不亏。
现象 3:负电源没有准备,现场要用双电源运放只能干瞪眼。
原因:赛前清单里面只列了正电压模块,没人想到运放电路需要负压。遇到温差电桥这类需要双电源的题目时,板子上根本没有负压引脚。
解决:用 LM337 搭一块可调负压模块做标准件,无论题目需不需要都放进工具箱。同时习惯把运放电路的供电设计成跳线可选“单电源/双电源”,单电源时做一个 2.5V 虚地,这样一块板子两边都能用。从那以后我的板子都留一个双电源接口,虽然大多数时候闲置,但真要用时直接焊线就好。
5.2 软件侧:时序、滤波与电机控制问题
现象 4:AD 采集值跳得离谱,特别是电机转起来以后。
原因:模拟信号本身有噪声,且参考电压被电机纹波污染;采集端没有做任何滤波处理直接使用单次采样值。
解决:参考电压用基准源;软件上做滑动平均滤波,比如取最近 8 次采样去掉最大最小值再平均。采集和电机调速的控制周期尽量给不同定时器,错开执行相位。关键判定靠的是滤波后的趋势而不是单点数值。
现象 5:减速电机调速正常,但小车走固定距离总是差一截,且每次偏差还不一样。
原因:只有速度环没有位置环,减速电机的制动距离和负载有关,每次停车位置不同。尤其没有编码器反馈时,相当于开环控制。
解决:加编码器或光电码盘,按“目标位置—当前位置—误差—PWM 输出”的位置环结构控制,再加上死区阈值,实测效果会比开环 PWM 定时准确很多。现在我做小车距离控制,第一步就检查有没有编码器反馈,没有的话先补机械,再谈算法。
6. 从模块到整车的完整收尾:备赛节奏与好习惯
整个备赛周期,我建议按照“标准板→程序库→整车联调”三段走。第一阶段按第 2、3 章的清单把电源模块、比较器板、驱动板、传感器小板全部做成标准件,每个模块都有独立的测试点,能单独验证通断。第二阶段把 LCD、键盘、SPI AD、PWM 输出、编码器测速这些基础流程写到公共库文件里,注意不要写死引脚,用宏定义映射,方便比赛时快速换板。第三阶段才是真正的整车联调,把传感器和电机装到车模上,先逐个验证安装方向和信号极性,再融合算法。
车模和小车类题目的机械配合经常是最后的大坑。减速电机、步进电机、测速电机都要提前准备好,联轴器这种东西虽然不显眼,但缺少任何一个都装不了车。环境齿:机械、电气、光学、声学、磁学的模块都备上,无线通信模块也要准备,方便上位机调试和无线遥控切换。
另外强调身体和心态。比赛最后一天通常是缺觉的,但大部分人出问题都是调试烦躁导致的低级错误。这时候要做的不是硬扛,而是强制休息 20 分钟再继续。如果电路查不出问题,从头量一遍电源、共地、信号三样基本没有解不开的结。从那以后我每次备赛第一天就先把电源和信号处理板卡焊好,调好一个模块标一个“验证通过”,这份清单就成了我所有比赛和项目的底仓。希望帮到你。
本文还有配套的精品资源,点击获取