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

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

[复制链接]
yumeii 发布时间:2019-12-25 15:54
这里以STM32F334 Nucleo板作为硬件平台,使用ARM keil MDK集成开发环境。
: @( J% D9 p& G  x3 v( b5 G/ M; w+ J

* _8 [& a8 e# {对3个ADC通道进行连续、扫描转换,转换结果通过DMA传输到内存,再作为TIM2的3个比较寄存器的值,以控制TIM2三个通道的PWM输出。/ u" _* A0 z8 r* X

% U$ n* O, N1 r% D' w5 k, a; K3 E

9 E" u8 }) [8 T& R: U另外,使用TIM6的更新事件作为ADC转换的启动触发源。本示例中,TIM6的周期远长于TIM2的周期,通过TIM6周期性地触发AD转换。
9 u* m4 ?+ E' ~. K
* W& Y; F  I1 H# Y3 s2 K+ b5 I9 D- q

8 D8 }% H* K! y  O$ T使用STM32CubeMx进行配置,基本配置过程如下:
( G  ?7 P4 }. c5 Y% r% o4 W2 q" X8 }- {+ I
/ ~4 i. K5 I% n! ~; s6 R

2 i# _1 v' w/ o" L- n9 W8 ~1、时钟配置。4 V& f8 E3 R1 k: i/ Y
3 h$ G: C0 k/ E+ a+ \, q4 t" c5 j
) W$ x6 i. j7 i1 w/ `. c
2、配置ADC。选择ADC1的通道7、8、9三个通道,单端输入。0 ]9 P, g5 k8 X! R

, q9 H0 V5 ?: x/ D0 p' i+ J
* f1 Y+ F; |4 Z& R& Y* L
1.png & n2 v+ S, P7 _, `
) X4 X2 w9 M0 b7 y

, D+ S8 H) R0 ]; x, Q 2.png
2 {6 [, }5 R8 I, x4 ]
" g) X! R8 g, F) I& J# B8 ]
7 @$ W) W. _! F& R
3.png : D5 X$ Z( Y9 f- f

+ A, i2 _1 Q$ K* v

. G1 c$ J' ^- P8 ^配置有关ADC触发DMA传输的内容【EOC触发;Normal模式;从外设到内存;DMA传输中断开启】  N1 h9 P1 o. ~: |) O& n/ _; f% R
6 s- m  _, `8 l' D& f: K; `0 N
" \6 Z: M0 Z1 |. r, {# j
4.png # h' a9 e. b" p8 }

2 K( t" w- n: X. s2 T

! N7 a, V3 ?  K6 v3 _. X+ L/ R* c; O3、TIM2的配置【时基参数/PWM配置】
- z0 i  w5 N! [7 ~# h0 r' y
0 @% N2 F* _# l, x. \

0 |7 m- X& b0 A8 E5 k" A# j. H' N  V 5.png 2 y' `, }8 j4 v3 }9 [

8 a( d3 X0 q- p; |" w) A

9 l+ d( |* f& G. t( pTIM2的三个通道的PWM初始配置一样。
" h2 u' T0 H1 H7 u: x6 t, O) w* t; M* \0 V% U0 Z5 }4 w

- G! Z: |. |1 x! P: n* A# o 6.png % z! ~+ o+ f" J
" j; Z' x9 s6 v' ]% [+ p6 m8 F/ \
( a: p: l" A% a' k
4、TIM6的配置如下【其中更新事件作为触发输出】$ M  U9 S7 m; v" n

) G8 t7 s' G2 W- h7 M: E; N6 U

& C. _- d3 t4 i- `! e/ n# A 7.png
1 `/ C% K. X& n- ~- v9 [& j2 f- V! G5 h! k
. }, f2 l8 P, C* b1 m( d0 v  ^' @

* g7 w4 M& y9 a5 N. f" O5 m* {- ]& }5、生成初始代码,创建工程。& B3 p$ S  m, F* j* i/ [* d6 |
! s! x( g- W' y1 |: z( B4 ~

- I4 ]5 |1 K: X% }6、添加用户代码。
; j. C7 m1 z- }+ x& L$ b. @% M/ y4 W1 N( e. \7 M: L% r/ G
6.1关闭TIM2的3个通道CCR寄存器的预装载功能,修改即时生效。
0 Y; A, P( B6 T/ ]; O
! K5 |) n9 H5 R$ Y  ^. i
8 d. i* @6 W7 j0 }! R: {
__HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_1|TIM_CHANNEL_2|TIM_CHANNEL_3);【这点不是必须的,根据实际应用来定】
& \9 o! _- N1 Y: L  S0 [" z" d+ ?! E
/ s, ]% c( Z6 g7 M& r& q- G6 T! b1 |
6.2 开启TIM2三个通道的PWM输出并使能TIM2.
6 P0 {7 S1 z' B
% F" ?  _1 m) K% L5 z0 E
+ R$ m  O$ A0 r) G. V
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
- Z3 ]/ f9 q4 X* `/ e4 B" d. c1 Z$ D) }  A+ ?8 s
2 I; z  W1 H) n
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);2 f5 P- s0 \4 b# }- y

: C- A5 Y, Q4 V. H/ d

  l3 g3 W* O6 `6 o; q) P! pHAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
! G9 K/ y) O# r8 Z0 I. s: _2 F* k4 f  S: b3 n+ p3 q
3 ~7 r* H6 m7 R& b
6.3 做ADC的校准操作。) c$ T& a% `( P& P; \- a: L

4 k8 e' C" N4 X# U2 V! k, ]
  a2 w4 [/ d# M; X- d8 C( a, B7 u( |$ ?1 z
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);3 M6 Q& T; S3 T; Z
$ ?; y  Y& G# z4 g
3 Y4 h9 Q* v5 Y/ H
6.4 做好ADC转换及DMA传输的准备工作。Value_Adc为存放ADC结果的内存数组名。6 t+ ], ^! h: y7 W1 V1 u
& p* x1 A( \5 X( S( m' Z

3 r0 v* L5 P6 ?9 d/ gHAL_ADC_Start_DMA(&hadc1,(uint32_t *)Value_Adc, 3);$ k( i" ?, I3 i4 g- B8 `9 A* b

