🏴☠️STM32Cubemx ADC+TIM+DMA欠采样采集高频信号
本文主要讲解ADC借助欠采样采集高频信号,比如使用100k左右的采样率去采集1M的信号。
所需工具:
- 开发板:STM32F103RCT6
- STM32CubeMX
- IDE: Keil-MDK
相关文章:
- STM32HAL ADC+TIM+DMA采集交流信号
- STM32cubeHAL ADC+TIM+DMA (二)
- stm32cubemx ADC+TIM+DMA超频采样_
- STM32ADC同步采样
文章目录
- 🏴☠️STM32Cubemx ADC+TIM+DMA欠采样采集高频信号
- 😄原理简介
- ⚽例程1
- 工程建立
- 运行结果
- 🏓例程2
- 工程建立
- 运行结果
- 🥊难点
- 🥑练习
- 🍉后记
😄原理简介
看过本文最一开始的“相关文章”中提到的文章后,会对信号采集有一定的概念。文章中使用的都是过采样,意思是采样率为待测信号频率的两倍及以上。这么说有些空,举例来说。如果想采集一个1K的正弦信号,一个周期采集4个点,那么采样率为4K。过程如下图:
题外话,没学过信号与系统的小朋友,可能会疑惑,这边采集4个点有啥用?根本看不出来是正弦,还原出来和三角波一样嘛!这就涉及到奈奎斯特采样定理的原理了,要好好学习《信号与系统》和《数字信号处理》,就能明白为什么这个正弦信号,一个周期采集2个点以上就可以复原出来。怎么复原呢?需要用到增采样的知识,我写过一篇matlab仿真增采样:Matlab增采样仿真
上图展示的采样率为4k,每隔0.25ms采集一个点。
增采样对采样率要求较高,如果要采集的信号是1M,一个周期4个点的话,那么我的采样率是不是就要4M了?有没有办法用低采样率,采集高频信号呢?
一个周期四个点嘛,我能否每个周期只采集一个点,然后拼在一起呢?每隔1.25ms采集一个点,这样采集的四个点拼接在一起,不也是一样的效果。
如图中所示,每个周期采集一个点,把所有点拼接在一起,就实现了每个周期采集4个点的效果。
采样率 = 1 1.25 ∗ 1 0 − 3 = 800 h z 采样率=\frac{1}{1.25*10^{-3}}=800hz 采样率=1.25∗10−31=800hz
我们使用800hz的采样率去采集1K信号,达到了4K采样率的效果!这便是欠采样,用时间换采样率。
⚽例程1
工程建立
建立过程与STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx_stm32 adc dma 采集交流_四臂西瓜的博客-CSDN博客一样,唯一不同之处是,采样率为800hz。文末会放置本文的完整工程。
采样率 = 时钟: 72 ∗ 1 0 6 分频: 1000 ∗ 90 = 800 h z 采样率=\frac{时钟:72*10^{6}}{分频:1000*90}=800hz 采样率=分频:1000∗90时钟:72∗106=800hz
补充一个知识:我们平时说的预分频PSC是指上图中的Prescaler,此处为1000-1。ARR自动重装载值,是指图中的Counter Period(AutoReload Register),此处为90-1。
运行结果
信号发生器输出:1kHz,1V-2V幅值范围的正弦信号。
VOFA上观察到如下结果:
可以看到一个周期确实是4个点,此处形状和原理分析中、预想的三角形波形不一样,是因为相位没有从零度开始采集,如下图:
采集的点,连成线,就如图中的蓝色线一样,形成“锯齿”状。
这里就可以通过理想插值(增采样),来实现复原,如何增采样呢?可以关注我的“TCQ的电赛小站”,有时间会更新基于CMSIS-DSP的理想插值实现。
🏓例程2
工程建立
现在我们来思考一个问题,我们现在每个周期只采集4个点,如果想每个周期采集10个点,那么采样时间间隔就要从1.25ms变成1.1ms
换算成采样率为:
采样率 = 1 1.1 ∗ 1 0 − 3 = 909.0909... h z 采样率=\frac{1}{1.1*10^{-3}}=909.0909...hz 采样率=1.1∗10−31=909.0909...hz
会发现采样率并不是一个整数,这就麻烦了。如果我们现在想用定时器来出发ADC进行采样,那么分频如何设置?
分频 = 72 ∗ 1 0 6 909.0909 = 79200.00000792 分频=\frac{72*10^{6}}{909.0909}=79200.00000792 分频=909.090972∗106=79200.00000792
我们现在设置:
P S C = 100 A R R = 792 PSC=100\\ ARR=792 PSC=100ARR=792
运行结果
与例程1一样,信号发生器输出:1kHz,1V-2V幅值范围的正弦信号。
如果读者愿意,可以数一数,会发现一个周期正是10个点!
我们用 909.09 h z 的采样率,去采集了一个 1 k 的信号,等效采样率 10 k !! 我们用909.09hz的采样率,去采集了一个1k的信号,等效采样率10k!! 我们用909.09hz的采样率,去采集了一个1k的信号,等效采样率10k!!
🥊难点
是的,欠采样也不是万能的,家家有本难念的经,采样家族里,欠采样也有它的烦恼>_<😕。
在例程2中,我们试图每1.1ms采集一个点,换算成频率后,发现是不是一个整数,非常幸运的是,转换成分频后,可以找到合适的PSC和ARR使得采样率和预期值基本一致。
这个计算过程可以通过公式化简一下:
采样率 = 1 秒 采样时间间隔 采样率=\frac{1秒}{采样时间间隔} 采样率=采样时间间隔1秒
定时器分频 = P S C ∗ A R R = 定时器时钟 采样率 = 定时器时钟 1 秒 采样时间间隔 = 定时器时钟 ∗ 采样时间间隔 \begin{align} 定时器分频&=PSC*ARR=\frac{定时器时钟}{采样率}\\ &=\frac{定时器时钟}{\frac{1秒}{采样时间间隔}}\\ &=定时器时钟*采样时间间隔 \end{align} 定时器分频=PSC∗ARR=采样率定时器时钟=采样时间间隔1秒定时器时钟=定时器时钟∗采样时间间隔
现在有了这个公式,我们来重新计算下例程1、2的分频:
例程 1 : P S C ∗ A R R = ( 72 ∗ 1 0 6 ) ∗ ( 1.25 ∗ 1 0 − 3 ) = 90000 例程1:PSC*ARR=(72*10^{6})*(1.25*10^{-3})=90000 例程1:PSC∗ARR=(72∗106)∗(1.25∗10−3)=90000
例程 2 : P S C ∗ A R R = ( 72 ∗ 1 0 6 ) ∗ ( 1.1 ∗ 1 0 − 3 ) = 79200 例程2:PSC*ARR=(72*10^{6})*(1.1*10^{-3})=79200 例程2:PSC∗ARR=(72∗106)∗(1.1∗10−3)=79200
挺好的呀,PSC*ARR都是比较好处理的整数。可是当频率高起来后,就不是特别好凑出来了,甚至于根本没法凑出来。比如以1.1us的时间间隔去采集1M信号,等效采样率为10M。
P S C ∗ A R R = ( 72 ∗ 1 0 6 ) ∗ ( 1.1 ∗ 1 0 − 6 ) = 7.92 PSC*ARR=(72*10^{6})*(1.1*10^{-6})=7.92 PSC∗ARR=(72∗106)∗(1.1∗10−6)=7.92
看吧,PSC * ARR是小数,但是PSC和ARR必须是整数,没法凑出来🤔。
🥑练习
-
下载例程并且上电调试,观察结果。
-
尝试测量更高频率的信号,比如测量几兆的信号。
-
假如,PSC*ARR可以设置成小数,欠采样可以采集任意频率的信号吗?
提示,学习下ADC的“采样保持”。
🍉后记
本文章收录于:
唐承乾的电赛小站
本文为系列文章中的冰山一角,欢迎进入小站查看。
配套程序:
配套工程 - Gitee.com