STMCU小助手
发布时间:2025-10-28 11:25
|
很多STM32系列,尤其后来推出的STM32系列的ADC模块多支持过采样。这里聊聊相关话题。 一、基本原理 STM32的ADC过采样功能就是通过对单个样点进行多次采样,累加求和以提升分辨率和数据准确性,同时又可以对累加值做适当的右移处理(相当于除以一个系数)来适应实际精度和存储要求。 下面是每次过采样结果的计算公式。
其中,N为过采样比,或称过采样倍数,即每次过采样需要经过N次采样。M表示的针对N次采样后累加值要进行右移的位数。看到这里,会不会觉得这个算式怪怪的,理解就好。简单点说,每次过采样的结果就是经N次采样的累加值,辅以适当右移后的数据。 这里的过采样过程大致包括以下几个步骤: 1、多次采样: ADC对同一个输入信号进行多次采样。采样次数由过采样比(N)决定,N可以是2x到256x【这里x表示倍数的意思】。 2、累加求和: 将所有采样结果进行累加。累加的结果可以达到20位(例如,256次12位结果的累加)。 3、移位处理: 将累加的结果右移一定的位数(M),以缩小结果的范围。M可以是0到8。 4、截断处理: 右移后的结果可能还需要进行截断以适应存储位宽。这里ADC数据寄存器为16位,单次转换结果的分辨率为12位。 5、结果存储: 最终的结果被存储在ADC的数据寄存器(ADC_DR)中。 上面操作都是硬件完成,无须CPU参与。其中,第3步、第4步要视具体情况而定,可能需要。 既然过采样过程中的每个最终结果是通过对同一输入信号进行N次采样并做数据累加而来,因此每次过采样的总时间是单次采样时间的N倍。不难看出,过采样是以时间换取精度和准确度的做法。 关于这点,我们不妨简单验证下。 现在使用STM32G4芯片的ADC1对片内Vrefint信号进行采样。启动后让其连续转换,通过DMA传输ADC结果,传输8次后停止数据传输。 我们分开启过采样和关闭过采样来进行总转换时间的比较。 下面是ADC的配置,过采样配置部分见红色下划线示意的区域。
开启过采样时,配置过采样率为16,即每次过采样有16次采样动作,每次过采样的累加值右移4位作为最终转换结果。关闭过采样和开启过采样时的其它基本配置完全一样。这样的话,同样获得8个ADC结果,开启过采样时所需的转换时间应该是关闭过采样的16倍。我用TIM2来获取8个ADC结果的时间,单位就是TIMER的计数时钟。软件方式启动ADC。 下图是验证时用到的测试代码,第4行就是启动ADC的代码。启动ADC前TIM2计数器被赋予初始值0,在DMA完成中断里再次读取TIM2的计数器的值。
下面截图是关闭过采样和开启过采样获取到的8个ADC结果及所用时间。左边是关闭过采样时的情形,右边是开启过采样时的情形。
从上面结果可以看出,开启过采样的所需转换时间恰好是关闭过采样所用时间的16倍。同时我们还可以发现,开启过采样的ADC结果更精准、更稳定。 二、过采样的触发模式 关于STM32的ADC过采样有两种触发模式,分别是单触发模式和多触发模式。参见下面图示加以理解。
单触发模式(Single Trigger Mode): 在这种模式下,单个触发信号启动所有的过采样转换。即所有的N次采样在一个触发信号下连续进行,最后一次采样转换完成后设置EOC(End of Conversion)标志。单触发模式也称之为连续模式。 多触发模式(Multiple Trigger Mode): 在这种模式下,每次采样转换都需要一个单独的触发信号。每次触发信号启动一次采样,直到完成所有N次采样后设置EOC标志。多触发模式也称之为重启模式。 以过采样率为4的情形来看。如果是单触发模式,每来一次触发信号,4次采样依次完成后该次过采样结束,并设置EOC标志。如果是多触发模式,需要4次触发才能完成该次过采样,之后设置EOC标志。我们在应用时根据具体需求灵活选择过采样的触发模式。我在上面的验证测试就是使用的单触发模式。 下面还是以STM32G4系列ADC1的Vrefint信号进行ADC过采样为例,来体验过采样单触发模式与多触发模式的应用。 这里过采样倍数选择16,过采样所得的累加和不做右移。显然,此时ADC参考电压所对应的过采样转换值应该是0xfff0,而不是0xfff。使用TIM1做定时触发,并保证TIM1的溢出周期长于ADC单次转换所需要的时间。TIM1每发生溢出就触发ADC,DMA搬运ADC结果,搬完8个数据后停止搬运并在DMA完成中断里获取TIM1的总溢出次数。TIM1的配置和关键用户代码如下:
开启过采样单触发模式,选择16倍过采样,累加和不做右移。
下图是基于上面条件的测试结果,获得8个过采样结果,需触发8次。即每次过采样只需一次触发。【因没有对累加和做右移处理,此时ADC满量程对应的数字则是0xfff0】
现在开启过采样多触发模式,依然选择16倍过采样,累加和不做右移。
下图是调整触发模式后的测试结果,同样获得8个过采样结果,则需要128次触发。即每次过采样需16次触发。
三、过采样率与右移位数的选择 在STM32芯片参考手册里关于过采样的描述章节有类似下面的表格。这里以STM32G4系列为例。表格中N表示过采样倍数,M表示过采样后的累加和右移的位数。
我们知道,STM32G4芯片ADC的分辨率为12位,满量程值即0xfff,如果对其进行N倍过采样,最大累加值就是N*0xfff。若N=2,则过采样最大累加值为0x1ffe,若N=16, 则过采样最大累加值为0xfff0,图中红色栏的最大原始数据就是这么出来的。灰色区的数据表示针对过采样累加值做了适当右移后还是无法存放到ADC数据寄存器,对右移后的数据做了高位截断后所得的结果。显然,这些数据往往会出现较大误差,因为这里是高位截断。一般来讲,我们在应用中应该避免这些情形。剩下的其它数据就是基于不同过采样倍数的累加值做适当右移后的结果。 有人或许会问,过采样的累加值就相当于单次采样结果的倍乘,对累加值进行右移则相当于做除法,为什么要倍乘后再做除法呢? 提高过采样率可以通过对多次采样值的累加来降低各种随机误差并减少量化误差,从而提高数据准确性和分辨率。选择对累加和进行右移处理,往往是需要在提高分辨率、保证数据准确性方面和防止累加结果溢出、实际精度需求之间找到一个平衡。 比如,我们对一组学生做多批次的考核打分汇总,多批次考核的一个重要目的就是尽力挖掘出他们的真实水平,但最终排名和选拔可能并不直接使用原始总分,而是基于总分乘以相同的权系数,这样既能考察出了各位学生的真实水平又能分别出各位水平的高下。 过采样率越高,分辨率固然越高,但耗时也越长,同时还得考虑实际寄存器的存储位宽限制和实际精度需求。所以,关于过采样时的过采样率和右移位数我们需要根据具体需求综合考虑后拟定。 四、使用过采样可以减少单次采样时间吗? 选择过采样后,应该说可以在一定程度上减少基于单次采样的采样时间。因为过采样通过多次采样值的累加可以提高信噪比和分辨率,对于单次采样的精度要求可以相对降低。下面两幅图是我使用STM32G4片内ADC的vrefint通道在单次采样时间明显不够情况下,分关闭和开启过采样的转换结果。
从上面实测结果来看,尽管单次采样时间配置不足,当开启过采样后转换结果更接近真实、更稳定些。当然,如果基于单次ADC的采样时间明显不足的情况下,即使使用过采样也不能保证解决单次采样时间不够而导致的问题,所以在做ADC时配置合适的采样时间是必要的。 关于STM32 ADC过采样的话题就聊到这里,供君参考。下次再聊。 文章出处:茶话MCU |
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32片内信号的ADC应用演示
经验分享 | STM32F0 ADC结果挪位的问题分析及解决
经验分享 | 三个 ADC 同步模式配置以及 CubeMx 错误配置的解决方法
经验分享 | 为什么ADC结果出现断层?
经验分享 | STM32U5 ADC+DMA配置演示
经验分享 | STM32 ADC模拟看门狗应用演示
基于STM32使用ADC的多通道采样经验分享
基于STM32利用ADC+DMA采样显示经验分享
微信公众号
手机版