2 [6 S/ l/ a# Z9 u0 x1 s

7 k: i! G5 T% E( k( V, X6.5 开启TIM6的计数并通过它触发AD转换。
, z% K, x# K8 z- @% @" |5 G. B
6 e: I- G) K! Q+ v
! E- r: I+ q5 z( g+ h
   HAL_TIM_Base_Start(&htim6);
' U, n: K/ [' B3 i& a- J* E" I  N5 o6 g( \
. c: r" q# E2 \
6.6 在DMA传输完成中断里添加处理代码。9 j# A: @3 U; o; ?5 {) p
! S! D6 a" l' s8 I3 \$ `
( `( a0 _* A6 J
8.png
1 w# h( ?$ N! z# R" m
) E3 Y% @$ x) D0 D4 G8 C

! `# r  V* x" L: x2 i将3个通道的AD转换结果赋给相应的比较寄存器以达到调整PWM占空比输出的目的。. ^5 X7 H5 u& |* a- [) [

% n. V  |0 y- l; {' @9 g* t- F
8 a! r6 ]1 p0 {7 f
因为这里DMA是配置为NORMAL模式,需从新开启DMA传输。
' f/ U( v. @1 j8 @$ v2 e' d9 z+ ~
2 }6 {& {5 @6 i

$ N4 X* K! V! q3 y- `1 h7、结果验证。编译运行查看结果。【三路PWM输出,占空比与ADC转换值相关。本示例的ADC输入没有实际信号,只是悬空而已,结果仅做演示。】5 Y- I' F- H$ K/ @8 ~

* e  f$ p: O, M* [  J( U9 z6 B. Y6 w

- V* S. l! c5 \) P 9.png
; F! L  q7 d# t/ n5 i" d3 Q3 H2 g0 s3 r: R
收藏 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,软件仿真进不去呀?
8 B6 n8 h% h6 K; Q( X
yumeii 回答时间:2019-12-26 13:53:43
h_12345 发表于 2019-12-26 10:26
9 A! z/ u9 F; L# n) U请问用什么版本的KEIL,软件仿真进不去呀?
: x2 f/ X& D( t1 B# [
5.26、5.28都可以吧

所属标签

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