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

STM32 ADC多通道转换的DMA传输实例

[复制链接]
yumeii 发布时间:2019-12-25 15:54
这里以STM32F334 Nucleo板作为硬件平台,使用ARM keil MDK集成开发环境。% }7 c) E2 x8 d; i# X+ I4 d
9 C5 A8 p) W" v  ~
% Q0 o% c4 m2 Z( L6 \& E4 H, \
对3个ADC通道进行连续、扫描转换,转换结果通过DMA传输到内存,再作为TIM2的3个比较寄存器的值,以控制TIM2三个通道的PWM输出。2 W9 R# r( N- |. f' U
+ I7 g3 T& J! J

# L  U) T& e" `8 d# Y: i+ m另外,使用TIM6的更新事件作为ADC转换的启动触发源。本示例中,TIM6的周期远长于TIM2的周期,通过TIM6周期性地触发AD转换。6 o" T' e/ _% [8 e$ x; k# C

0 z8 w: O5 Q3 }6 u# [( g

0 f4 r& b* ~# h使用STM32CubeMx进行配置,基本配置过程如下:
$ M6 ?+ x( `* y  j9 \& N/ z
# K  n/ F+ w7 D: f7 ]
2 i" H! n+ r! y" s/ ^+ {/ o8 ?
1、时钟配置。  |# A7 f/ M% H/ G/ U
" E+ W& E6 ^3 x

* U4 v. ]: ]1 ?/ Z& x2、配置ADC。选择ADC1的通道7、8、9三个通道,单端输入。8 D0 B8 t4 z4 q9 F# r  O# q! ~
1 m- d- d* V8 j! t  R7 ^; o
% b' F" }4 N8 r
1.png 0 j8 }: y" P) o+ g$ z

* ~# Z; [/ @/ P( d! o

$ b8 g8 e% b0 @; S 2.png - \" p% [0 E8 G% P5 k# g- r" |

! o: |- z" K! c% Z3 n# o
& w$ u; |. D, `; H; y. u0 F+ ^# O
3.png
7 N: W' I. t" v- w! G# @% j
; v( b7 n7 L% B  Y# g2 l7 `
5 a  {. v  o) D
配置有关ADC触发DMA传输的内容【EOC触发;Normal模式;从外设到内存;DMA传输中断开启】
6 ], q/ t2 n& p9 N% u
4 O2 l/ n) d0 ]& l' I2 g
+ L8 @7 m# m7 f% p4 B" J, I
4.png
) x' O9 @  g& A+ V6 m/ n6 {) b. z2 v: M; a- Y
8 E0 h0 c7 P) Y3 ~% _: Y
3、TIM2的配置【时基参数/PWM配置】
! @. N! a! Q/ H7 s. {4 T) f( Z  j1 U' K0 i
0 i! u% A/ f0 q# H- P5 X
5.png % g2 u" j6 M) k: i6 P2 Y
  l; S) M2 m& l6 x
