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

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

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。
6 c; g& `  ~' C2 f: t7 I6 r( ?
下面和大家具体分享一下软件配置步骤和注意事项:
, Q* i  {1 T  ?/ k5 I* I一:过采样的基本知识分享:
/ G  E5 k3 b! ]: C8 C( j3 e7 t& p  G$ Z* e$ j9 ^
1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。: B! x# n+ f- p

6 V0 z. M  [, s二:软件配置步骤+ O4 R+ @' y2 _) h1 D
1 {# i+ B, h( b# a# x
2.1 配置ADC+ v, p6 F- R, k% o/ n* q( X, p$ `

% Q  \. K% v1 g/ E选择ADC通道:确定要采样的模拟输入通道。  t& V; ?. q# `  c7 ?) K3 `9 r
  ?4 m# F7 K" D1 S0 K
设置采样时间:根据信号特性调整采样时间。" a0 J6 g+ @3 \' s  W( v
# x4 q  ]3 X/ A" P& r7 S5 _$ V
配置ADC分辨率:通常设置为12位。
% x8 k5 b) t0 w9 Q4 r
! T4 l9 |/ o( _6 `+ c: K2.2 配置过采样" B& t7 J& C+ e- a( Y6 x  s
( ~4 |) f: E4 ^, x% V, F
设置过采样比率:例如16倍过采样。
5 a: d- X; f2 Z0 P& {
' H' O) a8 T- X设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。+ ?* w+ C! l3 e( S1 w. h
6 c2 A( \: r# F- I- N, |( J" @
2.3 启动ADC
3 v" E. ?# F4 t0 Y
, K' a1 |2 `& K. q8 n7 V: |" i2 A启动转换:ADC开始采样并存储结果。
& G$ T$ {* U  |4 u$ v- P* c, R0 w8 x  R) N) ?0 h# M8 T
等待转换完成:通过轮询或中断方式检查转换状态。# O. Z  D- V2 ]' }& _

- g  |; \0 G- G( k2.4 读取和处理数据
, d2 ^* {7 ~# m* T+ Y- ], J+ A5 `" s  E7 D5 F* X; `/ e2 i1 i
读取ADC数据:从数据寄存器获取采样值。* y8 r) c2 y7 `9 B7 C" v/ p

/ O$ n' Q  Q4 q# f% q计算平均值:对多次采样结果取平均,得到最终值。. {4 `2 T+ L8 q. W
) \8 Y3 o4 J$ l3 w9 z
STM32 cube MX 软件配置如下:
9 R: Z/ O4 D# b( I  F4 Z# ]; L# A% X* i
1739758927294651.png
/ P- k/ p: F+ ]' N$ g9 r& |* Q  {, N! H9 i% n) l: A9 {
主要代码如下所示:5 D5 }: M/ m* n6 M9 S( O2 I

$ T( H7 l8 y9 Z  a9 y: J- ?2 s  n, s 微信图片_20250305101856.png
0 S% C. e* E# w% I/ E9 m  o 微信图片_20250305101903.png & s# t$ ^  F+ ^2 }+ ]3 N
                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:1 O; o$ d* w# S! C6 O9 Z1 E

$ f4 `/ t8 g2 T( ^       第一步:启用 ADC 过采样:比率 16,位右移 4。$ f- y5 J2 [6 Z! Z# l" b

1 j; g9 J  l0 D# q7 j8 i3 O       第二步:启用 ADC 过采样:比率 16,无位元右移。
) n. t% l+ N; N3 Q, M# v2 C
8 n* _2 X. l' b; A7 P0 v       第三步:禁用 ADC 过采样。
3 H( ^' o$ V  [4 y+ s( `7 _
, j/ ?- _9 q1 @  ]9 Y0 y$ s; e       程序循环执行,上述步骤代码;3 H1 C# u$ O4 `' M. U: {& r# t) C
2 \) ^7 x$ h/ }% d
        示例执行:2 C  x2 s+ L" @4 ~, w, T( N$ [

