啊对对对!你电赛通宵就为了当淘宝二道贩子?
每年到了电赛备赛季,总能在实验室看到这样一批人:桌上堆满了快递纸箱,购物车里躺着十几个型号相近的传感器模块,手机里全是跟卖家讨价还价的聊天记录。问他在准备哪个题,他头也不抬地说“还在选型”。等到比赛真正开始,才发现买回来的模块一半用不上,另一半没吃透怎么用,最后通宵到天亮,其实一直在查数据手册和看教程。
不是说要抵制买模块,而是很多同学把“备赛”理解成了“囤货”。电子设计竞赛的核心从来不是谁手上的器件多,而是谁能在有限时间内设计出一套稳定的系统。今天这篇文章,就围绕电赛备赛中最常遇到的两大方向——信号题和电源题展开,从环境搭建、模块设计到代码实现和排错方法,整理一份可以直接上手的完整路径。文章里会给出可复制的代码示例和设计思路,也顺便聊聊那些被大家忽视的备赛习惯。
1. 电赛到底在比什么?方向拆解
1.1 电赛题目的常见分类
全国大学生电子设计竞赛虽然每年题目都在变,但万变不离其宗,主要考查的方向可以归纳为下面几类:
| 题目方向 | 典型任务 | 考查重点 |
|---|---|---|
| 电源类 | 降压、升压、恒流、恒压、充电管理 | 功率电路设计、效率、纹波抑制 |
| 信号源类 | 产生指定频率和幅度的波形 | DDS、运放、频率稳定性 |
| 高频类 | 射频收发、混频、放大 | 阻抗匹配、高频布局、抗干扰 |
| 放大器类 | 小信号放大、滤波器设计 | 运放选型、噪声控制、带宽 |
| 仪器仪表类 | 电压、电流、频率、阻抗测量 | ADC精度、校准、显示交互 |
| 控制类 | 小车、云台、倒立摆、风力摆 | 传感器、执行器、控制算法 |
| 数据采集与处理类 | 波形采集、FFT分析、参数计算 | 高速ADC、DSP/FPGA、算法 |
从热度来看,信号题和电源题几乎是每年的“常青树”。你去看“2025电赛a题仿真”“24年电赛h题”“26电赛g题”这些被反复搜索的内容,很多都围绕信号测量、波形处理、电源变换展开。原因也很简单:这两类题目既有硬件深度,又有软件空间,能有效拉开参赛队伍之间的差距。
1.2 比的是设计能力,不是“捡垃圾能力”
有一个很常见的误区:看到高分队伍用了某某模块,就以为自己也买一块就能拿奖。实际上,同一块传感器、同一个电源芯片,在不同人的板子上表现可以天差地别。真正的差距体现在:
- 是否清楚模块内部的工作原理;
- 是否知道外围电路该怎么搭;
- 遇到信号失真、纹波过大、程序跑飞时,能不能快速定位问题;
- 能不能在系统层面做性能和稳定性的取舍。
所以本文后续的内容,会刻意把“原理”和“实现”放在一起讲。先搞懂为什么,再照着做,这样即使题目换了,你也能迁移思路。
2. 备赛环境与平台准备
2.1 硬件平台选型
电赛常用的主控芯片大致有这几类:
- STM32系列:资料最多、生态成熟,适合大部分控制、测量和信号处理任务,推荐从 F103 入门,有更高性能需求再考虑 F407 或 H7;
- MSP430系列:低功耗场景有优势,适合电池供电的便携设备;
- GD32、AT32等国产替代:引脚和编程模型兼容 STM32,价格有优势,但要注意外设库差异;
- FPGA:适合高速信号采集、并行处理和复杂时序逻辑,但开发周期长,不适合零基础临阵磨枪。
如果你现在还在纠结选哪块板子,建议直接选你手上已有的、资料最全的那块。电赛比的不是主控芯片的品牌,而是你对外设的熟悉程度。我见过用一块最基础的 STM32F103 把信号题做到接近满分的人,也见过带着高性能开发板却连定时器都配不明白的队伍。
2.2 软件与仿真工具
备赛过程中,下面几类工具基本是逃不掉的:
- 嵌入式开发:Keil MDK 或 STM32CubeIDE。如果你用 CubeMX 生成工程,建议花一点时间读一读生成的代码,而不是全程“自动生成→不管”,否则遇到问题很难定位。
- 原理图与PCB:立创EDA 对新手非常友好,上手门槛低,而且元件库丰富,适合快速打样。如果队伍里有画板经验的人,也可以选择 Altium Designer。
- 电路仿真:Multisim 适合模拟电路和电源电路仿真,LTspice 适合电源芯片的环路仿真,Proteus 则偏嵌入式系统仿真。很多人搜“2025电赛a题仿真”,其实核心就是想用仿真先验证方案,再动手做实物,这个思路是对的,但要注意:仿真通过不代表实物一定正常工作,寄生参数和接触不良是仿真里看不到的。
- 仪器仪表:至少要有数字示波器、信号发生器、直流稳压电源、万用表。有条件可以加电子负载和逻辑分析仪。
需要注意,不同版本的 Keil、CubeMX、HAL库 之间接口可能略有差异,网上很多教程基于旧版本。遇到不一致时,不要盲目复制代码,先看自己工程里实际生成的头文件和函数名。
2.3 软件工程与文档习惯
电赛是三天四夜的高强度开发,代码会写得非常快,但如果不注意工程结构,后期调试会非常痛苦。建议从一开始就建立这样的目录划分:
project/ ├── Core/ // 主函数、中断、系统时钟配置 ├── Hardware/ // 外设驱动,如 adc.c、pwm.c、uart.c ├── Module/ // 功能模块,如 signal_measure.c、pid.c ├── App/ // 业务逻辑,如 main_task.c └── Doc/ // 数据手册、引脚分配表、设计笔记哪怕只是给自己看,也要保持函数单一职责。不要在主函数里堆一千行代码,否则改一个功能可能引发三个bug。
3. 电源题核心——电源模块设计
3.1 先分清 LDO 与 DC-DC
电源题最基础,也是最容易被扣分的地方,就是对电源拓扑的理解。很多同学一上来就用 LDO(低压差线性稳压器),结果输入 12V、输出 5V 时芯片烫得能煎鸡蛋,转换效率不到 50%。原因很简单:LDO 靠调整管消耗掉多余的能量,压差越大损耗越大。
LDO 适合压差小、负载电流小、对噪声敏感的场合,优点是纹波小、外围简单。DC-DC 开关电源则适合压差大、负载电流大的场合,效率高,但纹波和开关噪声也更明显。
| 对比项 | LDO | DC-DC(Buck) |
|---|---|---|
| 效率 | 低,尤其大压差时 | 高,常见 85%~95% |
| 纹波 | 小 | 较大,需要滤波电容 |
| 电磁干扰 | 小 | 较大,需要合理布局 |
| 外围元件 | 少 | 多,有电感、二极管、反馈网络 |
| 适用场景 | 模拟电路供电、低噪声场合 | 功率级、电池降压、大电流场合 |
3.2 Buck 降压电路的参数估算
电源题常考的基本拓扑就是 Buck 降压电路。设计时先明确指标:输入电压范围、输出电压、最大输出电流、纹波要求、开关频率。然后按下面的顺序一步步算。
假设设计目标:输入 12V,输出 5V,最大电流 2A,开关频率 100kHz,纹波电压控制在 20mV 以内。
第一步,计算占空比 D:
[ D \approx \frac{V_{out}}{V_{in}} = \frac{5}{12} \approx 0.42 ]
实际工程中还需要考虑开关管和续流二极管的压降,但估算阶段可以先按这个值。
第二步,计算电感量 L。电感纹波电流一般取最大输出电流的 20%~40%,这里取 30%,即纹波电流约为 0.6A:
[ L = \frac{(V_{in} - V_{out}) \times D}{f_{sw} \times \Delta I} ]
代入数值:
[ L = \frac{(12 - 5) \times 0.42}{100 \times 10^3 \times 0.6} \approx 49\mu H ]
实际可以选 47μH 或 56μH 的电感。电感选小一点,纹波电流会变大;选大一点,动态响应会变慢。
第三步,确定输出电容:
[ C_{out} \geq \frac{\Delta I}{8 \times f_{sw} \times \Delta V_{out}} ]
代入数值:
[ C_{out} \geq \frac{0.6}{8 \times 100 \times 10^3 \times 0.02} \approx 37.5\mu F ]
实际可以使用两个 22μF 的陶瓷电容并联。陶瓷电容的 ESR 低,对抑制输出纹波很有帮助。
3.3 电源 PCB 布局的关键细节
很多同学画板时,把电源部分当成普通模块来布局,结果焊上去功能不正常,或者一加载就振荡。电源部分的 layout 有几个非常关键的原则:
- 功率回路面积要小。输入电容、开关管、续流二极管、电感、输出电容组成的回路,应该尽量紧凑,否则会产生较大的寄生电感和电磁干扰。
- 反馈采样点要远离功率电感。反馈电阻的上端应该直接从输出电容处采样,不要接到电感的输出引脚附近,否则容易引入开关噪声。
- 地线要单点连接。模拟小信号的地和大电流的功率地要分开走,然后在某个单点汇合,避免功率电流在信号地上产生压降。
调试电源模块时,最好先空载上电,测量输出电压是否正常,再逐步加载。如果负载一上去电压就掉,优先检查电感是否饱和、输入电容是否足够、反馈网络是否接对。
4. 信号题核心——信号产生与采集
4.1 常见的信号题任务
信号题通常围绕“产生信号”和“测量信号”展开。产生侧,要求输出指定频率、幅度、波形的信号;测量侧,要求测量频率、周期、幅度、相位差等参数,并显示或上传。综合起来,需要掌握三个能力:
- 波形产生:DDS 模块、PWM 滤波、DAC 输出;
- 信号调理:放大、衰减、滤波、整形;
- 参数测量:ADC 采样、有效值计算、频率测量。
4.2 用 STM32 ADC 采集信号并计算有效值
采集交流信号时,不能只看瞬时值,通常需要计算有效值。下面是一段基于 STM32 HAL 库的 ADC 采样核心代码,思路是连续采样 N 个点,计算均方根。
// 文件路径:Core/Src/adc_rms.c // 说明:基于 STM32CubeMX 生成的 HAL 库工程,仅展示核心逻辑 #include "adc.h" #include <math.h> #define SAMPLE_NUM 128 uint16_t adc_buf[SAMPLE_NUM]; float get_adc_rms(ADC_HandleTypeDef *hadc) { uint32_t sum_squares = 0; float rms = 0.0f; for (int i = 0; i < SAMPLE_NUM; i++) { HAL_ADC_Start(hadc); if (HAL_ADC_PollForConversion(hadc, 100) == HAL_OK) { adc_buf[i] = HAL_ADC_GetValue(hadc); } HAL_ADC_Stop(hadc); } for (int i = 0; i < SAMPLE_NUM; i++) { sum_squares += (uint32_t)adc_buf[i] * adc_buf[i]; } rms = sqrt(sum_squares / (float)SAMPLE_NUM); return rms; }这段代码的基本思想是:对信号进行等间隔采样,然后求所有采样值的平方和的平均值,再开方。注意几个工程细节:
- 采样前要保证 ADC 的参考电压准确,如果参考电压不稳,计算结果会有偏差;
- 实际信号可能有直流偏置,计算前需要减去直流分量,或者用交流耦合输入;
- 如果信号频率较高,需要提高采样率,否则会因采样点数不足产生误差。
4.3 用定时器输入捕获测量频率
测量信号的频率,最直接的方式是用定时器的输入捕获功能。下面是核心中断回调代码,思路是捕获两个相邻上升沿之间的计数值,用定时器时钟频率除以计数值得到频率。
// 文件路径:Core/Src/freq_measure.c // 说明:核心片段,需根据实际定时器时钟频率调整 volatile uint32_t freq_value = 0; static uint32_t capture_buf[2] = {0, 0}; static uint8_t capture_index = 0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { capture_buf[capture_index] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); capture_index = (capture_index + 1) % 2; if (capture_index == 0) { // 两次捕获之间的差值,即一个周期对应的计数值 uint32_t period = capture_buf[1] - capture_buf[0]; if (period > 0) { freq_value = SystemCoreClock / period; } } } }使用输入捕获时要注意几点:
- 定时器的时钟频率越高,测得的频率分辨率越高;
- 如果被测信号频率较低,计数值可能很大,需要用 32 位定时器或做溢出处理;
- 输入捕获前需要确认信号幅度是否满足 MCU 的 IO 电平要求,一般需要经过整形电路或比较器,不能直接接高压或负压信号。
4.4 信号调理:放大与滤波
MCU 的 ADC 一般只能采集 0~3.3V 或 0~5V 的信号,而传感器输出往往是毫伏级小信号,或者带有较强噪声。这时就需要信号调理电路。常见做法:
- 同相放大器:把毫伏级信号放大到 ADC 的合适输入范围;
- 电压跟随器:做阻抗隔离,避免 ADC 输入阻抗影响前级电路;
- 有源滤波器:用运放搭建低通或带通滤波器,滤除带外噪声;
- 比较器整形:把正弦波或任意波形转成方波,方便测量频率。
设计时记住一个原则:先确认信号幅度和频率范围,再选运放。运放的增益带宽积要足够,否则高频信号会被衰减。比如处理 1MHz 信号,用增益带宽积只有 1MHz 的运放,放大倍数最多只能做到 1 倍,完全没有放大效果。
5. 控制题的基本框架
5.1 传感器 + 执行器 + 控制算法
控制类题目一般跑不脱这个闭环:传感器感知状态,控制器计算控制量,执行器改变被控对象。常见传感器有编码器、陀螺仪、加速度计、超声波、红外;常见执行器有直流电机、步进电机、舵机、风扇、电磁铁。
选型时不能只盯着精度参数,还要看接口是否容易驱动、数据更新率是否够用。比如陀螺仪模块,I2C 接口方便但速率可能受限,SPI 接口更适合高速数据读取。比赛时如果发现传感器数据延迟严重,先别急着换传感器,优先检查通信速率和主控的处理效率。
5.2 位置式 PID 实现
控制算法里最常用的是 PID。一段可复用的位置式 PID 代码如下:
// 文件路径:App/pid.c typedef struct { float kp; float ki; float kd; float integral; float last_error; float output_limit; float integral_limit; } pid_ctrl_t; void pid_init(pid_ctrl_t *pid, float kp, float ki, float kd) { pid->kp = kp; pid->ki = ki; pid->kd = kd; pid->integral = 0.0f; pid->last_error = 0.0f; } float pid_update(pid_ctrl_t *pid, float target, float current) { float error = target - current; // 比例项 float p_out = pid->kp * error; // 积分项,带限幅 pid->integral += error; if (pid->integral > pid->integral_limit) { pid->integral = pid->integral_limit; } else if (pid->integral < -pid->integral_limit) { pid->integral = -pid->integral_limit; } float i_out = pid->ki * pid->integral; // 微分项 float d_out = pid->kd * (error - pid->last_error); pid->last_error = error; // 总输出,带输出限幅 float output = p_out + i_out + d_out; if (output > pid->output_limit) { output = pid->output_limit; } else if (output < -pid->output_limit) { output = -pid->output_limit; } return output; }这里最容易被忽略的是积分限幅。如果没有积分限幅,系统长时间无法到达目标时,积分项会一直累积,导致输出饱和,出现明显的超调甚至振荡。所以在实际工程里,积分限幅和输出限幅缺一不可。
调参顺序建议是:先把 I 和 D 设成 0,只调 P,让系统产生等幅振荡,记下临界增益;然后加入少量 I,消除稳态误差;最后加入 D,改善超调。不要一开始就三个参数一起调,否则很难定位问题。
6. 系统联调与高频问题排查
电赛调试阶段,最怕的不是功能没实现,而是“偶尔能工作、偶尔不能工作”的幽灵 bug。这种问题通常隐藏得很深,需要按照一定顺序排查。
6.1 常见问题排查表
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 上电无反应 | 电源短路、反接、电压不足 | 先量电源输出,再摸芯片温度,确认供电正常 |
| 程序跑飞 | 数组越界、堆栈溢出 | 检查数组下标、中断优先级配置,使用看门狗 |
| ADC 数据跳动大 | 参考电压不稳、采样时间不足、地线干扰 | 改善电源滤波,延长采样时间,合理布地 |
| 电源带载后电压跌落 | 电感饱和、输入电容不足、反馈采样错误 | 换更大饱和电流电感,增加输入电容,检查反馈走线 |
| 电机一转就复位 | 电机启动电流过大,电源跌落 | 电机单独供电,加母线电容,主控和功率部分隔离 |
| 通信数据乱码 | 波特率不匹配、电平不兼容 | 确认双方参数,检查共地问题 |
| 信号频率测不准 | 比较器阈值漂移、边沿抖动 | 增加迟滞比较器,或改用施密特触发器整形 |
6.2 排查顺序建议
遇到问题,不建议一开始就怀疑算法和芯片,先按下面的优先级排查:
- 电源电压和电流是否正常;
- 时钟是否起振,晶振是否焊稳;
- 单片机能不能跑起来,用 LED 翻转程序验证;
- 外设寄存器配置是否生效,用调试器观察寄存器值;
- 传感器和通信是否正常,用串口打印中间变量;
- 最后再怀疑算法模型和逻辑问题。
这套顺序最大的好处是,能快速排除“最基础但最致命”的硬件问题。很多同学花了一晚上找软件 bug,最后发现是排针虚焊、杜邦线接触不良,这种低级错误在比赛场上非常常见。
6.3 硬件保护与安全
比赛过程中,电源题和电机控制题都会遇到大电流场景。上电前要养成习惯:
- 用万用表测量输入端的短路情况,确认没有明显短路再上电;
- 第一次上电建议用限流模式,比如先把电源限流设为 0.5A,正常后再逐步提高;
- 电源电路加防反接二极管,电机驱动电路加续流二极管和母线电容;
- 涉及高压或大功率测试时,务必遵守实验室安全规范,不要单手操作,不要带电焊接。
7. 备赛节奏与工程建议
7.1 别把时间花在“淘宝选型”
回到文章开头的问题:为什么说“电赛通宵就为了当淘宝二道贩子”?因为很多人的备赛时间是这样花掉的:今天看到别人用 A 模块,下单买;明天看到 B 方案更好,又下单买;后天觉得 C 芯片参数更强,继续下单。真正用来读数据手册、搭电路、写代码、做测试的时间少得可怜。
正确的备赛节奏应该是:
- 先读懂题目要求,明确系统输入输出指标;
- 根据指标选一个最熟悉的方案,不要频繁更换;
- 把系统拆成若干子模块,逐个验证;
- 子模块验证通过后再做系统集成;
- 最后留出至少半天做整体测试和问题总结。
选型阶段控制在半天到一天内完成就够了。模块买到后,立刻画一个最小测试例程验证功能,不要放在盒子里吃灰。
7.2 代码与文档习惯
电赛的代码量大、改动频繁,建议每个队伍都建立版本管理。哪怕不会用 Git,也可以在每个关键节点手动复制一份带日期和功能的备份,比如main_0625_1800_pid_ok.rar。这样做的好处是,改崩了随时能回到上一个稳定版本。
代码里多加注释,尤其是那些“为什么这么写”的注释。比赛时的灵感和坑点,如果不记录下来,第二天可能就忘了。推荐在代码文件头部维护一个修改记录,哪怕只是简单的几行文字,也能在联调时节省大量时间。
7.3 团队分工建议
电赛是三人三天的团队项目,合理的分工很重要。常见的分工模式是:
- 硬件负责人:负责原理图、PCB、电源模块设计和硬件调试;
- 软件负责人:负责主控程序设计、外设驱动、算法实现;
- 文档与测试负责人:负责记录测试数据、整理设计报告、协助调试。
当然,分工不是完全隔离,关键节点一定要一起讨论。比如硬件和软件的接口定义要对齐,PWM 引脚、ADC 通道、通信协议都要提前统一,否则做到一半发现硬件占用和软件冲突,会非常被动。
8. 总结与下一步学习
这篇文章从电赛的题目类型出发,重点拆解了信号题和电源题的核心设计与实现思路。你至少应该掌握下面几个关键点:
- 电赛比拼的是系统设计能力,不要陷入“囤模块、比价格”的误区;
- 电源设计要理解 LDO 和 DC-DC 的差异,掌握 Buck 电路的基本参数估算和布局要点;
- 信号题要能完成波形产生、信号调理、ADC 采集和频率测量的闭环,代码示例可以直接移植到 STM32 HAL 库工程中;
- 控制题要掌握传感器、执行器和 PID 算法的配合,特别注意积分限幅和调参顺序;
- 遇到故障时,按电源、时钟、外设、算法、逻辑的顺序排查,不要一上来就怀疑算法。
如果你现在的状态还是“一堆模块在手,心里没底”,不如先挑一个小题目,比如做一个“简易信号发生器”或者“5V转3.3V电源板”,从头到尾走一遍设计、打样、调试的完整流程。等这个闭环打通了,再面对真正的竞赛题目时,心里就有底很多。
下一步的学习方向,建议根据你自己的薄弱环节来选择:控制题不够熟练,就去补自动控制原理和 PID 整定方法;信号题吃力,就沉下心补信号与系统的基础知识;对电源感兴趣,可以深入研究同步 Buck、环路补偿和效率优化。
如果这篇文章对你有帮助,建议收藏备用,尤其是在比赛前快速过一遍排查思路。也欢迎在评论区分享你备赛过程中遇到的最离奇的问题,说不定你的案例就是别人决赛场上的“避坑指南”。