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

STM32多个ADC模块同时采样转换实例

[复制链接]
yumeii 发布时间:2019-12-25 15:35
在STM32家族里,多数系列芯片内含2到3个ADC模块,有的甚至更多,比方G4系列可以有5个ADC模块。其中,通道数因不同的系列或型号多少不等,几个到几十个的都有。有时,我们可能需要多个ADC模块同时工作,比方3个ADC模块同时采样转换。这时如果芯片内含有3个ADC模块,并支持同时采样转换就很方便。比方STM32F4系列、STM32F7等其它系列都含有3个ADC模块,并支持同时AD采样转换。
2 w. f* K$ S3 R
/ z. s& \" h* r) q, `7 y# [1 m

3 H) O6 E6 x5 Z0 c( \7 Q5 S这里就3个ADC模块同时进行采样转换应用,做个简单实现示例,以供有需要的用户参考。此时3个ADC模块会建立主从关系。以STM32F4芯片为例。内部大致框架如下:& R( }. O; T/ C; y/ W
- ^( E( n$ x: J, R/ Y$ Y
7 c9 B; a8 j9 P* y
1.png : E5 E& V! W( ~
0 |/ t0 J0 |, U- Z$ `

: T  y1 X2 ]* t4 S9 ]( D$ Z. [采样转换时按如下图示操作,每次对分别属于3个ADC模块的3个通道进行AD转换。3 j  R4 `/ e' |! V+ b/ O! N- l6 |  W
9 k! A! r! c+ _( D+ _1 m0 o" u1 d6 t
* E0 b4 Y- Q" [+ h) `
2.png
" l% A. Q* t7 v' p
9 S% f7 y% b5 H
6 z- V. Q7 @3 g
各通道转换结束时产生DMA请求,DMA按照ADC1、ADC2、ADC3的顺序依次将数据取走,然后放到指定的内存空间。
. N; }; I7 e. W/ r' L4 n& D% j+ u+ O; Y; {  X( L, t

( a! ]  g( a) _) N# K" w2 }7 b2 T好,大致原理就介绍这么多。更多细节还是请阅读STM32参考手册的ADC相关章节。这里在ADC1/ADC2/ADC3三个模块各选2个通道,它们的通道号及相关输入连接如下:【注:ADC模块的参考电压选用VDD.下面实验基于STM32F407 DISCOVERY板来进行。】3 ?4 l; h+ P8 X6 H3 |, k/ e- _4 f
3 M: g& \; L0 b' h% o! [

1 x2 G8 j% D/ O& p% F) k 3.png $ w" v. Q( j1 K6 y4 l

+ ^/ C$ ?/ v0 n: I

! v& ?& V* \/ i2 P另外,我这里使用STM32的TIM3的更新事件触发ADC转换。0 `) q9 ~7 M" {1 P8 d4 v
. ~7 n9 j& I+ o7 r9 V5 Q

% ~2 r& L# e2 z+ e  |7 W0 M一、使用STM32CubeMx图形化配置工具完成基本配置
9 K/ D2 U$ i3 a# w7 g- n( P# c
7 J4 h% ^9 F8 r4 y& h

" v- M& j# W/ G# T1.1 RCC/SYS等必需配置项目+ F/ d7 }) I& v* I" V

2 K& |5 ~0 s$ a0 F% I% d- w

0 h* ^& a% G" X' Z, b6 k1.2 对ADC进行配置  g- r* V* x# B( b
! _9 u' U) j7 a0 n$ p
1.2.1  对ADC1及相关DMA进行配置2 ]! s8 ~! a8 e) U3 P+ V1 \5 F% y
+ ~* Q2 c% Z2 E

- B5 S$ c; w- ~3 ~ 4.png   ]- N. {- r' l3 o0 S# m8 `
! f/ B3 ~) i; j) t6 A
2 Z8 J& }8 d- e: Q( p% N
5.png
3 h/ O2 H) ^) p4 g; }, ]  `
, s7 U5 V# {! {( t* q" V

1 g2 G) \$ I" y: U  j至于对ADC2和ADC3及相关DMA进行配置,主要参数和配置流程跟ADC1一样。注意选择对应的ADC通道及采样时间。考虑到版面,这里就不重复贴图了。" O9 I' W) a$ k% n+ J) ], Q

4 a2 \$ H& G* n8 J

; ^9 t& z3 I5 m  [7 [$ I3 ?1.3  对TIM3进行配置4 R: s- s6 G* F

2 M+ L" \2 a0 p- O+ X6 _: u

$ \" S, ]7 d$ `; r- S( q. H2 S 对TIM3的配置比较简单,安排你需要的时基参数,选择合适的触发输出即可。ADC转换靠它定期触发。, u# f1 e1 h6 m  ?6 P
% m; Q! V5 Z, K& N, m

4 n( N- f4 }0 `3 n9 J$ _7 H8 R 6.png
. B1 P8 l) O. e$ A  }) z0 \5 \. ~; f; r. z, |4 r( F* k
# D. j" A' N  w5 k
上面配置中,DMA传输中断默认使能了,至于其它,根据需要选择使能。
5 W, |4 |3 t0 H0 y+ a- X, L" m  p, Z! @) A6 F3 f! r) Z: v7 c

' F6 `* @1 Y6 E9 u1 ]2 r2、基于上面的CubeMx配置生成C代码工程
% L2 ^0 v$ q+ Q- V3 c
; Y/ t! F; V6 M6 f- {( ^6 r3、添加用户代码。代码基于Stm32Cube库
) u# e5 }0 Q1 O, m2 Y7 n% N2 l1 [- d. Q7 Y  e5 h
3.1 为DMA传输准备一个内存数组,用来存放转换结果
; O1 V. S0 |: x% z# L- M# D
2 A0 P! v) L) m
! V5 }+ v, ^+ @1 f
__IO uint32_t ADC_Result[6];
) J! b' n' h5 w& j* W* F( f+ h" I* J' ~( Z5 v2 f, G5 Q4 O% F% f
3.2 添加启动ADC3/ADC2/ADC1以及TIM3的相关代码: s- z( x* S3 ^5 @
7 L1 S4 N% ~/ [) x2 Q" b
8 |, N9 _# |7 J: L
7.png
+ c2 K* ^, ~$ Y( g1 A) n4 ]( u5 N, m. |! V

% g. Y" a+ q5 r4、编译、运行、验证
# z# D. p6 f; e$ k# A' [
: W! k) @# Z7 t/ O4 G

% M! C* _* P. C结果如下,结果是正确的。整个演示过程完毕。
+ c' O5 E" t" D9 L7 I
1 |! B! E6 R  L& r0 V

1 v: C% M! N# z, M+ H 8.png
: S* P5 k9 f) l1 D( b
8 O2 L9 `) `& X  d' y$ S/ D3 C6 P
- X; x8 b7 t5 M/ `# }
毋庸置疑,这个过程很简单。只要你愿意对STM32手册做认真阅读并把握相关原理,你也可以轻松实现。当你把握了原理,也就可以灵活运用。0 L3 v; J: M. X5 _/ y
$ j* n+ M5 g# v6 x) U9 L, m5 H
赞 收藏 2 评论2 发布时间:2019-12-25 15:35

举报

2个回答
Kevin_G 回答时间:2019-12-26 10:03:34
点赞
lijiatu 回答时间:2020-9-9 10:59:44
楼主,可以上传一下工程吗,想学习一下
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版