|
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。5 ~. d3 {+ r# V4 S9 n O / `2 q% W7 [' O7 q0 j 板载运算放大器# A; u/ d8 T$ z' `( H S 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。2 A3 z8 i( g |, l% `
5 e9 i7 A. n9 _( @, ?% i
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。 4 O6 b* d }7 U4 { ADC配置' ~' h; ?" o0 g% [ 6 \7 Z# X* r. x5 j) p9 [& y' r$ c
) F$ R+ R \5 p" a: D x: j- k 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。' f9 A& B! `' Q9 s + e& e; B6 c2 A
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。 - ]! L2 ^+ G5 S# {2 P- \- Q' s" _' s
触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。 定时器配置 这里解释一下Timer 8 Trigger Out event. }' k; j4 s. ?' @* C+ a" j+ i 0 A$ l! b5 D/ m' c" E/ z0 v N; m% j 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。 " F# V/ s& k" {' s2 L. O$ H( \1 F 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:2 @6 `. T8 A4 l 更新事件(Update Event): Q& S$ A- I4 v, v. N' R0 w4 X 当定时器的计数器溢出或达到设定的周期值时产生的事件。5 s( c: F2 k9 ?$ S 捕获/比较事件(Capture/Compare Event) 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。 输出比较事件(Output Compare Event)* p$ R8 l9 g" b0 C* |2 b 当定时器的输出比较单元产生一个输出信号时的事件。
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。% W" U- I: ~0 g& O) ` 8 i5 {8 H: ~+ a+ \7 c! X 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。. T3 q9 X3 l! C7 N& J
最后别忘记开启相对应中断源的中断。6 `4 X1 |/ z. H2 j8 b: o2 B 6 n5 t2 v' d7 ^* _ 接着就是创建工程。3 O9 i. _3 e ^; D, X
; r8 [6 J& a* _ \7 k0 N 定义一个数组用以充当DMA的缓存区。& [" s R4 f, H; j" f
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。 % r! R) P& N8 E$ y# q 我们使用HAL_DMA_GetState函数来获取状态。
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。" ^! b1 s6 E2 l9 n
+ H( D* K9 N+ l4 ^( [4 B 这是我们采集的方波信号 ! ^7 |" |# a$ G; B+ i; ]+ H 转载自:电路小白 如有侵权请联系删除 ) e- d' R7 j3 L+ M" e4 w 1 x3 i) x0 a$ `/ n/ _0 o/ p & K9 V" ?% D- E |
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
STM32H563 ADC+TIM+DMA应用演示
SPI 32位宽DMA方式收发失败问题
多通道DMA传输为何有一路异常?
经验分享 | STM32N6 ADC DMA 传输失败案例分享
经验分享 | DMA发送函数只能第一次调用有效?
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
【开发经验】LAT1500 如何通过DMA配合CRC功能
实战经验 | MC SDK V6.x软件HSO功能ADC采样设计说明
我心中的ST中文论坛
微信公众号
手机版