STMCU小助手
发布时间:2022-12-8 16:00
|
前言 有的项目中需要对多个通道的电压进行一定频率的AD采样。6 M# ^/ j! ?/ p O8 c$ z% S7 S 第一种:是使用定时器去读取,通过检查转换完成标志位来读取,但这样就会加重整个系统的负担,占用CPU资源。 第二种:是采用定时器触发多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存,通过DMA中断来获取数据。比如我们这次项目中就要1kHz的速度读取DMA,并通过DMA传输。 这样做有以下几个好处:, i/ b/ G6 ~" _/ x4 V) a 1、由定时器触发ADC采样,这样采样的频率可控,且定时器触发不会占用任何CPU资源;6 M' ]. a {- x, M 2、DMA进一步降低了任务对CPU的占有率。 1、硬件原理3 `' ^. \* G9 r/ Y) c; y2 Q& I9 u 1.1定时器1 K0 a9 i% I% T 该项目中,我们选择TIM2的TRGO为触发源来触发ADC的转换。 即使用该函数: $ [0 Z8 y# S$ d5 K下图为ADC转换的触发条件: . e. z+ v; U; Q2 p" w9 s1.2 ADC6 Y5 K, h( V: C* Y5 e b' [ STM32F407的ADC的有规则通道和注入通道,规则通道扫描采样,配置好规则通道后,定时器更新后 触发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! l1.3 DMA传输 STM32F407有DMA1 和DMA2两个控制器,下图为 DMA的请求映射。 ![]() ![]() 我们使用的ADC1,也就是DMA的数据流stream0 通道0,用ADC的转换完成标志触发DMA数据传输。0 b" @' b; x, V/ w' j 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个触发一次定时器中断(这里只是用于测试, 与触发ADC转换没有必然的联系)。8 t/ Q' N' }8 d! b, D . x' F" [, I1 [! }7 b' S" E |0 Z3 [9 e2 [ 0 S9 Z2 D; {% F% ^ r) O& s7 u y; I2.12 定时器中断函数9 P8 P0 ?- C; Q/ d" i 为了测试定时器是否正常中断,我们加了定时器中断函数,并通过IO口的电平翻转进行测试。$ ~- b( g+ T7 J. P, q7 w& s ![]() 通过逻辑分析仪可以看出,定时器按照设定的时间周期定时中断。( ?5 k( H9 A. [: u 可以看出方波的频率5Khz,则进入定时器的频率为10Khz,则1秒钟触发了10Khz次ADC转换。 ![]() 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 ![]() ( C7 s6 f4 Y* L' J; e 由上图可得,在30M的ADC时钟频率下,12位ADC的最大转换时间为16.40us,虽然我们采用的是21M时钟7 I5 B, g. u1 F* c' W 时间也不会多到哪里去,依然满足我们的采样要求。ADC初始化代码部分 ![]() 设置规则转换通道和单路转换时间 " @/ 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)中、 bank的大小而决定。$ 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部分 3 [, u3 f. |/ E$ Q3 ~" W3 H% O2.4 main函数部分 我们定时DMA传输数据的个数 len 为64个字节 1ADC通道是2个字节,则4个通道就是8个字节 64个字节需要8次DMA传输,则会触发DMA传输中断。数据存储的输出uint16_t ADC_Rx[100];//接收的数据,即原地址 即DMA传输来的数据会存在该数组中。 ![]() 下图为仿真数据,我们将通道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 ![]() 8 p# e5 A! m$ I 附加知识3 g C: y$ p8 a |: ~5 g) y ADC注射转换- W0 z/ L) i, _0 q* K7 K ADC注射转换最大可以插入四个通道。 & Y3 }5 h" ]% Z5 f/ m0 O 设置注入转换的通道数为1,通道号为14。4 T0 V" `+ ^( [& @# e I5 g 0 f+ b I1 O/ {3 SADC_AutoInjectedConvCmd(ADC1,ENABLE)该函数作用是在规则ADC转换完成后,自动执行插入ADC通道的转换。$ N8 h8 p) P- M `" D/ d 插入ADC通道的转换值位于ADC的JDR寄存器 ![]() 总结. U, S( }6 M f/ Q. \' ^8 k& s 以上流程就是使用STM32的ADC+DMA+timer实现自动定时采样模拟电压的配置使用流程,若读者发先任何疑问,妄指教。 作者:woai32lala, K/ w, C0 M4 ]6 i, M |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版