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

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

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。
. }& [# R7 Q& e7 G: e7 W& |4 A+ M9 S% y: U8 l* f; Q6 v- b
下面和大家具体分享一下软件配置步骤和注意事项:
) G$ m% g& p  F- y一:过采样的基本知识分享:# f! P$ A9 o- p

9 r$ ^: p4 p0 T* _# P1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。; _9 x/ W/ Q, h

/ Y0 V5 ]( ^& n1 v( @& N$ g+ |二:软件配置步骤
3 m4 b$ H+ U# U9 o/ n$ D) p, r
' t( _2 ]4 ~# N# C2.1 配置ADC
( N3 u) }0 R1 }! X, G* M# N9 E9 b! y8 b! U& a9 z9 ~7 T
选择ADC通道:确定要采样的模拟输入通道。
+ R$ W8 E, a( M, l- V2 ~* h4 W
& J) F" S- Z3 o; y设置采样时间:根据信号特性调整采样时间。
) }4 z, t% {: u; _' `. V
% D; m6 V8 K) f" Q$ _配置ADC分辨率:通常设置为12位。6 i' r5 ^. @0 _" t0 ^. m' m

. f1 t+ V, I, l2 d! |2.2 配置过采样9 G9 y& _# w3 U9 u
* M# {* U/ G$ x
设置过采样比率:例如16倍过采样。( F* e& F' D0 H1 W( a  T* [
( x( n0 |5 d6 W2 U: A1 ], z
设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。" B1 \+ K# S) U- U

6 |( p" e6 y' D3 O: c0 h, V2.3 启动ADC
2 s$ H4 i! T5 P
3 T/ D( U% R6 A1 d启动转换:ADC开始采样并存储结果。
$ E) n" {0 U, L* R5 ^
$ I, D" P* G# z+ q. H* }7 h等待转换完成:通过轮询或中断方式检查转换状态。# Y3 m, H2 ^' i& Q" v0 L! t3 i5 d

* Y4 B. c4 g! e2 J3 ?/ u' C2.4 读取和处理数据
( E$ |2 `8 V/ @/ k2 f3 a. p8 G
3 K3 M8 a/ |3 A- r读取ADC数据:从数据寄存器获取采样值。
' f( L, u# v+ f! w! U! B4 e+ D. w$ F1 |7 k# X
计算平均值:对多次采样结果取平均,得到最终值。+ P& |, c  o; ]

! w* H( {) v# O1 F0 wSTM32 cube MX 软件配置如下:8 `9 j  E# ~4 i4 k5 o+ ^7 m

$ L5 J6 }  R( y% c6 x 1739758927294651.png
: u$ O0 I6 o, ^0 U) x' K0 x1 [0 C, Z( O) M7 L" m$ p
主要代码如下所示:
7 ?5 s6 G1 ^+ [% ~4 [' r& b" Z
- _1 r- P1 R$ D8 e$ s 微信图片_20250305101856.png ) E: B/ E$ Z4 t: B9 J* p
微信图片_20250305101903.png ; q4 m+ Y6 E; J  j" v( n  J  v& w
                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:
0 ?5 G( N9 u" q$ Q2 O# x  M  d" G5 x& ^: D
       第一步:启用 ADC 过采样:比率 16,位右移 4。
5 h* m6 D3 e8 i$ s5 I/ n$ I
0 M; s; l3 O$ n" n' ?* v       第二步:启用 ADC 过采样:比率 16,无位元右移。
) A1 j7 o! E2 _+ f% e. T4 ^) |4 }# p7 h
       第三步:禁用 ADC 过采样。: H; {8 Z) a* v* z
3 `" }: s+ I) o! Y3 Q( S
       程序循环执行,上述步骤代码;
3 A5 z" }! B8 M& f, L$ ]; }3 w# c1 J
        示例执行:0 F; P7 v2 K3 p' @# [4 k6 h
4 N% f5 P0 D, T/ g( ~, r- ]
        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。* t/ [( g! Z' ~9 q( M

* d- x5 i1 ~/ w9 j6 @0 W1 ~* [2 ~        然后,对数据进行评估:, b  y5 R8 G% g* Y& ^" E* q, T- c( U; w
7 m, u8 R( C0 @" u) }
         数据范围有效性检查% Q5 {% h( s3 X% `+ J& Q/ M

; f: j/ b; W" x- P# f# t, h        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。7 C3 a1 Z7 s5 Q0 W# W

+ D+ g* |$ A7 Z+ r        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。
+ _# m7 G5 _2 M  X: G
6 h$ S5 U6 o6 Q& P# r/ W         程序仿真效果如下所示:& q4 Z; y' }6 q8 A- B% t
- z! ]) D4 p+ m. B, M
         1739760381181705.png
