开源项目:使用STM32做一个简易的示波器

💡 原文中文,约9800字,阅读约需24分钟。
📝

内容提要

这个项目是基于正点原子精英板制作的简易示波器,具备读取信号频率和幅值的功能,通过按键改变采样频率和控制屏幕操作。硬件接线包括观察正弦波和三角波/噪声。信号采集依靠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。

🏷️

标签

➡️

继续阅读