|
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。 下面和大家具体分享一下软件配置步骤和注意事项: 一:过采样的基本知识分享:& f1 U# k7 Q {2 |) D }* R0 R# e& m! F 1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。: v, i9 B& d! v ( Z; m/ T: U7 \ 二:软件配置步骤" ]; Z6 e- L2 H9 W 2.1 配置ADC; X# ^1 Z. }: x9 N# F 选择ADC通道:确定要采样的模拟输入通道。 4 ^1 w. b( n' @; [, s) j. z& z. O 设置采样时间:根据信号特性调整采样时间。 8 z N' ]$ M; \5 V1 Y, t6 t' | 配置ADC分辨率:通常设置为12位。 8 u/ e2 O: |, a/ q- V) d' J { 2.2 配置过采样 设置过采样比率:例如16倍过采样。 2 u V4 H' }: ^+ [ 设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。 3 t& Q& c* A. L! S' y- i 2.3 启动ADC, z1 Z# a: J) z 启动转换:ADC开始采样并存储结果。3 H d' A/ _5 q" Y( y& V5 k 8 M( g1 M' n9 ^3 X7 C7 U, F 等待转换完成:通过轮询或中断方式检查转换状态。* g2 Y* N7 a# Y! M 2 k, d5 K6 ~) F# O' f 2.4 读取和处理数据 / T3 H9 d" k( s; V0 _% Y( e, T 读取ADC数据:从数据寄存器获取采样值。 计算平均值:对多次采样结果取平均,得到最终值。 STM32 cube MX 软件配置如下:* f. T1 v( [5 o) A' Q+ ^+ @3 s / S0 i0 {5 v( H6 \' F
主要代码如下所示:
ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用: 第一步:启用 ADC 过采样:比率 16,位右移 4。 ; D: C7 e. }* p3 l. E/ m 第二步:启用 ADC 过采样:比率 16,无位元右移。8 Z; Q8 \6 a& w 第三步:禁用 ADC 过采样。 / Z" j: b$ U" }! T# L. I 程序循环执行,上述步骤代码; 示例执行: - c" L C% w+ U8 h 在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。 ; S1 Y, z! {- t* b 然后,对数据进行评估: 数据范围有效性检查 0 C5 W E, v1 C6 |; K! I 用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。 ; {+ j' s! h: s. t5 j: V 对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。+ G- }( i [ f, X" e1 F2 E2 z 程序仿真效果如下所示:# a$ `1 i* b5 T. m! } o( e: b4 P 0 e6 u' K) B9 S0 F3 p% s
注意事项:8 z! X$ Q4 B' c, ` 6 b. q j2 v+ Q 噪声水平:过采样适用于噪声较大的信号。 采样时间:确保采样时间足够捕获信号。 * [5 c& I" M. q; C1 k% e5 l. M 时钟频率:ADC时钟频率需满足过采样要求。& L% u0 n2 r- e7 _ ^- ~# K3 ] 项目总结:7 p1 h9 c8 A% t8 P+ ]) n 0 f- p& i. t s STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。 , [9 P0 \' k/ @3 n R 几种常用得滤波算法分享:- D! Q- g; e9 B& U4 e9 L3 v, B " S$ X/ X3 k3 u/ } p% L% U$ \; y 1:一阶互补滤波算法:% u/ q% J: \. Z- V+ ]) D3 ? ( x3 ]. t5 ]* g( P& T: B 取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据. Z$ G, H+ V/ Q! d+ K9 u2 g m' }: x5 S! J) w _3 m 代码如下所示:/ T7 l$ K) K$ U
7 M. \# Y$ W. m8 P7 D* _ 从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。3 J- i$ w- f, [0 N o ' A/ S6 g9 v, @* b N; ~& B& q 2: 采用中值算法滤波 主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。 代码如下:- c: L' u' Y6 N 2 a2 d" n& s. u5 u
; w0 b" ?- A) ]: Y: Q/ ~ 5 S6 a: f0 T+ B3 X0 ~6 J 可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好; 4 e4 I3 ]' }( H+ r# g+ r% { 3:算术平均数滤波 连续取值N个数据,对所有的数据进行取平均值;3 E% T8 u$ s9 \; Y. w7 F4 c$ ]2 T 代码如下:0 o! `( u* Y' ?2 Y) |9 N
这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;4 e, f+ V c8 f3 u' b. N W' t / S1 }8 F2 m- F( @+ | 4:滑动滤波算法* P- x X! d8 d& R" k1 d' B 把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;
好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。 + V+ @# J4 S @% z/ t u1 H2 B( u |
经验分享 | 基于STM32G4芯片TIM+SPI+DMA应用示例
实战经验 | 基于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红外遥控接收解码
微信公众号
手机版