: E3 _6 [/ t3 n
TIM2的三个通道的PWM初始配置一样。5 t6 b# m% G5 J  I
, g  C: Z1 [% @0 Y% s
/ g' Y8 }: a7 ~2 g6 k0 w' B" W
6.png 3 G- ^3 Q6 d- a. ]  ^3 T; h8 h

1 L. }7 }1 M1 G( {$ U" J

; R3 b' \0 ~$ Z1 W4、TIM6的配置如下【其中更新事件作为触发输出】# \3 I/ @& C& Z% f" }# K4 B

& `+ a3 s$ L/ F' w

2 @' Y( V- b/ V, J 7.png 1 Z7 G) P( R$ C- i4 ]
/ ^8 E2 [1 e- I0 H2 P
& q( g$ ^/ ]$ ^+ U
5、生成初始代码,创建工程。
! m8 Z- O, n, l* E6 R$ m) \# `5 J" ~: X8 X9 \& a9 M
: f# C* r7 A$ m2 E7 E" Y' Z) \
6、添加用户代码。
/ P  H" m# i6 K; T& A( |
* k+ e7 z0 ~$ v8 @6.1关闭TIM2的3个通道CCR寄存器的预装载功能,修改即时生效。
% c; P2 _) @7 j$ _$ I' z6 J# V7 [3 x  x5 E8 A% u* q- _
$ A# V4 b# U6 ~2 H, U# m
__HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_1|TIM_CHANNEL_2|TIM_CHANNEL_3);【这点不是必须的,根据实际应用来定】0 P1 x% |8 f& t0 [7 _! g, v8 Q
! n$ p% O& D0 `! Q

% |# x2 b1 m# N; A: u6.2 开启TIM2三个通道的PWM输出并使能TIM2.
0 s( q# [( y/ _/ q
7 {! o% u7 f7 P! X0 k& T) h
' B/ d9 l4 V% Z( N3 p3 a' q& H
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);$ O/ {6 D# I4 K+ n) V% m* C# u
8 p/ w8 t- I" L+ n/ ?
1 L/ Z" M$ D" L! r0 _% P+ ?
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);7 x2 u2 J, k6 [$ s0 V

, w# s+ }4 ^2 J8 |$ r) p$ X6 s* x

! `0 f/ i2 @" H/ M6 X( i4 SHAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);" n- M" ?1 S+ z! p: I2 ?
$ F2 f$ s) J& e: L2 [# n8 |
, Y2 Q2 J& m  I+ T9 H: y- e3 p# l
6.3 做ADC的校准操作。+ }8 R  v$ N' N/ R6 h. |
6 x) X3 U4 p% L) `

4 G& ^! I+ o% N' o6 k1 J* hHAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
# H# E4 \1 \4 X1 y0 d4 j
6 j5 ~( {6 ~/ J7 h/ K; y

) e# o" T1 y# F/ ~( N) M6.4 做好ADC转换及DMA传输的准备工作。Value_Adc为存放ADC结果的内存数组名。6 |0 z7 L& {$ v1 }' V; o$ b7 d
1 ?4 A5 {* g) X5 ]' Y
% z" d; d3 s7 N, x4 H
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)Value_Adc, 3);. z( T; A8 _' M3 p% j) R2 B; z

& ^  K" e9 g1 E: K, F
. J( C4 f5 p8 Y4 y4 d0 r
6.5 开启TIM6的计数并通过它触发AD转换。. T0 R! d% p4 z5 O4 {" g5 @1 J
3 @5 J, _0 j, z% e7 M" g

7 P0 W9 m$ L1 f6 J0 q$ |, M   HAL_TIM_Base_Start(&htim6);4 v2 g- H& ]" z

, s" _8 Z& g8 h, w. Q3 C

( |+ Z! B# g; d+ x9 G6.6 在DMA传输完成中断里添加处理代码。
( G* p5 ^. ?. S0 K( [9 c% V
0 n( N% C5 h0 A1 U

' a* ^8 S; w7 f 8.png , J* J1 {" Y: x6 v# k

- O' L0 Z/ U9 Y7 A3 V  F5 p
' B2 Q* M- a* x7 z$ c" {
将3个通道的AD转换结果赋给相应的比较寄存器以达到调整PWM占空比输出的目的。
( ~8 h, w' Z$ ^7 {, t  O: _+ t& ~6 d7 B

; W# l  i8 h8 v! M因为这里DMA是配置为NORMAL模式,需从新开启DMA传输。
8 M6 X, S# Z9 |  ?
7 Z& k( o6 L8 P- c" |
& A( H8 w: Y' a' Z% b9 g- y
7、结果验证。编译运行查看结果。【三路PWM输出,占空比与ADC转换值相关。本示例的ADC输入没有实际信号,只是悬空而已,结果仅做演示。】
9 Q1 U: [3 h/ S7 }+ Z% p9 N3 g; G. }. j; l/ u! s
( T6 ^7 g) ~7 L; u  A6 T
9.png 6 @/ R  C. L7 `2 `  }" A
& I7 Y& D+ i# C2 ?; G
赞 收藏 1 评论3 发布时间:2019-12-25 15:54

举报

3个回答
Kevin_G 回答时间:2019-12-26 09:58:40
点赞
h_12345 回答时间:2019-12-26 10:26:28
请问用什么版本的KEIL,软件仿真进不去呀?
; i' v" C. `( X
yumeii 回答时间:2019-12-26 13:53:43
h_12345 发表于 2019-12-26 10:26
4 r4 M% G2 F0 o* [- C0 r请问用什么版本的KEIL,软件仿真进不去呀?

% V2 q5 X2 {8 z; _% ^5.26、5.28都可以吧
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版