STMCU小助手
发布时间:2021-8-5 11:16
|
AD采样在电路中是一种比较常见的功能,可以用于电池电压检测、传感器值读取、信号采集等。STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。这里简单说下单通道情况下,AD采样的几种用法。 7 j; c3 h, t( l; ]" } 1、AD单次转换+软件启动 最基本的用法,通过程序启动AD,AD采集一次,我们就去读一次。这种情况,建议开启AD转换完成中断,在中断中读出AD值并做处理。 8 l0 ^9 T1 b" Y* Y. R" d5 r 6 M! I+ K8 K6 R1 [ |( h7 W 这种方式的优点是配置简单,缺点么,太T么简单~
初始化的时候,启动一次。然后在主循环里,每隔一秒启动一次。! b) M/ }6 d p. s P
) ^, D8 h( s# c l' i- n1 g8 R 在中断回调函数里,进行相关处理:: ]5 a+ i7 B/ G2 }9 w! @% d/ H
' h2 Q3 v |# p" O4 j" h3 } 电脑输出如下:
( m0 P3 s/ Q! t# R 2、连续转换+软件启动. h. T4 r8 W" U1 z1 d S 在方法1的基础上做调整,从单次转换,变成连续转换。也就是说,只需要开启一次,它就能一直转换,直到程序让它停止。/ ]% [$ s! M8 N, O% e 3 }, H4 w# _4 r M" J 优点么,省去了频繁开启中断的麻烦。缺点么,需要频繁进入中断去读AD值。配置如下:
: [7 k+ l/ u* P% p' v, Q2 p& B 初始化的时候开启AD即可,后面无需再频繁开启。
* \/ y& P* m _5 y0 u+ O, I ! w+ f0 O5 W" M- Y& a 在中断中进行处理,当AD转换次数达到1000次的时候,停止转换。 注意事项:函数HAL_ADC_Stop_IT(&hadc1) 需要在中断内调用,中断外调用不起作用。2 X2 {0 a# S B7 Z( J
8 H c- T, q5 i: X( E/ N) F+ H 3、连续转换+DMA+手动启动# A0 h2 _* o5 c* q5 o; d 4 v4 K) E8 h0 O' Y7 _ s. B 在方法2的基础上,引入DMA这个东西。不得不说,DMA真的是很方便,省去了很多手动操作的麻烦。可以直接把指定数量的AD转换值存入数组里,可以单次存入,也可以循环覆盖。4 Z0 E9 R: I/ w2 v ' x( A3 P: a: s0 p4 T' W) b 在方法2里面,每次转换完成,需要我们手动去读一下AD值;启动DMA之后,完全省掉了这个过程,只需要等待1000个值全部转换完成之后触发一个中断即可。. \( k/ n& v( R! m " O& N( \7 R# F; B8 C6 q" O
. |: l+ ~0 V v$ o$ B, c, p 初始化阶段,开启DMA传输: : h3 P! m1 y* f
* U. r/ j0 G7 Y1 v) e 5 }4 s4 n* U4 F0 W 传输完成之后产生一个中断:9 p" Q) U. D& X$ ?6 Q% H! a
2 d" ]% ^& M/ P( g 这时候看数组里面的值:
( }3 }8 C+ E* h9 C4 F( Y1 C3 B 4、连续转换+DMA+定时器+手动启动' g* m, N; g7 i a 方法4是在方法3的基础上稍微做了一些调整,主要面向的需求是:固定时间间隔的AD采样。比如说,每隔0.1秒,需要连续采样100次。6 ^% m# }& Y. S) r / h6 z, W1 }7 d5 v) t& m 通常的做法是,使用定时器做一个定时中断,在定时中断里,调用函数:/ Z( i% l" q; D6 A - _1 C) N) C9 J1 E1 `, V0 q: b; j HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ad_value,1000); //启动,同时开启中断 * P- ^& P( w6 c2 |$ r 方法和原理都比较简单,就不细说了。 A4 P% M7 {! z6 Q6 a # n" ?7 G e7 ?; D8 r 4 {; o `# D8 e; @ 5、连续转换+DMA+定时器触发0 ?) [2 d# q6 V3 h * l/ C% l7 g- C( [8 J# y/ h, ?1 B3 r & w) e; R6 }' s/ g 方法5是对方法4里面的需求的实现过程进行了优化。STM32的定时器可以自动触发AD转换,省去了手动启动的麻烦。例如STM32的TIM1,TIM2,TIM3和TIM4,以及外部中断,都可以做为启动AD转换的触发源。 9 @ w- k9 a) S: k/ Q* `3 L: ^7 R 9 g+ O7 w( s7 z D, H 以TIM3做为触发源为例,如下:0 E1 ~! H- G$ ~# ?3 I
DMA这里要开启循环模式:. H& l. L/ F! ? \ n' f
0 f9 E5 H! y$ u+ U TIM3的配置如下,这里实现了一个1ms的定时,也就是说每隔1ms自动触发一次AD转换:) G7 g; C& G% F& F
/ f7 i) T/ b: p+ X% t6 L1 N% x ; }& X) F% y/ P5 Z, J( i 主函数里代码如下:
2 z; `7 m% q C0 ~. H 然后中断里做一下处理即可:
" p/ }4 ^$ K: q. s ` 好了,对ADC的使用方法做了一下简单的整理,当然肯定不止这些,必然还有别的玩法。这篇文章以思路为主,没提供代码感兴趣的可以慢慢研究! w( N* G* ?* }% b: @ 4 @5 H/ ~" \6 q- U ' A, m: Y, L8 u. C # g9 n* X. c3 } - r: O4 Q9 H# y5 Q2 D* v; c - c0 B; _: |, e4 }9 \. e) [ 2 I2 z3 z/ w4 t" X" C |
【STM32H5 评测】ADC 电压表
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
STM32H563 ADC+TIM+DMA应用演示
经验分享 | STM32N6 ADC DMA 传输失败案例分享
实战经验 | MC SDK V6.x软件HSO功能ADC采样设计说明
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | STM32 ADC过采样话题
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版