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

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

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。; q# t: w1 Y4 k/ k3 T
/ }. k8 h" D1 n( m. c
下面和大家具体分享一下软件配置步骤和注意事项:" |$ N, s' z, x) n3 _7 U2 u
一:过采样的基本知识分享:
; z, E- D8 ?) ]& v) F
" V' i& l6 p" U0 N5 n/ X1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。
* f5 `# h/ X" O
' U+ T- Y# X1 z" u* |/ f) \* d5 S" a; [二:软件配置步骤
, D1 `, l5 W% @: A5 l$ `. y3 p& ^: D( p* d, B
2.1 配置ADC
6 B& h& t# D0 d; S: w+ C5 Q! L
1 h$ N9 q, y( J* r* t: z$ \+ v选择ADC通道:确定要采样的模拟输入通道。+ m' H6 [8 w3 P

( m% ^$ z- q& [- s( Y8 g+ X8 D2 {设置采样时间:根据信号特性调整采样时间。+ u+ |( |; e# `# o0 w" w

! N3 h% @$ c" G. o配置ADC分辨率:通常设置为12位。
+ o+ E3 J7 @/ l) Q$ z/ F- ], i: b+ Y  w% t
2.2 配置过采样
% w0 P3 Q! Y7 d$ V( {* a- S
6 q; c' d$ W: o# O设置过采样比率:例如16倍过采样。
. Q! u3 q0 {+ b# O9 y; l& y. ~: k3 q# A* s: a; V# ^$ v
设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。. A$ {/ {8 C( O) @6 W

9 B1 e2 I8 Y2 S$ [2.3 启动ADC3 M: N, o2 ^8 Q3 f* X

# ?4 N0 b1 |5 g5 d6 I+ S3 J! f9 u, e启动转换:ADC开始采样并存储结果。
/ L4 B% Q7 I9 J# d# Y4 m) \$ T9 O% P5 c, d; {7 j
等待转换完成:通过轮询或中断方式检查转换状态。
3 X9 e- O$ X+ o% O/ F
9 t+ Y" j9 O4 E2.4 读取和处理数据) `' C, @6 u: f
6 d% N" g5 h  W" o" v, ~
读取ADC数据:从数据寄存器获取采样值。! E! G; `( |1 r

$ @; d: [  l* R. a, {: O; e计算平均值:对多次采样结果取平均,得到最终值。
! o" o$ T) v3 @
7 u! w* i. x1 Y: x6 WSTM32 cube MX 软件配置如下:
/ J' O6 F4 [1 x' ]8 M3 t! Q. N- Z% x. p& X% c
1739758927294651.png
5 t6 ]' a3 i0 y+ J; f/ a& B1 C) p% g2 b7 W# u7 Y$ M" W% J7 m
主要代码如下所示:
" R6 @! {% H% G$ c7 f  H
2 J* u$ ?, y. r 微信图片_20250305101856.png
0 u+ [' ?+ s( k" Y3 n% {6 T4 y* { 微信图片_20250305101903.png   x6 K. \, v6 U$ E+ A  Z- X
                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:/ C! y7 ^- S  {! U. S

( b  t  }: G, W: I       第一步:启用 ADC 过采样:比率 16,位右移 4。* s6 ^9 p" n9 b5 t& ?- Y* f

0 C3 r6 a* I7 ~4 v( c9 l  S       第二步:启用 ADC 过采样:比率 16,无位元右移。
3 ~1 s; d) Z, K5 f( H- \" n
# y  E# Z1 F' a- H) Y' T       第三步:禁用 ADC 过采样。, ~. z7 q" U) W. I6 u7 ^
4 t1 e! \, X4 a4 |* l7 B, `* B; T
       程序循环执行,上述步骤代码;8 @* [0 @) H3 v

! M3 b7 p, u  {, q& o        示例执行:
7 K0 |3 B, w2 u
: }2 m- O( }/ q1 o: s        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。' ^  j. Q2 _' `6 i  i
/ d9 G4 R# c3 b: y& r! X
        然后,对数据进行评估:
  [1 a3 o1 s# L0 H
' }& g: S; f4 [* Y         数据范围有效性检查
5 R* x# r0 E4 ?7 x: s" \
6 [4 W+ B* L) p, Y        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。
! f* ?6 p4 n7 a. A! ^. P7 y! @! K0 T) n+ ^; |0 F. H+ G; ~
        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。0 m$ o7 l0 @8 ~7 v0 T# t# g4 _
: N- c! A5 W9 w/ Q& ]* q
         程序仿真效果如下所示:
( m7 _& u  p' H% i7 `' F
$ {( x) I5 L6 J         1739760381181705.png 1 M: o3 }2 K1 x7 N1 Q" d+ S$ T
" u1 t8 B; t9 D2 _
                                                                                                                                                                                                           注意事项:
' n, L+ ]) L: I+ \' b4 w3 @8 _
$ S+ }0 a/ u' V! p; ]% }/ J         噪声水平:过采样适用于噪声较大的信号。
9 `9 M+ a# u" T6 S6 W2 ~" q3 c. F/ y, R1 {  ^8 r/ |3 T4 k! \
        采样时间:确保采样时间足够捕获信号。$ ?# i+ N1 \1 H% x# {* e
- \3 U1 ^3 K) _2 z4 o, |! r
         时钟频率:ADC时钟频率需满足过采样要求。
% x( `2 R# \, K8 q: D6 |, d; {3 \5 f6 \  p4 P: C0 H, S
          项目总结:
4 f) W3 e: D+ u% T. d# S. n  @& S* v2 R
          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。6 G$ \. {8 o; q$ U
7 E! g( F- i: G" d7 o
         几种常用得滤波算法分享:9 x2 t+ z* q' ], O

' U  x: G- W+ n& w' s7 Z         1:一阶互补滤波算法:$ K& n. Z6 m3 e( s. N- `

! j: a/ M+ W; A" r- d3 Z         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据  B4 {& K4 v+ T

: M' \4 G. y: g; N6 p9 w         代码如下所示:
4 d& k8 u9 M6 a& u; H0 g8 F& r1 e: [1 E$ w% ~$ a
          微信图片_20250305101911.png
+ e8 k/ H! {9 M! E/ K* ]2 R) k; m& d: ?7 N% D9 \3 ]* `' @4 u. B: z
         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。
6 y, P+ P0 K7 u( ^: l) {
( r0 _5 Q/ a; u8 k0 @          2: 采用中值算法滤波
* C' c  K5 @& G/ M  T0 s0 [2 _& w' `3 Q! ^3 q5 T# x5 {
          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。+ `- a9 @+ v- o# ?# L' h

+ F) k$ [8 L' |) X, i7 F          代码如下:4 c! g6 B4 _" q- w3 |# X
0 T$ D5 F* K2 z
   微信图片_20250305101915.png
1 y/ H1 x" y  ?5 [0 b: Y  {, f- X$ W/ B6 e& c) B; C6 X+ P

8 _! n- }& w" T( Q可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;( i- t* W% n1 r0 W9 j

2 J) C6 {1 Q9 K! w* x* k9 B        3:算术平均数滤波4 x6 F8 ~0 D1 C4 l1 E
! n& |3 H+ O7 v7 H: |4 Q; Z4 {$ x- f
        连续取值N个数据,对所有的数据进行取平均值;
' S6 R/ o( O# ], n- I5 W9 @& N. d2 h2 w
         代码如下:
; R" B. p/ p8 V/ d  C& G
) V. Z' [6 N2 L9 g) ~" P% ~' a5 Q        
微信图片_20250305101920.png - y- r$ L& W  x0 q4 y* j
                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;
( }) J/ g. k& F2 s5 _1 E; A( T
$ k- g* g; P5 C" z* ^4 `         4:滑动滤波算法
! H% U: c& @" d3 o7 T) C. E# I) ?  i6 i+ G  O, R, L; A$ ]
          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;
4 d- f0 s/ M- d) ]+ V. s
微信图片_20250305101925.png ( m7 [+ I$ R. z9 i2 K4 p
                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。8 ^+ \% m; I3 b  p8 N1 M0 H

$ C- a1 A1 x, A  o
收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似分享

官网相关资源

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