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

【经验之谈】基于STM32F407 ADC采集+DMA传输的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-8 16:00
前言# x: H* ?- t5 j+ t! G& l# w+ {( W
       有的项目中需要对多个通道的电压进行一定频率的AD采样。
% `6 I$ ?) L- Q1 B! h8 F& n/ C5 S第一种:是使用定时器去读取,通过检查转换完成标志位来读取,但这样就会加重整个系统的负担,占用CPU资源。# H% D. y% p2 z8 J( j% P
第二种:是采用定时器触发多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存,通过DMA中断来获取数据。比如我们这次项目中就要1kHz的速度读取DMA,并通过DMA传输。
0 U, ^+ {( O' v7 e/ n这样做有以下几个好处:
. B$ V6 |) ~9 `- x2 g1、由定时器触发ADC采样,这样采样的频率可控,且定时器触发不会占用任何CPU资源;
+ D  \4 k1 j( V/ N2 G' }2、DMA进一步降低了任务对CPU的占有率。  b" e! z! W0 F
1 J3 t( q0 X! t8 c5 w
1、硬件原理
" |. e) O0 I! X. Z3 `& ^6 M1.1定时器
6 _9 e$ ?) q; @: C* L    该项目中,我们选择TIM2的TRGO为触发源来触发ADC的转换。! a# U) o) W8 ?1 a9 g! z
即使用该函数:
5 i* V$ l( d- D8 ~" T   
7 A4 W+ C' K# e- |8 s下图为ADC转换的触发条件:
" U! i  |% s( V( w
  n. M% v; `$ n5 O0 N8 G1.2 ADC( _, M' l, {' Z) n/ a: H
STM32F407的ADC的有规则通道和注入通道,规则通道扫描采样,配置好规则通道后,定时器更新后1 J# b4 x0 j6 l% `5 l; ~
触发ADC转换,ADC转换完成后触发DMA传输。2 ?6 l0 M( O, R: d6 e/ O; C

9 z2 V# ?1 F+ h6 r. `, J+ R( y如下图为ADC 内部使用框图:" B% w$ I4 {( ?- q$ _9 _
  X: Z! C8 T, Y/ p
1.3 DMA传输
9 q& }  p% V; b; O0 p5 l0 K* GSTM32F407有DMA1 和DMA2两个控制器,下图为 DMA的请求映射。
" @. J* v3 }: T2 \% V
7 z, p9 b( x6 h; [5 W0 f. }) @3 A  ^. H3 Y6 N
我们使用的ADC1,也就是DMA的数据流stream0 通道0,用ADC的转换完成标志触发DMA数据传输。
& V0 i+ c, r1 f2 m  N; Y3 K: L( r& b3 j. ]
2、代码部分
% l6 Y% d  y% H* O) X! p" m9 O6 h2.1定时器
7 G; ]3 O" }9 E! ?' @2.1定时器初始化! t8 Z; `6 [6 f5 P$ X
我们采用的10K hz的读取频率,定时器使用的是TIM2,TIM2是挂载在APB1总线上面,时钟频率为84M。9 j4 d: g3 i3 Z3 Q3 M/ y
我们设置TIM2时钟分频为84,即1秒钟计数1M个,每计数100个触发一次定时器中断(这里只是用于测试,
+ |3 f- R: V7 ~9 ]0 Y* b与触发ADC转换没有必然的联系)。
: v( u' U' Q3 j, B) G
& \9 h; I) x) a1 {% U, e; ~0 p2 P9 Y

+ z" z6 W/ C+ U2.12 定时器中断函数% M* u1 i& A; o9 d+ L; {
为了测试定时器是否正常中断,我们加了定时器中断函数,并通过IO口的电平翻转进行测试。
- p# P8 ^& p; v  }* p2 }; |$ S* k" I2 W6 u
通过逻辑分析仪可以看出,定时器按照设定的时间周期定时中断。
- H4 P' {$ ?9 b1 d9 W2 X可以看出方波的频率5Khz,则进入定时器的频率为10Khz,则1秒钟触发了10Khz次ADC转换。& I4 k5 U' J) z1 Z
6 i' T! C) @) Z( q" ?8 A: C
2.2 ADC部分
# u+ @6 N4 d2 f$ L每个通道都可以单独配置为不同的采样时间,我们获取ADC的频率为10khz,一共要转换的规则通道数为4,
. M) Z5 {4 @% ]9 ~也就是说留给每一路的转换时间最大是25us。* t$ R! ]0 B6 r& Q  N6 v; v9 ]3 ^  i

