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

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

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。- T8 b& G' r0 U# I" \
7 X9 T4 I0 _! P3 k( a3 r2 ~! k
下面和大家具体分享一下软件配置步骤和注意事项:2 ~* I3 h; |" |& t/ g/ r
一:过采样的基本知识分享:) y/ O4 a* t" T
$ n& l! f$ p. I& _: v
1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。
0 d9 W3 ~5 ~; G' Z8 [, a; u0 d2 \$ R% _4 A0 [- A# ]9 i# j  C
二:软件配置步骤; I4 P. L. l  h
4 e6 a+ K1 _; M( h' x" S+ e( A
2.1 配置ADC
# z# y: i% J. W- K' E( H3 @
& K" U2 M3 n0 L$ |* m1 l$ n/ C选择ADC通道:确定要采样的模拟输入通道。1 I) }, T9 A- X4 [
4 X: R) {$ C! M' R# R; E- ~/ F) g
设置采样时间:根据信号特性调整采样时间。
. P2 q% E# d! X& [1 }+ `; C) P
* H$ D7 B7 s9 x& Z配置ADC分辨率:通常设置为12位。3 X3 G* Y3 |5 Z/ q8 f" \$ ~% V

+ D' h, u  p) h7 ^1 j2.2 配置过采样; H0 L, d5 T/ t2 Q7 ~
$ u# J# E' W8 Q! o$ x* r
设置过采样比率:例如16倍过采样。8 M# J/ t& S- t% S
( E) H( ?2 x9 M% u" m
设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。
- r7 m' A* H. ^6 x( w; U" t0 i9 L# }* P( e- R* T) M
2.3 启动ADC
9 F& D+ e3 E  ?  @
3 d# E: d, @* Y3 B; o启动转换:ADC开始采样并存储结果。& f" ]4 f) Y8 t

( j  {9 s( B  D* p7 b9 _等待转换完成:通过轮询或中断方式检查转换状态。* s8 I9 ^5 h6 f+ w3 M8 F

" y: R( H  M: Q7 n4 L/ w6 k2.4 读取和处理数据
/ N' e: q$ H% B, u
2 G" W& j, O6 `, y读取ADC数据:从数据寄存器获取采样值。
- _% ?+ A) X. R# P- f7 o: y9 y9 h: V( y# }! y6 U
计算平均值:对多次采样结果取平均,得到最终值。
: p; b/ c6 l/ ]  j: h5 w% W# K1 h
' Z" r4 g: ?5 s- V9 e! WSTM32 cube MX 软件配置如下:
2 l# a" S4 b: ^% F
' s4 M7 I1 w4 W/ y# ~3 {+ f 1739758927294651.png
5 D: e! f: @- ~! i8 Y+ h$ {( o0 f& U0 |$ Q
主要代码如下所示:
# Z1 N/ Z9 F; `/ @. ~, }
" }3 F# t5 ~( {  \8 W+ V  W 微信图片_20250305101856.png
# D6 A8 G: u0 t+ U! f 微信图片_20250305101903.png / t/ @/ c' t; u
                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:" U3 N4 c$ l3 A, c! w/ k* [3 D6 V- R. w

- I9 }( v: D) ~: W- k0 {       第一步:启用 ADC 过采样:比率 16,位右移 4。
( @  d8 H, }6 {% ]/ @7 I; S% I: G2 i( g6 u* m1 ~( g
       第二步:启用 ADC 过采样:比率 16,无位元右移。4 X3 R8 G$ f5 G9 m
/ z+ i" b2 j9 b2 c2 B' s/ A" u
       第三步:禁用 ADC 过采样。
2 Q, f% I2 U0 F, t8 }  p1 W6 g" S) x! M5 G1 _3 m: s
       程序循环执行,上述步骤代码;
0 [) z4 p) W8 u. y1 ^1 @1 [2 r
1 H, L9 F8 V7 [: v- U+ I5 n        示例执行:
/ n5 t4 r2 S0 ^" t
, o% \9 O0 B2 x        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。  u* X0 a- S" e& k, q0 J, {& c# ^) }

( _+ U5 a) C  h  f% K        然后,对数据进行评估:; t7 ]+ j( ?. w. Q' Z, ]: F. R# `
* w, L9 Z8 i3 N2 L5 y+ a/ e
         数据范围有效性检查
, `5 b: s; J7 n% r6 \
% [' j# u* M1 ]8 n. l2 ^        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。
& S+ `' v; m. p4 e* g6 a' L9 t* {* U
        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。. V0 e. z# {; w  Z* K
* @% D# T0 t/ E4 m
         程序仿真效果如下所示:
. y, F8 V9 b+ _$ ~# G5 s  K3 |
5 I8 m9 g* y% O  i) K         1739760381181705.png . I' A( t+ Q5 p4 e* ]6 t
: V5 k6 ~* c, l. w: p7 i
                                                                                                                                                                                                           注意事项:
; O/ ]+ X( W# G7 M4 m% [$ A
) ]" C& w8 O) U0 b2 B         噪声水平:过采样适用于噪声较大的信号。2 m; }5 j0 X6 F9 R/ H: A

3 m+ I9 \# i8 x$ g        采样时间:确保采样时间足够捕获信号。: ~, m- T$ C: s$ B! Y) q
0 ?% r: |' J1 T9 t/ f: q% V0 e+ r
         时钟频率:ADC时钟频率需满足过采样要求。3 W6 G. d% |1 N" t

2 {: B) [' a+ d3 ?. A7 V& \          项目总结:$ C: w" {$ s# f% A
: m3 B. u7 R  h/ V2 b
          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。/ ~' }3 e; r! e' l. y( H4 @
0 W5 d* q' H# D+ b
         几种常用得滤波算法分享:
7 }3 A0 ~. M: \% V- ~. k7 U! H, i; e8 H; [. O
         1:一阶互补滤波算法:
! t+ u' v/ j9 x) `3 |& e/ i" `7 K1 Z5 i8 F
         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据- M% {! p& K4 A

3 v* Z0 F7 ^+ c  M- G( l4 K         代码如下所示:1 D) @9 {& X, m  L. I3 Z

0 Z  m1 N# k8 R9 @          微信图片_20250305101911.png
- N0 E' p4 B& e6 P* s  A$ @! P( I" J- R- f7 M7 H$ h5 H) [
         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。
$ r0 x1 o7 E0 K* ~
5 H: y9 h* B: \5 N          2: 采用中值算法滤波8 ~/ m/ E. m, O; ?! X) R7 g
; ~5 X" g# @+ e0 a5 p2 [+ \# ~
          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。
% B8 r. v; v  K; \# [2 Y) g4 K4 K. d- z6 `3 V
          代码如下:
) ]) B* ]& Q3 @; N# ~( p. K- ~& ~
   微信图片_20250305101915.png
+ u; m$ `" t9 v% j' b/ ?5 J, P2 f9 J- @5 y# N/ {& B6 M4 X

7 u5 W) ]9 K1 i' a+ v可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;) i: [3 @' y' ]6 V" c5 @- r2 s
7 Y: X  y" u7 D5 L
        3:算术平均数滤波* k9 y  O* C4 Q! o& |- \+ q
# {2 H& {4 E. R# Z5 B: \- K
        连续取值N个数据,对所有的数据进行取平均值;
7 E3 K' W8 k: h# G* y; G: F5 g8 N9 a& `( ^3 Y1 V1 l
         代码如下:  f" E" P! K; ?9 u$ H

3 \3 S1 Q3 Y* J+ w/ _1 z6 U        
微信图片_20250305101920.png
  T2 d" ?' _$ b  I* _                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;) K2 ?1 G: H3 M: Q& a4 ?# p

  i( P8 S" D% A+ V         4:滑动滤波算法5 }- _  V2 M  d6 J" B: C0 ?

& W, f. G0 n/ j3 m" u8 h- x8 t& V          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;
/ r1 ]  w# Y8 F8 z0 E- q
微信图片_20250305101925.png 0 a  g7 w2 R0 c9 K
                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。
- M. \: F3 j0 Y" W( o, z( `
9 {# ]1 N7 r& _1 C
收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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