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

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

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。
5 h4 t" L  U7 w; m  A9 F, `
' y+ p$ ~& y6 W2 A  M7 @1 Y6 V% A, z下面和大家具体分享一下软件配置步骤和注意事项:
5 a1 n: _. x& a& V  B$ }- p/ O一:过采样的基本知识分享:8 w4 t4 @2 `3 ], _6 Q% D

2 _9 l! R8 [" Y+ u, P" B+ F1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。2 c6 D7 K, [: v) ~# g# L1 b

; Z7 Z9 g" s+ M& _. R/ R9 z( ]6 H9 A二:软件配置步骤+ A7 t  A6 o! y6 P* `5 `
5 {4 d- n, P$ j! M7 H& g
2.1 配置ADC+ Y" Y: P7 ~9 h6 x+ F/ Y6 |

& K8 g. i: O; j9 q; ?' u选择ADC通道:确定要采样的模拟输入通道。
& o) G" Y" g; H+ T/ `4 W5 |
6 P) [+ t$ {0 B% i+ i设置采样时间:根据信号特性调整采样时间。
9 V( k; I; A% o- P  J8 j% ^' p; A5 ~, w$ x, x6 _
配置ADC分辨率:通常设置为12位。0 \9 G5 {) M& l- a4 z

. |" k2 E9 K+ k! y- a, |  M2.2 配置过采样$ }9 q, g+ X# g& u9 L

" S, D8 r! p4 W2 m设置过采样比率:例如16倍过采样。
3 W8 L" g. {1 W. J3 ^; `" H% S
1 u8 k6 O3 X2 p2 P0 t; _# [设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。
2 q2 U! x0 T$ j$ D$ Q3 n, u/ }% N9 V* B) m- w2 m- S( i
2.3 启动ADC
' _) M% B) U. U& R7 [# V2 D- a7 w! c
$ ?7 o- o/ K# Y启动转换:ADC开始采样并存储结果。
$ y7 I" H* E) m& H5 k
: ~8 f; K6 k8 `等待转换完成:通过轮询或中断方式检查转换状态。
% X# s: D# u+ r- s  @2 v, l( f/ O5 r/ h4 z+ Q1 |! J
2.4 读取和处理数据8 s5 h* T3 ~& T* j

6 D- G0 X) d/ t9 r5 s5 y读取ADC数据:从数据寄存器获取采样值。
, C6 f3 e/ O% f: a; \% v- O% l, S, b+ k# N4 Z1 c/ j1 l
计算平均值:对多次采样结果取平均,得到最终值。# E7 k0 F! Q4 T& M/ [

8 U+ Z' }- U1 L2 kSTM32 cube MX 软件配置如下:
! k5 h- l& u9 c6 v  @5 E; J. s& y( ^9 x( E" i% G/ Y6 n
1739758927294651.png
6 j( O1 B5 J2 _; [( u( D! M' d4 X; t
  ^7 y0 u! s) d) @主要代码如下所示:
4 U, W* Y  B6 @5 @: b' w% V5 z1 [- J4 I0 F$ r; }/ d/ E
微信图片_20250305101856.png 3 M/ C* Q5 i7 p1 D1 }7 K% B: K5 E& Q
微信图片_20250305101903.png
# [& f- b4 o4 T3 c2 O6 l                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:, p7 A7 S; W7 \
7 p0 s+ s. N$ Y$ H3 S6 P; l
       第一步:启用 ADC 过采样:比率 16,位右移 4。
' D# }: A5 R8 W1 h9 F) ]3 m! @- }# C
       第二步:启用 ADC 过采样:比率 16,无位元右移。
; R2 y9 z, p' l: R% k5 k- Q7 ~  {" ?7 N# w
       第三步:禁用 ADC 过采样。
/ T% s$ e1 C& \) B) r$ _- E$ W" o8 m, p
       程序循环执行,上述步骤代码;
$ w% a, p; e( I/ c
) [4 v" r7 N9 R% X0 ~        示例执行:5 e$ @: S4 q3 S

* }; ?- x0 e3 F        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。
. O5 \) a: N3 W- f/ P+ q0 |( p7 Z1 T8 a; K* V
        然后,对数据进行评估:
; [2 `! e/ C$ V# @. h7 V5 n4 S+ W. F: n9 }; Q7 w9 M- ?; X+ H! X
         数据范围有效性检查7 u- j$ o, J1 H4 G1 R  A& L( \
0 X% _3 @7 w: N$ n  S/ F" `9 j
        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。) c2 D( T+ w' X' `5 A$ F9 R+ x) Y

, }& W6 m9 j; T# X4 j        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。
. J1 F5 F9 D/ {* S4 V1 b" C4 J* z
         程序仿真效果如下所示:
; l$ c' c% c- J+ y6 n0 }/ {1 b" v- q2 i  E( u. Q4 Q7 g2 q
         1739760381181705.png ; h, t, |: Q1 A' s1 x/ e

* V; y/ f+ A% Z2 h) ?                                                                                                                                                                                                           注意事项:& ]; S# R/ p0 A# }% r3 D

8 m2 K; u* e& y  s         噪声水平:过采样适用于噪声较大的信号。) j, O( E3 N: n9 o" u2 a
1 q4 j: M& U/ F* Z' Y
        采样时间:确保采样时间足够捕获信号。
9 u5 r7 [1 X2 W1 G/ }, b' `' x* B  \1 }( X; c: ^* A$ A
         时钟频率:ADC时钟频率需满足过采样要求。
5 C. g# c' ^6 h7 j$ {, V" k- [! M: d8 _
          项目总结:
9 m  ~1 }0 d1 F+ m4 I1 F9 x1 T
% x$ {- S8 A! o. @% C          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。
5 |0 @( l6 ~& P0 W2 B( F
* p0 X. i4 s1 L& |& [         几种常用得滤波算法分享:
: z  d3 @' w; _) {4 @
# g6 \% {& F$ f. q         1:一阶互补滤波算法:0 b+ y4 L" R- |3 Z5 n/ t
; m( a; K; U9 I# f( C
         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据7 W2 |! j# W6 M# N7 w) b+ }: c

8 g  M% [- _% f! Z' P# j! T9 t         代码如下所示:1 {! {# G4 z6 @8 ?; P8 l: }

5 v  h4 D, x% w6 I          微信图片_20250305101911.png
& i  ?# {$ |6 [! ^7 U
- C# q7 Q* r2 N- A  \0 D8 I7 H) y         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。6 o0 i! y8 j$ W
; O$ e4 ]8 Y7 k+ r; N
          2: 采用中值算法滤波8 q0 y; L9 e5 X$ D7 b
4 W4 w" ~2 v) E+ H$ s+ K* Q+ u
          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。
  p, l3 J% q" a) k) }+ ?/ f. k! j% v% N1 a
          代码如下:0 g& `% A. G$ V$ |, g1 V# Z7 m8 S

9 Y6 b3 v7 v$ `   微信图片_20250305101915.png - `7 i% M* S) s- ?  t" z
& T" }) ]! v7 p: U

5 B( h: s- j, |可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;
" y/ g( N# C- o1 ~# ?. o
1 Y( Y) G4 D& s        3:算术平均数滤波
+ E9 j" }6 y7 r3 U1 ^: n, e# U3 r' I/ f& {! O' R2 |! y2 F- u
        连续取值N个数据,对所有的数据进行取平均值;6 @9 W9 |/ @( K2 b, E6 ^4 S; J- l

! [* R0 x7 T$ H         代码如下:6 W: M  B9 O0 K9 ~- s2 @' r
5 }! {& ?- Y/ a* I% X, Y* I% ^! \; A
        
微信图片_20250305101920.png
# ]% z. o. ^/ a% c* Z2 g4 i6 Q                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;
$ p9 x3 Y9 Y. @! O) C# r
% ^" v6 o$ O- ~2 q% U         4:滑动滤波算法
; Z9 Z$ X3 Q6 x5 R9 Y+ o1 z- d, |) x! x" D7 W
          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;
6 v1 h% d5 h6 f" d* p
微信图片_20250305101925.png
8 R3 E; P' m/ e  o  e                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。8 X6 w7 F& D& g3 d% ?/ ~
; k0 F: g/ g8 M) |4 _
赞 收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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