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

基于STM32使用ADC的多通道采样经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-25 15:47
本期我们介绍使用ADC的多通道采样。$ ~& P. J# h3 U+ m' V$ z, f

; A( ^6 X5 t9 A3 c& c 微信图片_20240525154648.png
, v3 T, b8 D; C0 |; }, L) S6 z; d4 q0 n' u$ @, o
首先我们需要明白一个ADC外设通常有许多个通道,合理的使用这些通道可以实现多个采样点的采样和利用多通道弥补采样率不足的问题。
2 Y. i8 z- D% x" m2 F/ Q- [0 L' w. Q+ L9 w) q1 l& H5 ]# l- d
首先我们需要知道,我们并不能直接获取某个通道的值。
' S" i$ q, s  {8 O" l$ L7 R
4 @7 R' S/ n4 x' d 微信图片_20240525154645.png
4 p. \; [: C7 X# C+ {0 h: D6 _

, _2 e3 \$ \6 N; A' X% J我们HAL库中的函数的函数仅有一个参数需要传入,因此我们不能直接的获取ADC的值,这时候我们就需要明白我们的ADC的转化规则。" q+ @) y/ `2 ]

) |+ V+ R5 _! Q2 V 微信图片_20240525154642.png 4 R4 ~  j9 ]8 f( `) `

7 u' e4 `7 G1 U  |* w  y, _+ k在CubeMX中我们开启两个(或多个)ADC通道! w7 n9 y9 Y' I4 g5 n9 b
4 t7 W" f6 d% E' J$ I
微信图片_20240525154638.png # N* t8 k# H5 r. H* s  _) J7 w

! p$ d9 h" ~2 t7 _开启扫描模式和离散转换模式,重点是这个离散转换模式。
" r. {* u# Q" N/ p
# B) h) j* w9 Q- s% y' C. U
允许在单个触发事件中执行多个ADC转换,而不是在每个触发事件中执行一次转换。这对于需要连续获取多个通道的数据时非常有用,因为可以在单个触发事件中获取多个通道的数据,而不需要多次触发。
7 z* F% S8 K* Z: Z6 n4 I# `, P9 \" q0 w
这里的触发事件我们可以选择软件触发9 F/ ^& v  D) ]% L' }$ [; `

% L8 q( ~5 n; p4 v0 S& V 微信图片_20240525154635.png & Z# m: G1 V/ I; x% x
% K. ~% ^4 P9 g9 i) L3 ^
这样子我们调用HAL_ADC_Start的时候就会开启ADC转化。
* E7 K. L* m2 w- p$ @7 r$ V; K8 N1 W6 w  B+ [1 g
微信图片_20240525154630.png
+ \% u7 u' T+ ?' q; a4 I  N

3 d) H6 F" O% f% _5 P在下面的规则中规定我们的转换规则,这里我们是先测量Channel13再测量Channel11,我们调用HAL_ADC_GetValue的时候就会按照13->11->13->11.....的顺序获取我们的ADC的不同通道的值。  V  U/ E' _4 U! D' h: q" v

7 U1 X1 Y( A+ u1 m
所以假如我们开启了4个通道,那么我们的多通道采样代码即可这样子写:% |! \# _1 M% N. b
  1. uint32_t adc_values[4]; // 存储4个通道的ADC值
    ! r0 e! G: t0 N2 p# l9 z
  2.   0 H. |) X+ x. @6 n
  3.   while (1)7 d9 {6 n, w5 H) b
  4.   {$ r* d' i; _: u) x
  5.     // 开始ADC转换1 V" C! I, _, F( z" d
  6.     HAL_ADC_Start(&hadc1);
    ) n! n+ d4 W/ f4 L) u
  7.    
    + d6 p0 K3 B- v: g+ Z" _
  8.     // 依次转换4个通道
    * ^. [4 c5 _" M; S
  9.     for (int i = 0; i < 4; i++)0 W8 g* p, F; a+ b8 \3 ?
  10.     {
    . E- x& d/ R' U# [
  11.       // 等待转换完成
    : C9 G" @  V; O$ b; G0 u
  12.       HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    - X% F. \: m. @7 F$ e! o: K% P5 j
  13.       // 获取ADC值
    * P+ z- K9 |) g' \2 w9 H; z
  14.       adc_values[i] = HAL_ADC_GetValue(&hadc1);8 K- v3 j' e9 C" @' e6 E7 F3 h
  15.     }5 [, f# d: U4 g
  16.    
    ) r3 h5 _8 g5 J
  17.    
    ( u$ c% O: f6 B
  18.     HAL_ADC_Start(&hadc1);//再次开启采样; N3 U2 @7 l7 T
  19.    
      t' U5 O6 a) C0 z
  20.     // 在这里处理ADC值4 `0 u. y, h9 C* m3 ~0 T2 {
  21.     // adc_values数组包含了4个通道的ADC值# \1 n. F) D3 k! H" ]8 P0 _% {
  22.   }
      ]8 o  i$ X# @) L
  23. }
复制代码
/ `" h+ h' d" z5 Y( C
这样子我们就可以获取四个通道的ADC采样的值了。, h& X4 n, i  V
6 F* T7 T, i" c+ ]+ |3 s
DMA
3 U& U2 _+ G5 q3 v; k: b% q
同样,如果当我们配置了多通道DMA的时候,并且设置定时器实现采样率设置。3 S" a6 i$ R1 G7 k: z* Y+ l

* o+ Y- I: z6 d3 c/ C0 F* L0 b
我们需要明白的是,DMA只是帮助我们为ADC的数据提供存储区,这样子就不需要利用MPU进行读取数据存放数据的操作了。
4 S) ~! [# K6 S
- ?6 `2 O5 w, @3 o
因此配置DMA并不影响ADC的采样规则,只是存入DMA缓存区的顺序发生了变化。
' Y0 \5 F8 K$ m  |. ^% p. l
  1. for(int i = 0;i<Lenth/2;i++)
    * b0 y1 u% H/ {% n- Y& G
  2.     {, P4 O- ?7 T' E0 A9 S
  3.       ADC_V1[i] = ADC_Value[i*2];2 y+ O8 p' x/ l3 w; X. g
  4.       ADC_V2[i] = ADC_Value[i*2+1]+ _& K3 B2 S8 m
  5.       
    $ _6 a# H" i5 t3 C; Q
  6.     }
复制代码
  R  O& c7 {1 e
因此了解DMA的本质与多通道ADC采样的规则就可以实现多通道的ADC连续采样啦(不过这样子采样率会减半)。: J# _9 D% h  b* k3 ?: Q

! S3 c9 z2 W0 j

) V% P5 u! h6 X( P% `8 F  P转载自:电路小白7 Z( \4 y9 J  i5 \/ P; S1 W
如有侵权请联系删除
- q( v$ G; J" H3 r. g4 w5 R
5 Y2 v/ B0 v% }7 Y
# c) L. h" v' g
4 B# s8 c$ s8 L2 w2 j, J9 N8 V
收藏 评论0 发布时间:2024-5-25 15:47

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版