|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
AD采样在电路中是一种比较常见的功能,可以用于电池电压检测、传感器值读取、信号采集等。STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。今天,我们简单说说在单通道情况下,AD采样的几种用法。! M# Q t' k2 M- C' Y* F
1、AD单次转换+软件启动& {! s) \# ^" c, S' W `# ~
最基本的用法,通过程序启动AD,AD采集一次,我们就去读一次。这种情况,建议开启AD转换完成中断,在中断中读出AD值并做处理。
2 A) X; o5 ~( ]: ]$ Y' p5 q/ z这种方式的优点是配置简单,缺点么,太T么简单~' n( M j% K) ^ n$ l% G* y
& r1 f7 {# b9 g4 s. I% [8 j' S
初始化的时候,启动一次。然后在主循环里,每隔一秒启动一次。8 V' x A6 b9 F8 e
& i! X Z0 z9 q! N: {; Q
在中断回调函数里,进行相关处理:: h* p- e4 f) f' _* I* V9 b1 c9 F
E. O j8 K- b, Y9 O0 G电脑输出如下:
8 u% A4 p2 B2 D1 N
* s) @' G7 Y H; p+ M2、连续转换+软件启动
0 l% a1 D$ l4 `9 s在方法1的基础上做调整,从单次转换,变成连续转换。也就是说,只需要开启一次,它就能一直转换,直到程序让它停止。
- o4 p' X! U7 ? `4 h1 G+ B/ z7 m8 U+ F优点是省去了频繁开启中断的麻烦;缺点是需要频繁进入中断去读AD值。& H x+ V$ Z9 p1 f" g
配置如下:
1 a0 j' X" [9 p
h' y" N; X9 h9 S( z初始化的时候开启AD即可,后面无需再频繁开启。3 ~( i; H6 }. b9 O6 C: u
4 E1 o9 o# ?( X5 a% J/ b3 C在中断中进行处理,当AD转换次数达到1000次的时候,停止转换。2 [& E3 ^: [9 g/ \/ C; {" d
注意事项:函数HAL_ADC_Stop_IT(&hadc1) 需要在中断内调用,中断外调用不起作用。5 R* W4 W& R8 [6 \) n8 }
) v( Z1 J- P2 s2 L5 P. A" J }# k: x8 N3、连续转换+DMA+手动启动% K8 v3 I4 L. Z4 e; x5 ~
在方法2的基础上,引入DMA这个东西。不得不说,DMA真的是很方便,省去了很多手动操作的麻烦。可以直接把指定数量的AD转换值存入数组里,可以单次存入,也可以循环覆盖。
6 y, j" u+ N7 ]; J8 A+ l5 @在方法2里面,每次转换完成,需要我们手动去读一下AD值;启动DMA之后,完全省掉了这个过程,只需要等待1000个值全部转换完成之后触发一个中断即可。' p2 b% V; I* o/ {
, B" ]$ q$ y% \2 O; i9 |! C' }
初始化阶段,开启DMA传输:
" b' f. p2 X, n7 B1 e1 ]
7 {5 ~, e: K* b7 H, U传输完成之后产生一个中断:1 ?0 Y. R- ^# g
- s* {3 O. [% J4 t1 f这时候看数组里面的值:# b! Z7 ^; R; ^
& J% }5 ` c. I& B9 K4、连续转换+DMA+定时器+手动启动
4 A: x( q% P5 Y! f1 @方法4是在方法3的基础上稍微做了一些调整,主要面向的需求是:固定时间间隔的AD采样。比如说,每隔0.1秒,需要连续采样100次。$ v6 h, Q9 V) N$ F3 {+ D+ Q
通常的做法是,使用定时器做一个定时中断,在定时中断里,调用函数:+ i8 j8 Z3 ~7 n9 R1 J* W
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ad_value,1000); //启动,同时开启中断,方法和原理都比较简单,就不细说了。7 Q9 g$ N* u& s1 k( X
5、连续转换+DMA+定时器触发4 O5 T ?+ B6 F/ U; i- ~
方法5是对方法4里面的需求的实现过程进行了优化。STM32的定时器可以自动触发AD转换,省去了手动启动的麻烦。例如STM32的tiM1,TIM2,TIM3和TIM4,以及外部中断,都可以做为启动AD转换的触发源。
A9 a% P6 k9 _) S以TIM3做为触发源为例,如下:% H( f3 w( D2 i) `% e( \& d' t8 _
z1 ^& }& h! {2 \: x/ _3 j7 s- U1 t
DMA这里要开启循环模式:( [: H; z/ P& p5 Y. |
3 [7 Z8 B8 H+ b) vTIM3的配置如下,这里实现了一个1ms的定时,也就是说每隔1ms自动触发一次AD转换:
4 R' p8 ?# S& m/ W8 v ^
) t; k% J7 L' L/ l主函数里代码如下:
- _6 V$ P/ Y6 Q* X. @; Y- I" U
8 U( }* h& y7 n0 _4 V& P# d
然后,中断里做一下处理即可:' z& W1 D; H; Q' z( S
; `. T5 N2 X( |, ~5 C, D& u好了,对ADC的使用方法做了一下简单的整理,当然肯定不止这些,必然还有别的玩法。这篇文章以思路为主,没提供代码,感兴趣的小伙伴可以慢慢研究~9 R/ `7 u n% L5 ]6 t4 f0 u0 w8 `9 A
|
|