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

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

[复制链接]
STMCU小助手 发布时间:2022-12-8 16:00
前言
. Q3 O' }8 a/ Q; C6 @9 s) C       有的项目中需要对多个通道的电压进行一定频率的AD采样。6 M# ^/ j! ?/ p  O8 c$ z% S7 S
第一种:是使用定时器去读取,通过检查转换完成标志位来读取,但这样就会加重整个系统的负担,占用CPU资源。
( Y4 V- I7 O6 o3 c第二种:是采用定时器触发多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存,通过DMA中断来获取数据。比如我们这次项目中就要1kHz的速度读取DMA,并通过DMA传输。
5 _, E  ?" {& t( O% \/ ~这样做有以下几个好处:, i/ b/ G6 ~" _/ x4 V) a
1、由定时器触发ADC采样,这样采样的频率可控,且定时器触发不会占用任何CPU资源;6 M' ]. a  {- x, M
2、DMA进一步降低了任务对CPU的占有率。
* r  X, J. A' \% _
+ j, b. Q* n0 `) r' A  G1、硬件原理3 `' ^. \* G9 r/ Y) c; y2 Q& I9 u
1.1定时器1 K0 a9 i% I% T
    该项目中,我们选择TIM2的TRGO为触发源来触发ADC的转换。
3 o, _+ }! @1 \; s; u5 @  U即使用该函数:
% Q- r; m3 E* u3 J) A    $ [0 Z8 y# S$ d5 K
下图为ADC转换的触发条件:
* a) ?! z1 D% q8 s6 {/ ]6 Z: p. e. z+ v; U; Q2 p" w9 s
1.2 ADC6 Y5 K, h( V: C* Y5 e  b' [
STM32F407的ADC的有规则通道和注入通道,规则通道扫描采样,配置好规则通道后,定时器更新后
9 |6 h+ B2 |/ F7 T* c5 b4 ~# R触发ADC转换,ADC转换完成后触发DMA传输。0 {! f1 X) d* j& J8 o
) s! d  A4 a: G5 x; z
如下图为ADC 内部使用框图:$ l2 c! o+ K4 U. x6 c  b
9 z) A2 I" x: f6 s& o! l
1.3 DMA传输
- O6 d7 T5 Q" J1 E5 q* b& ZSTM32F407有DMA1 和DMA2两个控制器,下图为 DMA的请求映射。
7 a( D! [% l) Q: [
# Q* Y, P. u7 X' a/ @/ l
9 l6 K/ ?- ^4 n! v" I% M8 q( ~我们使用的ADC1,也就是DMA的数据流stream0 通道0,用ADC的转换完成标志触发DMA数据传输。0 b" @' b; x, V/ w' j

% M1 f' h0 \2 J2 E; A' ~2、代码部分: K2 j& }% g% m( r9 L7 Q/ r
2.1定时器+ D3 p$ t1 a6 r( U. S: Q
2.1定时器初始化5 R, M" E; p7 n: h9 e# C* K. [
我们采用的10K hz的读取频率,定时器使用的是TIM2,TIM2是挂载在APB1总线上面,时钟频率为84M。. Q4 w9 ^8 p5 g) c+ W
我们设置TIM2时钟分频为84,即1秒钟计数1M个,每计数100个触发一次定时器中断(这里只是用于测试,
% I% \& J; C+ }) r- i- H! _1 T' {与触发ADC转换没有必然的联系)。8 t/ Q' N' }8 d! b, D

- g7 k( {- R7 T$ ^. x' F" [, I1 [! }7 b' S" E  |0 Z3 [9 e2 [
0 S9 Z2 D; {% F% ^  r) O& s7 u  y; I
2.12 定时器中断函数9 P8 P0 ?- C; Q/ d" i
为了测试定时器是否正常中断,我们加了定时器中断函数,并通过IO口的电平翻转进行测试。$ ~- b( g+ T7 J. P, q7 w& s

& B  y( H2 |* o8 G通过逻辑分析仪可以看出,定时器按照设定的时间周期定时中断。( ?5 k( H9 A. [: u
可以看出方波的频率5Khz,则进入定时器的频率为10Khz,则1秒钟触发了10Khz次ADC转换。
. F0 n. I8 k" x5 G9 \% r8 k# _
) s$ {# p9 \# L7 h6 }8 _2.2 ADC部分5 S, [- K9 E4 M3 ]7 ^
每个通道都可以单独配置为不同的采样时间,我们获取ADC的频率为10khz,一共要转换的规则通道数为4,) q, o& k1 ?, d, ~* \) W
也就是说留给每一路的转换时间最大是25us。9 n* ]. ]6 x2 r) ?* O- Q

& x+ C4 W3 L( y& L. [% @( C7 s6 f4 Y* L' J; e
由上图可得,在30M的ADC时钟频率下,12位ADC的最大转换时间为16.40us,虽然我们采用的是21M时钟7 I5 B, g. u1 F* c' W
时间也不会多到哪里去,依然满足我们的采样要求。ADC初始化代码部分
$ R: E3 |/ q( j8 r
$ G; K* m; j$ m/ B3 |. E设置规则转换通道和单路转换时间
2 ]+ _/ ~! _2 O" @/ N) ]5 I: [0 d$ d7 y9 q: I
我们设置规则转换 通道数为4,转换优先级根据ADC_RegularChannelConfig函数9 d/ P& u0 p- s0 t, j4 m6 W
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)中、
- ?+ F7 J, U8 O& F& U* F5 T, Y
* a$ {. q' K* f$ Qbank的大小而决定。$ C% v! J# z6 [6 A( T/ G6 e
每一路的采样时间为84个时钟周期,约等于5us左右,符合25us范围。4 O$ w# B/ t/ A# S) K/ q( A
2.3 DMA部分
% @1 t5 x7 G; P8 K3 [, u3 f. |/ E$ Q3 ~" W3 H% O

* p  h% K6 \/ ]6 f- a* f% N& ~* A2.4 main函数部分
7 G+ x9 O- [9 W/ W* @# b# ~我们定时DMA传输数据的个数 len 为64个字节   1ADC通道是2个字节,则4个通道就是8个字节
7 ~# x" M3 h& [6 B64个字节需要8次DMA传输,则会触发DMA传输中断。数据存储的输出uint16_t ADC_Rx[100];//接收的数据,即原地址
6 g: A+ V2 m& x/ l即DMA传输来的数据会存在该数组中。
* r- j$ ?4 ~4 d) V. p' b
0 [# \+ g  K, S6 A6 K0 E: C下图为仿真数据,我们将通道2接在GND上,因为为四个通道,所以每间隔3个位,会得到几乎相同的数据,) ?4 C1 w& {( j% P6 J
也就是0V所对应的ADC值,数值在0左右,如下图所示。" c8 e0 U  g( c' p/ T. e; V/ F! V( M
! ^. l1 Z/ n2 g

' q/ c5 E. _( E% A4 P3 t8 a
8 X7 r" Z) h8 j8 p# e5 A! m$ I
附加知识3 g  C: y$ p8 a  |: ~5 g) y
    ADC注射转换- W0 z/ L) i, _0 q* K7 K
    ADC注射转换最大可以插入四个通道。
9 V# A! T  e4 v1 Y4 x5 m2 q& Y3 }5 h" ]% Z5 f/ m0 O
设置注入转换的通道数为1,通道号为14。4 T0 V" `+ ^( [& @# e  I5 g
0 f+ b  I1 O/ {3 S
   ADC_AutoInjectedConvCmd(ADC1,ENABLE)该函数作用是在规则ADC转换完成后,自动执行插入ADC通道的转换。$ N8 h8 p) P- M  `" D/ d
  插入ADC通道的转换值位于ADC的JDR寄存器
2 d+ S- G6 B. U8 F% ^2 ]9 j
- I) W- Y  R7 W总结. U, S( }6 M  f/ Q. \' ^8 k& s
以上流程就是使用STM32的ADC+DMA+timer实现自动定时采样模拟电压的配置使用流程,若读者发先任何疑问,妄指教。

! p7 v  z! |. O
) W- ~2 r/ z% O9 Q

" D7 u  l7 F  K+ t2 M1 E& G! k1 W作者:woai32lala, K/ w, C0 M4 ]6 i, M
赞 收藏 评论0 发布时间:2022-12-8 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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