之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 1 S* E7 m( m. @# P/ m$ B 板载运算放大器 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。 ; Z% }0 ]) l; U i- l$ ], { 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。( X# i% L; Q6 O! b" I7 @, @8 v * i- U F8 J5 @# V4 ]/ H ADC配置 5 V. H' t5 ~. s7 g 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。 : J0 A$ }8 R6 Z1 ] 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。3 d* @" Q* {* M 4 s" b, F9 E, A( d " f5 ^! H4 P9 G' t7 I+ p$ j3 Y 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。% p Q; z7 E) @% U& N2 {& t# p, b 定时器配置8 c5 C7 S9 F/ z& R ]$ n3 P* n 这里解释一下Timer 8 Trigger Out event. $ M4 ~* y7 Z D& a8 Q4 t 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。% }; D0 a/ Y, t8 y+ P $ s0 F' [4 R4 B2 l$ b 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event) 当定时器的计数器溢出或达到设定的周期值时产生的事件。, L, x: v; U$ R0 g 捕获/比较事件(Capture/Compare Event)0 D I% P% O3 D5 K6 z 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。: i/ _1 F/ M z' s2 [/ X N 输出比较事件(Output Compare Event) 当定时器的输出比较单元产生一个输出信号时的事件。5 i' N/ I' M5 M7 h+ e- ~ m 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。 ' a4 z+ ]& ?' B! T9 A" t9 u4 Y( q 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。 1 O" V" L% W2 P2 h- _0 q; X 6 i$ l, E% B3 A1 d8 y4 A3 G 最后别忘记开启相对应中断源的中断。. s2 _+ Q* G7 l7 z! K; } 3 e4 H# v0 D+ O+ i! w4 y) s 接着就是创建工程。" v+ I0 y8 e7 X I7 g
定义一个数组用以充当DMA的缓存区。3 Z1 P$ b3 W t8 ?' P% D! V/ a
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。$ [; j, B0 G/ } g; m3 U) d" r3 s5 b 我们使用HAL_DMA_GetState函数来获取状态。
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。! p( F) [* v( Q0 p) {. P ; x) n( a% S1 O: Y* z 这是我们采集的方波信号 + O2 `) y0 P r4 Z" b 转载自:电路小白' j* v0 C$ _ d; E! K( _' Z+ z 如有侵权请联系删除 ( G1 q/ ~ ~ }6 b- ?: {* v, Y ; `, U# \( ~2 e/ R7 \ |
STM32的DMA双缓冲模式详解
基于STM32使用ADC的多通道采样经验分享
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享
基于STM32F407的DMA采样+FFT时域经验分享