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

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

[复制链接]
flyingstar 发布时间:2025-3-5 10:12
对于STM32内部ADC采集时候,难免会受到外部干扰的,导致数据不稳定情况。一般在实际使用过程中,我们就需要对增加采样次数来提高分辨率的技术。而STM32cube MX 软件自带过采样的功能。下面就和大家介绍一下STM32如何使用软件配置过采样的功能,从而实现数据的稳定性。
! x5 |4 _1 [( B# B* m) q+ s# i
3 v6 j% }% ]% u9 w6 n- o下面和大家具体分享一下软件配置步骤和注意事项:) h7 ^- I) x6 i9 s$ j. z- O  x0 e4 h
一:过采样的基本知识分享:
( C/ b% B5 f+ e1 W& q; _2 s9 P- l7 c! Q' `0 ~$ d6 z
1.1 基本的原理:使用STM32通过多次采取ADC的数据,并对结果进行取平均值处理,提高有效分辨率。每增加4倍的采样次数,分辨率可提高1位;我们在实际的使用过程中,可以根据自己的需求进行设置和更改。
' V5 Q, H9 l/ z& P! S" V! f7 Q
/ u1 N# u6 S6 D2 g二:软件配置步骤
2 O6 Z: j. U5 y, B8 q% o, b2 Z1 R( q7 @" S  A/ U. E( t6 {
2.1 配置ADC
  l- E; B. z! |' ^1 [/ i% w, ?  B8 q2 g. {
选择ADC通道:确定要采样的模拟输入通道。
+ u# @. f, {, c3 g7 V' f" D0 l, F6 ?+ B; v+ N
设置采样时间:根据信号特性调整采样时间。
6 c1 [: d1 @' u1 j1 U' C) K/ s0 r3 F, ^$ F
配置ADC分辨率:通常设置为12位。
6 w) I$ l$ J+ f5 B! J4 {) g- a% Z6 Z
" X- s! R7 T  c8 v2.2 配置过采样
! i) v. z1 r6 e" {3 q0 H# I4 G' I, v- D) y8 d+ p0 M
设置过采样比率:例如16倍过采样。1 C$ K$ x* `/ J, H0 i- o. W

4 W( w, r  x0 x/ r设置右移位数:根据过采样比率调整,如16倍过采样需右移2位。  W* Z; V! F; T; d2 s; [
# G- Y! H) V: s' _
2.3 启动ADC
6 M0 u" w; V7 K8 k7 g; w3 a- g$ g% B, c, Q
启动转换:ADC开始采样并存储结果。
. P6 T3 J% j  n2 Y% J3 I' h" {3 o  {3 ?; b4 R- o
等待转换完成:通过轮询或中断方式检查转换状态。
7 ?2 x7 P, S& `( l4 p( [
; O0 G1 ~( |! A6 d$ I0 D2.4 读取和处理数据
( ^: O- n, h1 S2 e% {6 ?, h5 b0 b. L2 Y' b( z
读取ADC数据:从数据寄存器获取采样值。& g; i) X6 P& h; a8 K
6 e5 |# V! V6 D# B$ j
计算平均值:对多次采样结果取平均,得到最终值。6 z. S7 B  f3 G0 a- F9 ^# p

( Q. J, l/ H- |( ^2 T0 X% P$ pSTM32 cube MX 软件配置如下:
; P# W+ ^  Z' J+ @* k
% p2 U4 D1 N2 s 1739758927294651.png 6 s5 \% Q0 F) u6 Q3 X
7 y3 \, `  X1 A( Z- F" J  m. o
主要代码如下所示:* Y8 T- `  [6 |6 u! E8 c1 }( G' j9 T

# O& N6 S$ T, ~) S* z 微信图片_20250305101856.png
: o: {9 x* ?: O. C  B5 Z. S 微信图片_20250305101903.png 1 \. K2 \- O  u0 H
                                                                                                                                                                                                         ADC 配置为在单转换模式下从 SW 触发器转换单通道。ADC 过采样功能与 3 个设置一起使用:
, _/ `& ^! U  I, Q( W' @( \: ^2 I8 S3 m3 x
       第一步:启用 ADC 过采样:比率 16,位右移 4。
, I6 o" d8 u4 @) M# n+ c% V( I8 k( w( r% D! X$ ]/ l: g" W
       第二步:启用 ADC 过采样:比率 16,无位元右移。
5 o- T  f* g, y% C6 X
5 D4 r2 @8 t$ k- D6 T4 i       第三步:禁用 ADC 过采样。9 |' H) H# z4 A. |
: V/ j1 K  E5 y" O$ _
       程序循环执行,上述步骤代码;
. z6 ~7 e) W9 a8 \' ^) A5 v
7 M. N( @$ \$ D. R4 `1 t& }& J        示例执行:
& C7 d6 T+ f5 o: U( g4 [# @
+ R  ]$ {' c0 f. N! H% o% X        在主程序执行中,ADC 组使用 3 个过采样设置定期连续转换所选通道。
" M1 |8 d6 B8 _1 L# U$ }: \9 A, C# q0 P% Q! F
        然后,对数据进行评估:" j; Z  v9 J! T  B1 _/ B

. G2 D, L3 U" j, q% `. ~# h0 f         数据范围有效性检查
- l" P# v; A* D! g# @# m5 M3 U) e
+ z5 @/ ~2 j( V/ W        用户可以评估过采样的预期结果:启用过采样的 ADC 转换数据比禁用过采样的 ADC 转换数据的变化更小。6 v$ s8 U/ ?+ |' S) p
- G: H) g8 v9 d9 I  I
        对 16 位的过采样转换数据进行软件计算,以获得相当于浮点分辨率 12 位的精确数据。& C+ R" \& P, S' Q/ w

) v) [; `7 \9 K, }: L         程序仿真效果如下所示:! W' ?. P5 s( w6 q

+ I& E  C6 b, h& |& ?         1739760381181705.png
# l% o' R7 W- V5 c* i. Y5 P: n% k* E& |7 k+ m7 y- B2 W
                                                                                                                                                                                                           注意事项:
$ C1 o/ G. h% b" m9 w
* \& N% x2 o; R5 v         噪声水平:过采样适用于噪声较大的信号。
( ?8 y( {5 }7 D3 c( [3 Q- c" m( _  n/ W0 x" n( J: H0 J$ l& J
        采样时间:确保采样时间足够捕获信号。' g: q  U4 H. m" w+ H

+ U2 v: i8 }, B7 u( I* ?         时钟频率:ADC时钟频率需满足过采样要求。
: X2 N+ H: {, X; e. U
  f& H" V0 x* A, N3 |+ x5 Y: `: v+ S: H          项目总结:
! _* }7 ?# i4 {6 }$ B* Y
- n/ A1 i1 A- a. S          STM32 ADC过采样通过增加采样次数提高分辨率,适用于需要高精度但硬件分辨率不足的场景。合理配置过采样比率和右移位数是关键。+ n% y5 o+ F4 n  |) _0 N# I- |
/ }, |) s+ |# I6 N; t
         几种常用得滤波算法分享:
+ j8 }2 _5 N) B- r. n7 ?! T: Y1 W' {' X" h) Q" n% J: {/ d" t
         1:一阶互补滤波算法:
( j3 ?# d: s; R7 `5 \  S, U0 b" U3 U& m
         取值:k = 0-1,本次取值滤波结果 =(1-K),本次采样值需要加上上次滤波得结果数据+ G) |5 @. T% x+ N5 @& ], O

0 R) g6 x2 z6 R" ]$ V2 ], t         代码如下所示:: B7 [1 g7 W% T

( r, a3 u' h1 J: r0 K( f& C4 E9 B/ G          微信图片_20250305101911.png
  C+ a* H9 X' y8 z+ W
. g# r0 r* G6 I% v$ j         从代码中,我们可以看到该种滤波算法还是有很大得弊端的,效果比较一般,对于高精度的场合不建议使用。0 g4 W- x3 j3 k/ B" M

7 B2 e  D5 C6 y9 t& P: g. D          2: 采用中值算法滤波
4 `  g- D0 W/ ?7 i. @; w
7 L! b" ~+ M, J4 v) T  E' n          主要是程序在执行的时候,连续采集N次(需要注意下这里下,这里的N必须取值奇数),程序需要按大到小或者从小到达的顺序进行排序,然后取中间数值做为有效值。
8 E0 H5 _& I% P6 ]( C# a- s* y( h5 c( j0 D
          代码如下:& {2 |$ X4 G8 q  D% N- j
( E( ]& o: Y' _( X% [7 d
   微信图片_20250305101915.png : y- J( ?9 z5 Y! {3 k) i4 z8 U
3 x4 `# X8 Q8 E" `9 d/ R' q

& e# L1 I+ U7 U可以有效的去除数据因为外界干扰引起的数据的波动,对一些大滞后系统:比如温度、液位等变化缓慢的有良好的滤波效果,上述代码可以有效消除异常数据和平稳变化的采样值效果比较好;8 r# o9 b. G$ ]
+ I$ n) v* @8 Q" U
        3:算术平均数滤波
8 R' Q, ]( r7 J( j. J  p; m
1 i. q$ ]7 l' C! K        连续取值N个数据,对所有的数据进行取平均值;9 _5 E0 [/ @1 v/ I% x3 ]
2 K, ?/ |: g4 h) c% f, [
         代码如下:. U4 f/ Q8 H. x7 O( w  f2 N

3 C# t- \$ `/ r! D: d: [        
微信图片_20250305101920.png 6 K; @1 `+ g5 v5 ?
                                                                                                                                                                                                             这里取值时候,需要根据被控对象进行选择,N值取值过大,会导致响应过慢,数据的灵敏度过低,所以采用算术平均值滤波时候,需要我们格外的注意;
* Q. V+ o1 C+ R5 f- q" N* L0 L/ y2 L; ]% e* S( e9 w2 L9 i
         4:滑动滤波算法
2 C: \# h4 ^! \/ V2 W
$ N3 Z6 l* n& b/ m% ^          把连续取N个采样值看成一个队列,队列的长度固定为N。每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果;
1 D* T( F  v9 |. n  d+ ^" a; R
微信图片_20250305101925.png
0 _  m6 i9 z3 A( D                                                                                                                                                                                                            好了,几种常用的滤波算法,已经和大家分享完毕,欢迎大家相互讨论。
" e% o" K- ?" y1 Z$ I9 K

) M+ n( J0 i2 ~6 _& l
收藏 评论0 发布时间:2025-3-5 10:12

举报

0个回答

所属标签

相似分享

官网相关资源

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