
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。 下面和大家具体分享一下软件配置步骤和注意事项:) h7 ^- I) x6 i9 s$ j. z- O x0 e4 h 一:过采样的基本知识分享: - l7 c! Q' `0 ~$ d6 z 1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。 二:软件配置步骤 , b2 Z1 R( q7 @" S A/ U. E( t6 { 2.1 配置ADC 1 [/ i% w, ? B8 q2 g. { 选择ADC通道:确定要采样的模拟输入通道。 " D0 l, F6 ?+ B; v+ N 设置采样时间:根据信号特性调整采样时间。 ) K/ s0 r3 F, ^$ F 配置ADC分辨率:通常设置为12位。 2.2 配置过采样 ' I, v- D) y8 d+ p0 M 设置过采样比率:例如16倍过采样。1 C$ K$ x* `/ J, H0 i- o. W 设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。 W* Z; V! F; T; d2 s; [ # G- Y! H) V: s' _ 2.3 启动ADC ; w3 a- g$ g% B, c, Q 启动转换:ADC开始采样并存储结果。 % J3 I' h" {3 o {3 ?; b4 R- o 等待转换完成:通过轮询或中断方式检查转换状态。 2.4 读取和处理数据 6 ?, h5 b0 b. L2 Y' b( z 读取ADC数据:从数据寄存器获取采样值。& g; i) X6 P& h; a8 K 6 e5 |# V! V6 D# B$ j 计算平均值:对多次采样结果取平均,得到最终值。6 z. S7 B f3 G0 a- F9 ^# p STM32 cube MX 软件配置如下: ![]() 7 y3 \, ` X1 A( Z- F" J m. o 主要代码如下所示:* Y8 T- ` [6 |6 u! E8 c1 }( G' j9 T ![]() ![]() ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用: ( W' @( \: ^2 I8 S3 m3 x 第一步:启用 ADC 过采样:比率 16,位右移 4。 ( I8 k( w( r% D! X$ ]/ l: g" W 第二步:启用 ADC 过采样:比率 16,无位元右移。 第三步:禁用 ADC 过采样。9 |' H) H# z4 A. | : V/ j1 K E5 y" O$ _ 程序循环执行,上述步骤代码; 示例执行: 在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。 $ }: \9 A, C# q0 P% Q! F 然后,对数据进行评估:" j; Z v9 J! T B1 _/ B 数据范围有效性检查 用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。6 v$ s8 U/ ?+ |' S) p - G: H) g8 v9 d9 I I 对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。& C+ R" \& P, S' Q/ w 程序仿真效果如下所示:! W' ?. P5 s( w6 q ![]() : n% k* E& |7 k+ m7 y- B2 W 注意事项: 噪声水平:过采样适用于噪声较大的信号。 n/ W0 x" n( J: H0 J$ l& J 采样时间:确保采样时间足够捕获信号。' g: q U4 H. m" w+ H 时钟频率:ADC时钟频率需满足过采样要求。 项目总结: STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。+ n% y5 o+ F4 n |) _0 N# I- | / }, |) s+ |# I6 N; t 几种常用得滤波算法分享: 7 ?! T: Y1 W' {' X" h) Q" n% J: {/ d" t 1:一阶互补滤波算法: 5 \ S, U0 b" U3 U& m 取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据+ G) |5 @. T% x+ N5 @& ], O 代码如下所示:: B7 [1 g7 W% T ![]() 从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。0 g4 W- x3 j3 k/ B" M 2: 采用中值算法滤波 主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。 # a- s* y( h5 c( j0 D 代码如下:& {2 |$ X4 G8 q D% N- j ( E( ]& o: Y' _( X% [7 d ![]() 3 x4 `# X8 Q8 E" `9 d/ R' q 可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;8 r# o9 b. G$ ] + I$ n) v* @8 Q" U 3:算术平均数滤波 连续取值N个数据,对所有的数据进行取平均值;9 _5 E0 [/ @1 v/ I% x3 ] 2 K, ?/ |: g4 h) c% f, [ 代码如下:. U4 f/ Q8 H. x7 O( w f2 N ![]() 这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意; 2 L; ]% e* S( e9 w2 L9 i 4:滑动滤波算法 把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果; ![]() 好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。 |