你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32ADC过采样及几种ADC采样的处理方法

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。
! e# \2 w6 N" ^! i6 f! T6 M- y0 C# n# z2 U) [, u0 l
下面和大家具体分享一下软件配置步骤和注意事项:  T8 Q  Y' n8 ^: ^$ [( }/ c
一:过采样的基本知识分享:7 l- t+ V- y0 x- z+ O

) d2 ?8 j: a8 B& h2 A1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。4 r) G7 N9 ]! f$ L$ }) x" Y
  p: R* V- v; m! M
二:软件配置步骤% M) J8 u. K: f! ]3 ?0 H
+ M3 k1 @/ @* L) e7 {! J7 D
2.1 配置ADC
6 H5 `* X3 y5 f) M. M  i" t' `, u& g9 b5 @9 ?
选择ADC通道:确定要采样的模拟输入通道。9 f& R' e2 s: Y. X! Q& s

6 U; w- o. ]2 z% ~1 B" r设置采样时间:根据信号特性调整采样时间。8 t' ^. y: ^0 Y1 c
; t' B1 `3 Q( t. _$ ?
配置ADC分辨率:通常设置为12位。
6 {3 _3 Q- z1 S4 Z1 z- P5 |2 S: a) B2 w% v& u2 j
2.2 配置过采样
. d% v6 W( D: d* v  V4 ]( v5 J% X1 t( L0 }4 e1 @% n* ]* Q
设置过采样比率:例如16倍过采样。: i+ o4 {1 D0 R  H
4 D- v) b# j+ ?* |$ J( Q9 C" z
设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。  a" `# H, C  F( }3 V' u" J8 _0 K

