公司动态

从零到省二:基于STM32与AD9833的电赛H题信号分离实战复盘

📅 2026/7/15 2:21:34
从零到省二:基于STM32与AD9833的电赛H题信号分离实战复盘
1. 从零开始的电赛H题挑战第一次参加电子设计竞赛时我们团队三个人连STM32的GPIO都配置不利索。记得赛题公布那天看到H题信号分离装置的要求——要从混合信号中提取两个同频显示的正弦波/三角波我们对着示波器发呆了整整两小时。当时根本没想到四天后这个用面包板搭的简陋装置能拿下省二等奖。选择H题的原因很实际比起需要FPGA的高频题这个20k-100kHz的中频信号处理更适合新手。核心任务分解起来就三步ADC采样输入信号→FFT分析频谱→用DDS模块还原波形。但实际做起来每个环节都暗藏杀机。比如题目要求的同频显示意味着输出信号A和B的频率差必须小于0.1Hz否则示波器上会看到波形缓慢漂移。2. 硬件方案选型踩坑记2.1 为什么放弃纯模拟方案最初想用模拟电路实现用锁相环(PLL)跟踪频率。实测发现LM567在50kHz时稳定性极差频率稍微偏移就失锁。更致命的是题目要求处理随机变化的输入频率模拟方案需要手动调整参数根本来不及响应。2.2 STM32AD9833的黄金组合最终方案是数字前端模拟后端的混合架构主控STM32F407凭借168MHz主频和硬件FPU能实时完成1024点FFTDDS模块AD9833虽然分辨率只有0.1Hz但通过软件校准可以做到0.07Hz信号调理OPA2350搭建的带通滤波抑制高频噪声特别要夸一下AD9833这个神器25MHz时钟下频率字是28位的理论分辨率能达到0.1Hz。通过SPI配置寄存器就能输出纯净的正弦波比用PWM生成波形稳定多了。我们在淘宝买的模块才30块钱但要注意选择带晶振的版本内部PLL的抖动太大。3. 核心算法实现细节3.1 ADC采样中的玄机采样率设置是个平衡艺术。我们最终选用200kHz采样率题目要求最高100kHz配合汉宁窗减少频谱泄漏。关键代码片段// 使用定时器触发ADC采样 void TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_BaseStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_BaseStruct.TIM_Prescaler 84-1; // 1MHz计数 TIM_BaseStruct.TIM_Period 5-1; // 200kHz触发 TIM_TimeBaseInit(TIM2, TIM_BaseStruct); TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); }3.2 FFT实战技巧使用STM32的DSP库进行FFT时发现了三个坑输入数组需要对齐到4字节边界否则会进入硬件错误中断频域幅值要除以N/2N是FFT点数识别主频时要找幅值最大的两个峰还要判断它们是否达到噪声阈值的3倍这里有个骚操作通过计算频谱的质心来提升频率估计精度。比如在500Hz附近检测到峰值可以用(499Hz幅值×499 500Hz幅值×500 501Hz幅值×501) / 三者和来获得亚分辨率精度。4. 致命0.1Hz频差解决方案4.1 软件校准秘籍AD9833的0.1Hz步进看似不够但我们发现可以通过动态调整参考时钟来微调。具体做法测量输入信号A的实际频率f_A计算AD9833的理论设置值f_set f_A × (2^28)/25MHz对f_set做四舍五入后反算实际输出频率f_real计算误差Δf f_A - f_real通过PID算法累积补偿值实测这个方法能把频差控制在0.05Hz以内对应示波器上20秒才漂移一个周期评委根本看不出来。4.2 硬件同步妙招后来在国赛培训中学到更狠的一招把两个AD9833的SYNC引脚接同一个GPIO用PWM触发同步。这样即使频率有微小差异相位也是对齐的示波器触发后波形看起来完全静止。可惜比赛时没想到这招不然能冲省一。5. 给电赛新手的血泪建议5.1 三天速成STM32秘籍作为从51单片机转战STM32的过来人强烈推荐学习路线先用STM32CubeMX生成基础工程理解时钟树配置重点掌握TIMPWM/输入捕获、ADC规则/注入通道、SPI全双工/DMA必看《Cortex-M4权威指南》了解NVIC优先级机制有个容易忽略的点GPIO速度设置。我们最初SPI通信不稳定就是因为没把引脚设为High Speed模式。5.2 电赛备赛物资清单根据这次经验整理的必备物品仪器双通道示波器100MHz以上、信号发生器、稳压电源元件多规格磁珠抑制高频噪声、0805封装的0.1uF电容电源去耦工具吸锡线改板子时救急、高温胶带固定飞线特别提醒要带延长线插座我们比赛时就因为插座不够示波器和电烙铁轮流用耽误了不少时间。