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

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

[复制链接]
yumeii 发布时间:2019-12-25 15:54
这里以STM32F334 Nucleo板作为硬件平台,使用ARM keil MDK集成开发环境。
+ [  E. Z% I" b' q3 r' N
. Y+ u# ^3 a' @$ N$ U& {
5 E2 o' [; }' o% U( R# ~5 T3 V) D
对3个ADC通道进行连续、扫描转换,转换结果通过DMA传输到内存,再作为TIM2的3个比较寄存器的值,以控制TIM2三个通道的PWM输出。
6 }. g7 g  x! }" t- |% y/ M7 L* V* m( b7 G  z8 f  ~2 E7 H
! K+ t4 d4 b9 g; t1 z
另外,使用TIM6的更新事件作为ADC转换的启动触发源。本示例中,TIM6的周期远长于TIM2的周期,通过TIM6周期性地触发AD转换。
! N: T' V2 v& D: j3 i$ L* }# |  t; r% j& n" a0 d! ]/ ]

+ h6 d0 k7 E8 ^0 W0 |: c" g: x  s使用STM32CubeMx进行配置,基本配置过程如下:1 E, [2 n. j1 z" W! m" x

7 T" g) |* B5 I! @6 c, ^
! z2 K1 }7 @8 D) I( {7 W1 l
1、时钟配置。
" V$ l" g' n% ?9 }6 g$ k) p) B- i5 v  Y
$ D2 N* M7 s8 W3 Y' H2 F' e# Z
2、配置ADC。选择ADC1的通道7、8、9三个通道,单端输入。
- J5 J+ ~* _) P" J% ]2 [/ l% X9 h
! g$ h/ P$ D/ G7 `, k

5 ?# ?. g0 G- p$ a: U* w( o+ X 1.png
- b8 x1 a% a& z) K* y  M0 o4 l+ u5 D
! O. P! e3 K) B
/ d0 e' L2 t6 r$ K% D
2.png
6 f0 T+ s" F. r$ t' q8 H
3 f6 }" T' x* k6 d: b
, i; ^. _& A; I: c% v
3.png
& @1 g6 P( V  \# Y5 g( S
7 C) t. Q* p  v. o& @  A. f5 P
9 Y/ Y: w3 K# W$ @, [  d4 w
配置有关ADC触发DMA传输的内容【EOC触发;Normal模式;从外设到内存;DMA传输中断开启】3 b! a, X  s/ u
8 I8 U* I4 A5 c  c7 `
  P! i7 _( ^6 g+ o5 u+ O: c  z# ^
4.png
. M4 q" u. I& M8 C& @
; P2 |# I0 k# [3 p$ ^

6 i, s! @* |# K1 K4 G3、TIM2的配置【时基参数/PWM配置】
7 k: Y& d. c: K  M5 t! R, @5 y
- J- E9 Q& l& k% V4 \! R* P
9 {1 J* k4 V+ \' A, S
5.png
% r. Y2 W& D3 n) `& \8 U6 N/ u$ z0 C) }

; n: n. U% c, p2 U) @/ [  wTIM2的三个通道的PWM初始配置一样。3 [  Z0 A7 o1 t& s, c& c) w8 Q

7 Z! Y2 f1 u0 ~4 k+ y9 e
/ Q. _% w+ [4 z. W8 z
6.png , S$ @# P! M/ R! J! n& W) z
( G$ S* e6 }* a9 r  ^) j
# t- V( L( W) W$ Q
4、TIM6的配置如下【其中更新事件作为触发输出】
. r2 |' F% [4 @/ T& ~2 B. @- N! s$ n0 f) ^0 G! s( a
" ]% Y& T2 s% [/ U+ V+ X, P
7.png
8 Q% }% O& `: E! b8 C6 R9 m0 O& B1 V

& ]' k9 C- W( \8 h6 l) v, u+ w5、生成初始代码,创建工程。
2 w3 T0 v; N3 ?3 f% f7 N2 j; d/ t& x) j9 T

& O, L# K5 n+ D) g7 {6、添加用户代码。8 |/ K( ]* G- H! z) m& i

* U, ^# B- W$ r5 i6.1关闭TIM2的3个通道CCR寄存器的预装载功能,修改即时生效。+ b- }/ w7 q' N* B! l
% v$ a1 b! Z0 A9 i+ q. }6 R