2 u, i- I, u( t$ F! q# B5 @7 Z2.3 启动ADC
1 I! ?  `! Y4 ]4 a* M
2 v: e& |/ I2 T# `( c启动转换:ADC开始采样并存储结果。5 o+ k; a/ w( n4 J8 i' t
! j/ ?; D4 {1 D& d5 ?
等待转换完成:通过轮询或中断方式检查转换状态。
) F3 @( G. K2 X6 K( ]$ [8 K- O
- `- k- l! L" \& f& x2.4 读取和处理数据" c  l6 ^7 n4 }  E  F
  q/ _+ s: [+ k* D9 d
读取ADC数据:从数据寄存器获取采样值。
8 A) G2 g. s: z% w
0 C7 s- i# A! A& c% l计算平均值:对多次采样结果取平均,得到最终值。
. @+ I7 V3 \1 @  z
' y/ d0 L# X7 f* @6 M  CSTM32 cube MX 软件配置如下:5 E# V) u6 x5 I9 x" z/ m" j

  Q. `7 `- x4 _# u0 a7 l0 J 1739758927294651.png
# p4 h7 p$ g/ L: Z) v- Y4 l' B0 }9 r, s
主要代码如下所示:& f$ n& B8 Z+ \

6 X4 m  d0 @6 h4 F 微信图片_20250305101856.png " r! J/ Z' ~/ r, f- r, L. i% ]
微信图片_20250305101903.png
" E, q( r4 l' W/ |' v                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:
/ @; U# T4 K/ l$ u. K, g
& c) p; h* @2 k/ `       第一步:启用 ADC 过采样:比率 16,位右移 4。# R2 W9 G3 k# F5 D2 [2 u2 [4 d
" e$ l! \! a# m" \
       第二步:启用 ADC 过采样:比率 16,无位元右移。
% b1 ?; s$ P3 \1 }# h6 n6 h! s3 ?+ i+ ?! a) r2 i
       第三步:禁用 ADC 过采样。
  e! q% [3 w. t& X, T; k, ~. j+ r  C: u1 ^
       程序循环执行,上述步骤代码;. ~9 z6 k3 N9 x2 a: v! o; S

5 s" ~- P8 S) m$ X4 T3 z        示例执行:, V0 W6 f  S8 k3 m; q
2 l  N/ J4 h' d$ g  \% R
        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。
5 L' n, v1 G4 N
" ?  N% s6 {: P/ r, S        然后,对数据进行评估:* `& X6 X- N) f& X
0 l7 u# L. ~3 D2 I
         数据范围有效性检查+ i3 ^1 c- b4 |/ E+ {

6 y: i# ^% X) h: b: V% u9 A# E        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。
9 e, n8 f. ?8 ?2 t- h* D, w, S/ [+ o/ T' v" s, {
        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。! x$ x9 L- h9 }6 V5 }# V5 l
. E9 F! a  C) U8 z8 U. d  d2 M
         程序仿真效果如下所示:, e$ e1 e9 v. g( W  E

/ `7 d. U) m) _, r. `; h' }% }         1739760381181705.png
. z2 a7 u3 c5 K( S; }; M6 u' C" F/ F; h/ f& n) N0 O" |
                                                                                                                                                                                                           注意事项:, y6 ]: p! h5 _/ Z
# q7 C9 P; G% R; i9 \
         噪声水平:过采样适用于噪声较大的信号。0 ?  J6 l' F6 ^8 E0 H

5 a% {/ s. Y/ V" g* R' J; B. S        采样时间:确保采样时间足够捕获信号。1 o% R% G$ B( R6 _( p# u; A6 w
  j  S& ~+ D) q% E5 c$ [3 a) Z
         时钟频率:ADC时钟频率需满足过采样要求。
+ ?& e* {5 z# O) W/ Q
5 ~' C( s! Y3 g& ~          项目总结:- S* Y' a& m, O- T8 m1 ^( @* n

" l! P) T5 C7 N5 q. Y( L          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。' G+ F+ r7 Z7 h" w
( L0 a0 ]; q' ~5 i8 a
         几种常用得滤波算法分享:
( n; g. X5 V* V) m6 L9 K# k7 o# L
' L  D4 M" p, F% H1 H' I         1:一阶互补滤波算法:6 N- ~$ b3 J' d, j& K) A% h2 C; w
+ h* o, m+ W9 m8 T- H0 J5 h. \
         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据
- \. s" j2 J  y4 S, N* @5 D! N  J1 Q3 w3 z: D& N" r9 C
         代码如下所示:# O( Y! f% x8 A, ^' Q/ V
: U( ?( G* T* E. v; d( F6 p
          微信图片_20250305101911.png 3 s, J8 ]3 e# A( P/ Y0 \& A! j
) q" H4 E4 t% o5 L5 I6 H; \9 w& \
         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。
8 v- N! D, i; d# `  _6 z: z/ p8 n" p3 B8 s
          2: 采用中值算法滤波" x) \4 ]9 S( e: k
, c$ _1 m) i5 r% r8 v
          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。0 u! z9 F7 e- Y* j

9 x! X& Q+ I/ F$ g) P: h& e% V  f          代码如下:8 K3 q+ c7 d  i
! p$ ]( `! x/ B; X) c
   微信图片_20250305101915.png
% \5 Z1 j* c: c5 Q. j  M: H$ D) {8 y- I" g% [' J& E/ w! v! T+ }/ s2 Z) `

! v7 U6 L/ b7 K5 C0 S7 t7 @可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;5 R! e! q3 h4 W- K
1 R6 z; z+ P& e4 I: ?2 l
        3:算术平均数滤波/ D9 a5 A' L; R0 d! b
% ?( e9 X9 a! y- s. h( ^4 s9 z! Z
        连续取值N个数据,对所有的数据进行取平均值;
0 v2 `, ^- d& d+ O+ W+ v
! _* _  N& o( ?& ~1 C- e         代码如下:
+ O0 L  X/ r$ l# ?, ?  D$ w. ?7 D# @+ M! v
        
微信图片_20250305101920.png , B; b" X$ o0 v
                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;
9 a% w7 `" V( `  ?/ V
3 x6 @  i+ j; N9 N0 p         4:滑动滤波算法
/ M" a" t4 n' w: \1 M0 k% K  K1 k6 X6 ?$ Q5 |
          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;8 D, y+ u* n4 N/ R6 r! H$ e
微信图片_20250305101925.png
- ~5 x+ a2 `+ s" q# j7 k                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。
- Q9 t* B/ @5 C; u( N

& U1 B5 W3 W& R0 }7 |  Y+ k
赞 收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版