
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。* u7 F0 o- f/ z; K" E b8 l" V 下面和大家具体分享一下软件配置步骤和注意事项:* m s6 J8 G) D$ s7 W* ? 一:过采样的基本知识分享: , [: R$ c: T( H2 v- @+ a 1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。4 _4 ~ R; a C 8 n) @, U3 a6 x) I7 @ ]3 t% c 二:软件配置步骤! s$ d! S3 o4 l0 i 2.1 配置ADC) Z f/ F, i) K2 J+ V1 y 选择ADC通道:确定要采样的模拟输入通道。% n6 A/ i7 ~4 Q1 {- g& W/ @9 `! ~ 0 d7 |' D! ?8 f 设置采样时间:根据信号特性调整采样时间。 . ~+ s( M. S2 S# Y) V 配置ADC分辨率:通常设置为12位。 + {! B2 b& G6 a! y7 H3 ?/ O 2.2 配置过采样' a9 P/ P T( j8 u# \/ `, Q. \0 g/ ` ' [; M P/ g* e7 q3 S- U+ l" B 设置过采样比率:例如16倍过采样。/ A/ X1 B0 W; |9 b6 M * E, m& z* ~* X7 _0 G) [! Y 设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。( R- W5 R1 x. ~% T2 i & Z( I1 s! m: J) r0 ]+ } z; \+ X( o/ r4 l 2.3 启动ADC . I H6 }) Y" W6 x/ x$ N, L 启动转换:ADC开始采样并存储结果。 / n% D. z0 k' d* G 等待转换完成:通过轮询或中断方式检查转换状态。 2.4 读取和处理数据 读取ADC数据:从数据寄存器获取采样值。! N+ f3 K/ u3 ?' s 3 j+ d0 {* [& T* u2 A 计算平均值:对多次采样结果取平均,得到最终值。: {) B6 R3 t) q3 g7 Z STM32 cube MX 软件配置如下: ![]() 主要代码如下所示: ![]() ![]() ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:$ k5 @& M; s0 N" g; M' F 第一步:启用 ADC 过采样:比率 16,位右移 4。 0 `/ H! `! O6 X2 \5 T 第二步:启用 ADC 过采样:比率 16,无位元右移。1 }# j& m! R/ g! n& K 第三步:禁用 ADC 过采样。9 b7 y6 ^9 Q# c 6 y# r% [( V* p+ W. e 程序循环执行,上述步骤代码; 示例执行: 在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。8 i( \5 s# {- c 然后,对数据进行评估:. b9 x+ s5 @( T' G # c9 I: x3 P& y8 N9 C$ N 数据范围有效性检查& h7 F2 U5 v3 v# W3 G 用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。 对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。 程序仿真效果如下所示:2 R. b# @2 p' {4 y5 M : |! K4 \/ E2 L% `" K# Z2 R! m ![]() 0 g; ]3 _. G: H; O' O+ q$ W 注意事项:8 ]( Q9 \, ^+ K- k9 e 9 Y# w; {8 {% |* K' k7 { O* w 噪声水平:过采样适用于噪声较大的信号。 采样时间:确保采样时间足够捕获信号。 5 }# Z/ b+ y7 C! O 时钟频率:ADC时钟频率需满足过采样要求。 项目总结:% _ }& p7 t6 l1 H# r: s+ i2 l 8 I! u# a4 l' Z! [ STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。 几种常用得滤波算法分享: 9 [6 Y' e! A) y1 `& E- Q( e 1:一阶互补滤波算法:' `# X" q' o( `# \ , G8 O4 `2 [; [) J1 T 取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据" N8 L+ v1 N* Y6 s+ j" { 2 t, x$ U, P4 D 代码如下所示:3 Q3 f* _2 C2 ~7 ?0 u4 ^# U x ![]() $ b% e }7 B+ ], y: c3 s 从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。7 k3 ~( q3 Z/ K5 n7 } " s' u- a+ C Z! _" E8 g 2: 采用中值算法滤波9 V+ h. S6 Z9 F1 y; E 主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。( [! x) b3 @7 r9 b 代码如下: ![]() 可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;" A- s/ ^/ B0 T# x j 3:算术平均数滤波* W* r& m, |0 ?7 w; }, v. y; u , Y( \6 S0 C: z* `6 } 连续取值N个数据,对所有的数据进行取平均值;$ x8 i% e3 j# p* o " i, ]: @3 a* D1 a/ f 代码如下: # P% _4 H) B6 s, Y. y2 T" {6 g8 R9 P ![]() 这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;2 J" `1 N( p9 D* j1 z$ } 4:滑动滤波算法& A4 n2 S( B& ?7 t! n* ~ 把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果; ![]() 好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。. l6 s: Z0 o! g |
STM32的启动模式配置与应用
小马哥STM32F103开源小四轴RoboFly全部资料大放送
分享一个STM32L031的串口调试程序
基于STM32F303双电机FOC驱动: 无感原理图/BOM表/代码等开源...
开源基于STM32F303的机器人双电机无感FOC驱动参考设计
STM32固件库分享,超全系列整理
STM32F10xxx 正交编码器接口应用笔记 及源代码
分享一个STM32F103的硬件IIC代码库,完美解决IIC问题!
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
MultiButton移植到STM32F103战舰开发板