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

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

[复制链接]
STMCU小助手 发布时间:2022-12-8 16:00
前言  x. ^" D& h1 h2 V! Y' O( J
       有的项目中需要对多个通道的电压进行一定频率的AD采样。
8 `2 y) L# I, c$ N# V/ N/ r第一种:是使用定时器去读取,通过检查转换完成标志位来读取,但这样就会加重整个系统的负担,占用CPU资源。- @+ z. X1 I+ x( o# v& |
第二种:是采用定时器触发多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存,通过DMA中断来获取数据。比如我们这次项目中就要1kHz的速度读取DMA,并通过DMA传输。' N& A& i5 C$ Z, X) u" h+ ]9 J
这样做有以下几个好处:& y4 e4 e  n. i" a% }8 R4 Q- g6 S
1、由定时器触发ADC采样,这样采样的频率可控,且定时器触发不会占用任何CPU资源;5 u. t# X: F& P( B8 ~
2、DMA进一步降低了任务对CPU的占有率。
) q! P9 p  D$ y5 U5 ?' o( C$ ^! x* C: J3 |+ C* ?- a7 J8 Y+ n/ _
1、硬件原理2 s7 v0 K; [! Z2 M  \* }6 D
1.1定时器& c1 h# W+ L5 @; Z$ E' e
    该项目中,我们选择TIM2的TRGO为触发源来触发ADC的转换。1 d) W; Z4 _5 K0 v$ ]6 Y, i1 |! M
即使用该函数:
% C9 ~& T- B. S( E, e4 L5 v& t    9 Q( h& }" e3 c$ A9 ~  Q5 d& E, L6 S0 j
下图为ADC转换的触发条件:- q4 k. c- [- R( f

2 m7 ]( ]( C3 ^7 c3 s$ {1.2 ADC
3 ]! e8 w  q! u! J7 S# ^2 ?4 aSTM32F407的ADC的有规则通道和注入通道,规则通道扫描采样,配置好规则通道后,定时器更新后
" o7 Z9 j7 i6 ?9 T3 q3 H. y触发ADC转换,ADC转换完成后触发DMA传输。8 z" c; f" t( [

  l  M, L$ H0 w# t: r" S8 ~如下图为ADC 内部使用框图:
- J1 T2 e* f! _* i, x& e  a9 ^+ l7 p2 \& D" r: E
1.3 DMA传输
. \; j6 D, r1 {! K% i7 HSTM32F407有DMA1 和DMA2两个控制器,下图为 DMA的请求映射。/ }% X2 o/ K- o
' q6 [' N/ O5 ~9 F5 r& g
) k0 K( ?% c: ?* {+ \* P1 q
我们使用的ADC1,也就是DMA的数据流stream0 通道0,用ADC的转换完成标志触发DMA数据传输。
3 V# u/ d. t: r6 d
* ?# B# u: u$ ^# h% j- ]2、代码部分
) J+ X: q+ ~6 C4 V8 P2 N. {) F9 B2.1定时器; R+ ~: a. [; v8 m% ^4 n* x' l
2.1定时器初始化" l  E+ t7 C2 b
我们采用的10K hz的读取频率,定时器使用的是TIM2,TIM2是挂载在APB1总线上面,时钟频率为84M。) X( u  {8 I2 ]( E4 }4 c) i
我们设置TIM2时钟分频为84,即1秒钟计数1M个,每计数100个触发一次定时器中断(这里只是用于测试,1 v/ [' B: `1 v' C2 \8 `
与触发ADC转换没有必然的联系)。7 ~7 ]3 f; ?5 u2 ~. \' j
5 j; _+ y$ {( h4 }0 p

6 L1 ]+ {# s2 R+ d: J+ i
/ I7 n* K4 C9 X/ V2.12 定时器中断函数
3 u! H# R0 N; d3 ?为了测试定时器是否正常中断,我们加了定时器中断函数,并通过IO口的电平翻转进行测试。
/ u; J& m& ?5 l! e, @8 M
: l6 _+ c; n" s% L通过逻辑分析仪可以看出,定时器按照设定的时间周期定时中断。: [$ M: x7 _. V; g3 A2 L
可以看出方波的频率5Khz,则进入定时器的频率为10Khz,则1秒钟触发了10Khz次ADC转换。
, y9 E3 Y9 D; ^/ |6 b8 ]) t
; V% N+ B; i. |5 u) t2.2 ADC部分0 i& X9 n7 s' E/ z0 X% n, H/ s5 w
每个通道都可以单独配置为不同的采样时间,我们获取ADC的频率为10khz,一共要转换的规则通道数为4,, F/ D& u& D8 I, O9 C# v* o% U
也就是说留给每一路的转换时间最大是25us。! w$ |5 p$ u, [* f1 P* g+ K
, J! g, v* b8 S: \! _% B% f
' ?" E- d* r$ L
由上图可得,在30M的ADC时钟频率下,12位ADC的最大转换时间为16.40us,虽然我们采用的是21M时钟
% i. k" B- M. K; Z8 G7 Y4 [时间也不会多到哪里去,依然满足我们的采样要求。ADC初始化代码部分) y: A! j$ z9 u6 k0 P# _
* i/ c7 ]/ J2 n; y
设置规则转换通道和单路转换时间
( S" u+ @- G, I9 J  S) e: \! S- s- u, m  P
我们设置规则转换 通道数为4,转换优先级根据ADC_RegularChannelConfig函数
! h7 h. A+ w0 c; B# tvoid ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)中、# x# c; D  ]' d) C4 |
1 h  A! D# m4 u1 _
bank的大小而决定。; _  {, y% ]3 L1 V( @
每一路的采样时间为84个时钟周期,约等于5us左右,符合25us范围。
, Y0 F0 o6 }% K9 I2.3 DMA部分
( R6 w$ s7 m3 V) i5 z
+ t, z8 W5 T$ W8 P- T" `5 U+ p$ Z- S9 U* f' u$ Q
2.4 main函数部分, z! d4 Z, {$ G7 U1 h
我们定时DMA传输数据的个数 len 为64个字节   1ADC通道是2个字节,则4个通道就是8个字节
7 C$ u1 O4 D+ P5 w" m64个字节需要8次DMA传输,则会触发DMA传输中断。数据存储的输出uint16_t ADC_Rx[100];//接收的数据,即原地址
4 P  ?, C+ L; T& U4 z- w即DMA传输来的数据会存在该数组中。% M5 @/ `$ k6 E! Z
" S6 i' D( N! H/ D1 o) z
下图为仿真数据,我们将通道2接在GND上,因为为四个通道,所以每间隔3个位,会得到几乎相同的数据,
5 J+ z6 h0 N5 V3 m" ~' }% u也就是0V所对应的ADC值,数值在0左右,如下图所示。$ `; c6 e5 D9 [3 a

; V- g$ d7 |5 g6 L8 u# z! @; ?5 L
! \' e5 @, A5 M$ |/ b' X- R8 b' O. X5 y

9 m+ X/ i3 c& n) y: u附加知识
% M+ {; ?9 p. |. v2 D    ADC注射转换0 `0 |2 ^) y$ g3 [, {
    ADC注射转换最大可以插入四个通道。' i4 Q/ ]( j+ r( v

7 @+ r% l4 x( h& c设置注入转换的通道数为1,通道号为14。
) e! u5 L8 R. @5 P' b# Q* S
5 Z+ H: U4 M: m, {2 a& H3 i   ADC_AutoInjectedConvCmd(ADC1,ENABLE)该函数作用是在规则ADC转换完成后,自动执行插入ADC通道的转换。
) e0 |1 W" g; i+ r! R% I) W  插入ADC通道的转换值位于ADC的JDR寄存器
* s  f( p# J) c9 B: F" r; R; n7 Z4 D
1 A6 _6 t9 k8 f) O总结/ i0 \4 |: ~) |# Y* u
以上流程就是使用STM32的ADC+DMA+timer实现自动定时采样模拟电压的配置使用流程,若读者发先任何疑问,妄指教。

% M2 Z) g$ [1 J5 ]/ w/ K# M+ p+ T% [
% p! \4 Z0 |" ^. z
0 V. K8 ]  _# c/ f, x; ?/ D" c
作者:woai32lala9 m% W. ~, l% q) A8 l& m" w) x' I
收藏 评论0 发布时间:2022-12-8 16:00

举报

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