|
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。" C$ {- i* h/ O8 Q9 h) ] 下面和大家具体分享一下软件配置步骤和注意事项: 一:过采样的基本知识分享: 1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。 5 f- f7 t. A! N( w9 G 二:软件配置步骤' p" H* @: m0 k+ t' n% Y 2.1 配置ADC: h) a o. X6 v+ }* t 2 e, u! w* u9 i. X, t' \( |" Y. A 选择ADC通道:确定要采样的模拟输入通道。 设置采样时间:根据信号特性调整采样时间。 ' o: x2 X# o7 O5 F0 o 配置ADC分辨率:通常设置为12位。 2.2 配置过采样* ?) }4 v, C4 n 设置过采样比率:例如16倍过采样。* a; j/ q- Q! \$ C/ G$ ~# ^$ ] k : `6 F8 }5 s) r/ X/ M" R: z 设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。 2.3 启动ADC# H: o: P) N4 k" z6 ] ' ~0 |" l8 d. J: B" z 启动转换:ADC开始采样并存储结果。 等待转换完成:通过轮询或中断方式检查转换状态。 ( ^2 m1 F) q$ W4 O! M# F 2.4 读取和处理数据1 N$ H4 T/ ^4 A% D: L/ Q . v& m6 [7 {' d7 P 读取ADC数据:从数据寄存器获取采样值。 计算平均值:对多次采样结果取平均,得到最终值。+ } Z h! r2 ^. n4 L! d) Y STM32 cube MX 软件配置如下:
$ J) s! N# R3 I+ z y9 V 主要代码如下所示:2 q& D$ v1 x3 I2 N
ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用: N9 H7 {: l% U$ _( ? * n, h! z. y5 G g9 ~ 第一步:启用 ADC 过采样:比率 16,位右移 4。 第二步:启用 ADC 过采样:比率 16,无位元右移。) l7 @0 |# O" O + r& G# W8 ]* |6 r( D& M9 b& h* Q4 B# a 第三步:禁用 ADC 过采样。 6 T; N: s$ A U4 I+ l( e 程序循环执行,上述步骤代码;1 h2 W8 ~3 o, P+ h: l" h & v2 u/ u" w5 u9 D& y* b 示例执行: % @/ c) A: L" s* H. m* ] 在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。. O3 Q% U* e5 l0 s s2 | 然后,对数据进行评估: 数据范围有效性检查- S$ Z9 R6 M! j3 F) m 用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。/ z) _: G) r/ x% w5 |8 z1 q% j # a! _( n! j! E7 N 对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。 程序仿真效果如下所示:
注意事项: 6 V4 M3 ~; V' |2 p 噪声水平:过采样适用于噪声较大的信号。( G. D. U% L; E+ ^8 O t+ y+ A3 O ) w" Z- N3 b' _ 采样时间:确保采样时间足够捕获信号。 时钟频率:ADC时钟频率需满足过采样要求。: M1 Q) {* b# q- g' T8 b; B0 S5 X 项目总结:: l7 W6 i" m9 M1 z: b7 t( @( g * `5 T6 Y/ d) ]% N F: g } STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。 几种常用得滤波算法分享: / n+ u/ s) ?+ G. J8 n0 a) e9 J* s! | 1:一阶互补滤波算法:& x% n" C9 ` r 取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据5 b* E/ s" t, q/ [3 Q8 G" |# Y8 e 代码如下所示: & V8 G8 w; W# G0 v5 r2 [! E
从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。. N/ U* }$ g7 @* b4 e * @* W$ A( N! n0 R 2: 采用中值算法滤波 主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。( m9 I/ ~9 n# p$ H/ g. n A 代码如下:
@9 U/ X0 f$ ~/ S% L4 A9 M 可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;4 C K7 |: M/ b! L" Z5 D $ U- |8 _4 `' M4 S# O+ n 3:算术平均数滤波 连续取值N个数据,对所有的数据进行取平均值;7 R. `4 T* x( N& V) x# s3 T1 h 1 Y: l7 c% U3 z9 R9 ^6 Q6 D/ | 代码如下:$ s; C3 A0 W/ s$ J
这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;, v5 @/ B. q: g$ ]/ I 4:滑动滤波算法# a: x7 W4 J/ I @ % f3 j: }1 \( S) G( W. S: c 把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;3 n* u' t) l7 \! [+ y
好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。+ P9 ?2 V& u( a3 T" D4 u# k , ~# }$ i, I2 D |
实战经验 | 基于STM32G0B1的全桥移相+同步整流PWM解决方案
STM32G47x 双 Bank 模式下在线升级
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:逢7发帖赢大礼】8、基于STM32G070板子的Ymodem串口协议IAP Bootloader开发
【福利三:逢7发帖赢大礼】7、基于STM32G070板子TF卡的FATFS移植
【福利三:逢7发帖赢大礼】6、基于STM32G070板子spiflash的FATFS移植
基于STM32F303双电机FOC驱动: 无感原理图/BOM表/代码等开源...
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:逢7发帖赢大礼】5、基于STM32G070板子IRDA红外遥控接收解码
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
微信公众号
手机版