开源项目:使用STM32做一个简易的示波器
内容提要
这个项目是基于正点原子精英板制作的简易示波器,具备读取信号频率和幅值的功能,通过按键改变采样频率和控制屏幕操作。硬件接线包括观察正弦波和三角波/噪声。信号采集依靠ADC和DMA,存储数据进数组,用于LCD上显示波形和处理参数。数据处理包括求取信号频率和幅值,使用FFT算法。模拟输出正弦波和噪声/三角波通过配置DAC和定时器实现。显示函数和按键控制用于显示波形和改变采样频率。
延伸解读
采样频率与定时器配置的关联
文章指出采样频率由定时器2的溢出频率决定,公式为SYSCLK/预分频值/溢出值。通过改变PWM频率即可调整采样率,但需注意TIM_Pulse值不影响采样频率,仅TIM_Period和TIM_Prescaler起作用。实际配置时,若将TIM_Pulse设为1、TIM_Period设为2、TIM_Prescaler设为1,理论上采样频率最高可达36MHz,但需确保TIM_Period不小于TIM_Pulse,否则可能无法正常输出。
FFT求频率的精度与限制
使用FFT计算信号频率时,频率分辨率f0=fs/N,其中fs为采样率,N为采样点数。文章选用1024点是因为DSP库提供该样本数的库函数,且点数越多分辨率越高。但需注意FFT输出并非实际频率,需通过f(k)=k*(fs/N)转换,且源代码中该公式有误,作者已修正。此外,当采样频率提高到3.6kHz时,频率显示出现偏差(约32Hz),原因未知,可能涉及定时器或ADC触发时序问题。
模拟输出用于调试的实用价值
项目通过DAC输出正弦波、三角波或噪声来验证示波器显示是否准确。正弦波由定时器3中断改变DAC值生成,频率可通过定时器3溢出频率调整;三角波或噪声则由DAC内部发生器产生,频率由定时器4触发控制。这种自测方式能帮助开发者快速定位采样或显示环节的问题,但需注意DAC输出频率与理论计算可能存在微小误差,如正弦波实测24-25Hz与理论24.5Hz接近。
Q&A
这个简易示波器项目是基于什么硬件制作的?
基于正点原子精英板制作。
如何通过按键控制示波器的采样频率和屏幕操作?
KEY_UP控制波形的更新和暂停;KEY_1降低采样率;KEY_0提高采样率。按键控制是在外部中断中进行的。
信号采集是如何实现的?
信号采集依靠ADC和DMA。ADC通过定时器触发采样,DMA将采集的数据从ADC的DR寄存器转移到变量中,并在DMA中断中将数据依次存储进数组,完成1024个点的采样和储存。
为什么需要采集1024个点?
因为FFT算法要求样本数为2的n次方,而DSP库中提供了64、256和1024样本数对应的库函数,选用1024最大样本数可以使频率分辨率最小,更加精确。
数据处理中如何求取信号的频率和幅值?
幅值通过找出存储1024个点的数组中最大最小值,回归处理后算出差值。频率求取使用STM32 DSP库中的FFT算法,FFT后的输出需要经过转换:f(k)=k*(fs/N),其中k是实际信号的最大幅度频率所对应的数。
如何模拟输出正弦波用于调试示波器?
利用DAC输出,在定时器3的中断中不断改变DAC的输出值,产生正弦波。改变正弦波的频率可以通过更改定时器3的溢出频率。采用的PA4口进行输出。
如何模拟输出噪声或三角波?
通过配置DAC,利用芯片内部的发生器产生。DAC2的转换由定时器4的TRGO触发(事件触发),并设置TRGO由更新事件产生。若为三角波输出,频率=72Mhz/定时器重装载值/预分频系数/幅值/2。