|
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 板载运算放大器0 {& Y6 T8 ]: |2 ?6 b# z 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。 2 E5 W e- n7 @2 U5 ~$ l+ e
- A5 d# h5 E+ J3 Z
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。6 Y- P7 }" Z! U* q6 ]& g 2 A) w7 T# c/ q6 ` ADC配置9 ?9 \. A8 @. O2 P) i0 j$ @. x j
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。4 E2 y/ g0 w' D5 }# s% m/ ^ 2 R# e$ [4 `& j S; O. f0 j
9 G L. S# M4 G3 O' i8 v 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。; c) o t; k. @# q 9 }- w$ Q9 ?4 e3 Q( ^5 {% b
; R) g/ d4 g W4 Q: N8 V 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。 u8 Y) p- I0 v- ] 定时器配置3 S. V% M; P- f! l: t' {4 b. p [/ W 这里解释一下Timer 8 Trigger Out event.+ x. G9 P/ j3 v7 a5 f% O- d4 g9 U 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。. f) B' J2 O, s: g9 K 9 w+ U; l7 V- i. r: _2 {" r0 R, Q 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:2 n/ l5 a" `6 X" P" w 更新事件(Update Event): b2 s8 \1 ?9 o: p 当定时器的计数器溢出或达到设定的周期值时产生的事件。 捕获/比较事件(Capture/Compare Event)9 J f. I8 Y: R7 I; J8 Q# V 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。0 L" f! K; C4 ~. K# _ 输出比较事件(Output Compare Event)% j F+ A. p+ L. @ X 当定时器的输出比较单元产生一个输出信号时的事件。
& q) n" b9 U( M" U 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。. U1 N% p2 W' w+ M 7 c% L9 @" @& X" R4 `6 g; T/ R# g 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
$ V) p! n3 d/ x: t/ K. T/ d+ Z 最后别忘记开启相对应中断源的中断。 2 | ], n; o: z: N6 s0 P 接着就是创建工程。
定义一个数组用以充当DMA的缓存区。4 a0 o8 z u0 @' Q# J% g" P
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。5 k8 e& @( ^6 ]4 p3 s& X' k " t* t$ R; D) A5 I9 e) Q 我们使用HAL_DMA_GetState函数来获取状态。
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于& j; T: p5 x5 j HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。 6 g. o; F/ D* r
这是我们采集的方波信号。! y. S; M1 G, e , |! V8 R. A9 W * g7 F/ x5 r# d+ _- h( E% X 转载自:电路小白# l' e( M( _6 T6 u8 v 如有侵权请联系删除 |
经验分享 | 通过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中文论坛
微信公众号
手机版