- s- {5 N4 _9 j/ o7 b4 C% u        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。
$ E+ @; g- Z7 b5 f4 g; Y4 y$ R
, u! F2 N: G8 f% H; q        然后,对数据进行评估:
* @/ `0 e( G1 ~& p7 n- u3 E: U9 C5 p* ]+ C  L
         数据范围有效性检查
8 z6 ^4 ^" w  k7 t+ {$ k% B) V, U: N( m4 M
        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。
: |2 Z. t1 ^& S( b5 I
7 [4 g* N& Z8 u$ `' m9 L8 Y        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。
: {3 p, [: t2 E2 }' V1 ~4 X7 P% X2 f# k) W
         程序仿真效果如下所示:
5 ]) Z" j3 |0 h
3 Q2 g" f  q4 A; d- k7 B1 i         1739760381181705.png ' ?0 y$ @7 _  v4 ^

9 p8 a! M3 r* a+ t# N                                                                                                                                                                                                           注意事项:
4 T/ y& v* m" l0 @5 j, @. x; L( ^' _: j6 P* c
         噪声水平:过采样适用于噪声较大的信号。
' F+ V/ I1 j0 H# M5 Z+ T) Y1 |$ `+ e  Q: |/ B8 W
        采样时间:确保采样时间足够捕获信号。9 u) H0 y5 S8 V

2 p, n2 u9 i2 s- N1 \( t         时钟频率:ADC时钟频率需满足过采样要求。( q% z" O0 Y$ B* M& s

! c# J) C1 W, e          项目总结:: Q2 i6 V, G# f* |, r5 L( V: I
8 m* ?. I5 E0 \& h4 j2 E1 F
          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。. w* k7 w& e+ I3 H

& ?; P' ]# l' B5 C* S         几种常用得滤波算法分享:) F* n6 t8 L4 P7 M1 r2 k

' R4 K9 ?  M& i         1:一阶互补滤波算法:6 g& Q* ?1 C& r! o* o' n
, @6 J3 Y2 z; G* H
         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据# W* ]% o2 Z9 ]6 I. U

3 x/ |1 d* d" [9 [! d         代码如下所示:
  @; O9 \; y/ [' H3 U# M. D6 m" s( `/ Y5 A3 I( G
          微信图片_20250305101911.png
# X5 f" n" I0 k! N7 B2 c. _2 c! V7 K
. [6 B  G% e0 d. }4 Y9 i$ i! |4 F5 R$ Q         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。" y) J5 A  t! J% N, |

/ _  i  k; D) r5 \0 |7 `* R          2: 采用中值算法滤波
' {% A! A  B+ A8 u, d3 r& F6 S# i$ }5 l: A6 q+ ?
          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。7 N% \% L7 u; n, [: u& a
* r% |9 m2 L  p. `$ f8 v
          代码如下:
+ k% L: y( `5 Q5 B* s2 K  g/ y
8 [6 }! b7 W) j   微信图片_20250305101915.png 4 m# E& g& H( S5 y( J
0 ^2 V/ y: Q- \2 n( P

% L1 D: x' s' }  i0 c- A  m( R可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;+ k; l! E1 Z9 X3 P2 o- E# ^% x

) M1 i; R# ]' {9 o- U/ h6 _        3:算术平均数滤波9 L; z: L, T1 w5 b/ f* T' {$ c

% k( R% d1 W, q9 A4 ^        连续取值N个数据,对所有的数据进行取平均值;8 \0 K. N% B. u* A! d2 ^
& h1 p9 K6 l) q3 y$ _
         代码如下:! \# ~( r; A/ k
  n, V. ~1 N. N, b) [
        
微信图片_20250305101920.png * Q6 d7 i9 |! @5 }4 r. [
                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;
7 f6 C- [1 h+ z+ W+ C- ?2 o. h- f5 X
         4:滑动滤波算法; D* s# O" f; Z

: A3 `. G9 b3 M, e          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;! q: T3 {1 w4 K; ^/ `% l% ]
微信图片_20250305101925.png 4 k+ _6 R. s, c1 D5 O0 k
                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。# W! A/ s! i  z! ~

: p! M, ~- X* D: [$ o3 h% X% D
收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似分享

官网相关资源

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