
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 板载运算放大器, M0 i! |# m8 s' J: b 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。$ x; e+ g$ S. O, F! Q ![]() * p# a2 T8 ?3 l7 b m2 L) o ![]() ^) R8 w- `" M 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。 " b1 Y" u9 f8 i2 @" v% I7 C ADC配置$ ?$ t0 O9 T- N1 Z+ z & P6 e3 T! C# a8 `1 H ![]() ! g- N% `3 h5 e/ N! f- ^( M% } S+ e3 K 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。; y( p9 ^7 k0 B* |& @ ![]() 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。 / ~4 L( V/ {7 T- h+ g- c9 w ![]() 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。/ z' U. b' n1 V3 ]' P% P4 p$ @ 6 k3 f# X9 `0 d' {" X9 j 定时器配置, t5 h5 S8 ?0 k0 D 这里解释一下Timer 8 Trigger Out event.% U0 e) P. H: m6 L1 K* ?- i4 W7 G0 p & e) I* [ [" ~! ]% Y. f 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。 + p; ?( T: P5 n, d& Y$ N 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event)0 Z' m7 \# |( }; Q5 }; k 当定时器的计数器溢出或达到设定的周期值时产生的事件。$ i" N" X3 M6 u# ]9 E 捕获/比较事件(Capture/Compare Event) 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。9 S5 G. |2 }5 w" w 输出比较事件(Output Compare Event) 当定时器的输出比较单元产生一个输出信号时的事件。; E) p5 v) ~' u4 S& z. j4 r * Y# p: V4 a' S( {* K ![]() 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。8 A4 Z/ I- N% C$ Q! d6 o 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。 ![]() 最后别忘记开启相对应中断源的中断。' Y- V1 r+ E2 T4 u- c % d3 |" Z& @3 | 接着就是创建工程。" U: |" ?% }% C0 I0 s7 M$ t , ^9 g! N# N8 x- y# C
定义一个数组用以充当DMA的缓存区。
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。 4 }/ ? v/ O9 V2 r 我们使用HAL_DMA_GetState函数来获取状态。
) u& [4 n+ R. e, Y6 @ \' x HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。 ![]() 9 w3 Y1 _7 S! p) s 这是我们采集的方波信号 7 o7 m4 _) v, R, v! O* b# f1 L 转载自:电路小白 如有侵权请联系删除. M5 Q, z7 t1 C0 A! S/ B / Z6 [" P- K5 n# e' d" g0 ] F) N9 P- u3 v8 y7 K* F1 j) @ + p9 _7 g) n% ~' Z3 M; f |
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
基于STM32使用ADC的多通道采样经验分享
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享