$ W$ A: ~. w/ m: v3 ^- V( b& G" q2 P
由上图可得,在30M的ADC时钟频率下,12位ADC的最大转换时间为16.40us,虽然我们采用的是21M时钟5 o3 t, i  L2 E3 E% z% t
时间也不会多到哪里去,依然满足我们的采样要求。ADC初始化代码部分
: Y1 P9 P: ]3 h. A5 t1 m) R) }& i7 @( R
设置规则转换通道和单路转换时间- o. f  D6 G5 Z; |' u: p
3 C9 ?8 N" ]9 Y9 d0 g# F
我们设置规则转换 通道数为4,转换优先级根据ADC_RegularChannelConfig函数
6 q) `2 u5 f/ @$ Kvoid ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)中、
- s( e, L: _; G( {6 `* X) y4 f
0 X# X& C- R0 s4 N, K& [2 u3 k) ubank的大小而决定。$ h: S' Q; N) K. E+ i9 J: A
每一路的采样时间为84个时钟周期,约等于5us左右,符合25us范围。
- s# K% t8 Y' |, k! A  U, T" y+ S3 ]2.3 DMA部分
% p! J& N- a* C! R- e
! l1 |% M+ ]  S; O. }$ E5 k8 L2 `+ L# y7 V
2.4 main函数部分) Z# k" _- y  o' _
我们定时DMA传输数据的个数 len 为64个字节   1ADC通道是2个字节,则4个通道就是8个字节7 g' F7 f) `% O+ g  s  F2 Q
64个字节需要8次DMA传输,则会触发DMA传输中断。数据存储的输出uint16_t ADC_Rx[100];//接收的数据,即原地址
+ E+ s# P" ]) X3 }& p! ?即DMA传输来的数据会存在该数组中。
- ?- G4 L$ m  S9 R6 d4 |
8 C+ _) H1 G" z* c4 `下图为仿真数据,我们将通道2接在GND上,因为为四个通道,所以每间隔3个位,会得到几乎相同的数据,) x8 g* h( C" a& m  D" D
也就是0V所对应的ADC值,数值在0左右,如下图所示。- U# d  M6 B+ J# P2 X
- w6 f  e  J3 f+ o2 d9 n4 U
: L% d7 k9 b) N$ Q) g
- K3 `( f4 J; M6 z+ W( i' H
9 K1 c( e5 X/ Y; Y$ t; E0 P
附加知识
6 @0 W0 a0 K  z) e7 K5 \& u& C    ADC注射转换2 b6 F& `6 `4 W! B, b) _
    ADC注射转换最大可以插入四个通道。
- }- A5 \' D7 R* Q' e, A3 L8 x2 m2 P; d3 Y; Z) V" _& _# r" ]/ v* s
设置注入转换的通道数为1,通道号为14。& }0 g7 o2 F3 T! {" V( ^
3 C5 Y0 c. ?: L8 {" x( L5 e
   ADC_AutoInjectedConvCmd(ADC1,ENABLE)该函数作用是在规则ADC转换完成后,自动执行插入ADC通道的转换。" t( ?: P# K2 ^5 i8 V
  插入ADC通道的转换值位于ADC的JDR寄存器
% J0 i6 n- E. w7 p& T
( U& h# R* v& ?总结- C* \; a+ y7 t' ]3 Q7 F
以上流程就是使用STM32的ADC+DMA+timer实现自动定时采样模拟电压的配置使用流程,若读者发先任何疑问,妄指教。

6 G' D" _1 ^. V3 A, _+ J
3 @* S2 W5 k! G) M" ], `5 I6 Q
7 R7 Y8 U  A* V  h: W; ]( y
作者:woai32lala- I. l' }% ]. N: b5 ]8 f
收藏 评论0 发布时间:2022-12-8 16:00

举报

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