- n' o4 \$ k' u7 D, l7 H# y4 n
9 w3 n9 T9 w1 F% m& z* V$ q% s; @                                                                                                                                                                                                           注意事项:
" m. J4 V- ^) K  M2 t  }7 s* s; u/ U
         噪声水平:过采样适用于噪声较大的信号。
% u! ?0 R- U2 k/ @9 }' @* w+ z( {5 h
        采样时间:确保采样时间足够捕获信号。! C2 Q- i9 K. d

3 S: t: Q, s# H  U4 w- o4 w8 B         时钟频率:ADC时钟频率需满足过采样要求。
% j$ U2 W$ R5 A. c/ D7 v
$ g6 N0 h6 s  R5 s% v          项目总结:, ^+ ^: t7 r% H* _& b3 r8 `: n
8 Y" D& m& x8 Y" r/ h) ^
          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。
2 D. r0 M6 m: g  R* a
" W- |& p" V2 Z' j; ?+ f% \+ |         几种常用得滤波算法分享:- A) j& b. r; D9 h7 n

1 N7 X1 B3 X7 p         1:一阶互补滤波算法:5 n- ?! M1 k) j6 Q) G% m, R" V

' F* ^1 v4 G* ]. _3 Y2 F         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据
9 g; R$ `. }( k& y( m( @* k- P
         代码如下所示:
- C8 _+ X9 U- I  f5 w$ ]! k. l- q: }0 D9 b! m+ s
          微信图片_20250305101911.png ) m; a: U0 t9 a. R: ?" Z3 f
: U& s' U, X! \7 B
         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。
1 J! d' D( h- d) j' ?1 I7 F1 [/ t) b
          2: 采用中值算法滤波
! ^" z4 ]+ B$ i, w' D! L& J; w: o  M  n0 N
          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。5 @+ h- o8 s9 ?

! S$ V' G7 n/ S- ~5 v          代码如下:
' s& {' X$ z- b  d. Q
. K  U2 D+ l% Z7 f- N! R8 ~: E   微信图片_20250305101915.png
2 ^/ D3 W# s* d
, K, D" Q' V; [, D2 S
) ^8 u# S+ e2 z5 h& B可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;
4 l- X9 {( j# m6 Q8 `& ]: [7 _" o% G+ I- b& [5 B* l) Q
        3:算术平均数滤波
6 l9 p- j! z$ R
  q0 h6 o# \: `        连续取值N个数据,对所有的数据进行取平均值;
, A1 z! D4 ?$ x$ v$ Q& Z- u0 L3 D0 _& g8 U5 y
         代码如下:
: t% j1 _0 }# z% p; q  E* K2 q5 a) k1 ~  j( Z1 o( |
        
微信图片_20250305101920.png ' P& Z6 Q- T- @7 s4 h
                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;2 N2 i9 }+ v, [5 ?# G. p: i, |

8 a( [5 ~0 ?6 B) M% g- ^         4:滑动滤波算法2 W. j3 }' w; S; K, W$ c% s

1 I! S& Y- @8 l* k! F" S& B          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;
& z9 ~. K: e: x( n  o" H& P
微信图片_20250305101925.png
6 E( r8 s. n& L1 N; C! h                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。
# u6 k, u9 R3 n: _- E1 m
4 u: x/ O9 B4 \  A5 ]; X" u2 ]# ?
收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版