0 p& {5 B4 q; d: t" {/ u& ?" ___HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_1|TIM_CHANNEL_2|TIM_CHANNEL_3);【这点不是必须的,根据实际应用来定】7 X5 E3 U6 Y. e: x5 x6 U

8 ]8 Y4 d( e5 ~5 f& J

# K* k- h7 a, V1 E: b, E; j$ U6.2 开启TIM2三个通道的PWM输出并使能TIM2./ k( e7 }4 D3 `5 H* Q& w9 i

; o2 A6 O+ ?; d) Y& Q! O
. i  s9 S+ I. s" Y
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
( ~% [, E) i  p3 f  t1 ^3 S% \
. c! k& l1 x9 T$ u+ ]3 ]
, R6 {- Y9 o' _) S1 _6 J
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
/ x( S1 [) `$ c2 ^8 H0 K7 {, C9 e" s1 y6 j' o0 Y; \! l! d5 A

$ F5 K4 y3 i. o' W. q& p- EHAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
7 D# T" P* f( W1 m1 p$ N7 [9 D. J* Z4 w
, J& E" s! C' Z0 ^2 o4 p/ [# m2 `
6.3 做ADC的校准操作。
1 p7 g% B* c* B- }- f, g# P1 x
0 S! T, M3 h8 B! M+ Z

& L& }) A7 s0 J$ E% n+ e  kHAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
  g. P# I+ J, ^7 }4 G+ `
' g5 a2 o' L/ C4 Z6 U* J
& M2 G/ O! U$ H2 e. l  ?4 ?
6.4 做好ADC转换及DMA传输的准备工作。Value_Adc为存放ADC结果的内存数组名。4 f- f& y! I( P4 r3 n5 u% ~6 ]

/ F' r8 g: N& H$ ]  j+ W

8 B  u5 c' R  @; jHAL_ADC_Start_DMA(&hadc1,(uint32_t *)Value_Adc, 3);# O  c2 Y, Q4 s% y
, J! {) m( v5 l5 P

! t8 l: N" D1 F5 ?6.5 开启TIM6的计数并通过它触发AD转换。
3 x/ R& i% S, M. M
9 y$ N7 G7 @/ J  z
+ A. u3 H- }4 U& J" [$ q
   HAL_TIM_Base_Start(&htim6);
8 u7 J" t# y0 t) O+ s6 Z' E+ m4 E* g7 |# W" U% f; C  z. Y: I

( k* q, r% x  @4 B# P9 _6.6 在DMA传输完成中断里添加处理代码。
' h1 [' x. @$ F5 L; S( G/ a1 Y; d7 Y. i2 f' D) e0 b; @8 W6 B! ^
3 w+ _. h' _6 Z
8.png
( s! k( q1 p7 _9 q% [
$ U0 f- a8 @" b) V
, j1 f1 O4 H* u# b" [* j' M
将3个通道的AD转换结果赋给相应的比较寄存器以达到调整PWM占空比输出的目的。
  m4 ^2 f+ _3 g/ J
$ p4 z5 z' V4 O% \- V

- E3 t5 f( e7 z* f7 E* w0 ^& b因为这里DMA是配置为NORMAL模式,需从新开启DMA传输。$ p; O' _4 s+ ]

" q0 V. q) k; c2 t. G6 g
; b/ D' T& N: u; a# E. B
7、结果验证。编译运行查看结果。【三路PWM输出,占空比与ADC转换值相关。本示例的ADC输入没有实际信号,只是悬空而已,结果仅做演示。】
7 U) p. [3 X; m" k9 N  |' u
* m; A8 {2 Z3 e+ h
$ j6 Q0 @/ y' Y$ S$ Q
9.png
9 a5 w7 N# Y6 r$ E8 |' w8 ]& \/ d3 d/ d2 y
收藏 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,软件仿真进不去呀?
2 n6 ~' Z6 B  l4 Q
yumeii 回答时间:2019-12-26 13:53:43
h_12345 发表于 2019-12-26 10:26: K0 `3 l- G! W- E& {" @1 C! @
请问用什么版本的KEIL,软件仿真进不去呀?
6 Q0 n" y5 Q- k* A% d
5.26、5.28都可以吧

所属标签

相似分享

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