|
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。7 [. {7 L2 X6 t, w) c7 y# J7 _3 O: u ) V2 z0 M3 s% \2 e! J9 B 板载运算放大器0 ^! S6 d3 l9 q6 c( \, i1 I# j ?) N 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。 ! _( t: g& a2 c2 P9 @
8 I8 z, q A0 n5 m
" t2 t4 C$ w2 x) {& _ 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。/ a: n& e2 z! O3 K7 s4 b @ ADC配置% e( Y# x# O U
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。7 ~# `3 n. g+ U, [ i _/ o$ K( E % S* j; ^; g. N% d
) W' n) V% i7 }% R0 y7 ] 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。 ; m [4 d! L# n" W5 z: Z0 {$ { 定时器配置: j1 `3 r- m4 Z+ ?1 P 这里解释一下Timer 8 Trigger Out event.4 v0 X" g" e& t1 l7 C 3 t9 X6 ] f0 c7 X0 u/ f 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。 G+ g- M% O3 J* S$ ~ 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event) 当定时器的计数器溢出或达到设定的周期值时产生的事件。. d7 E9 R S0 Q- F! A. a. `2 j 捕获/比较事件(Capture/Compare Event) 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。 输出比较事件(Output Compare Event)3 t2 F8 n2 o* ^" O. s 当定时器的输出比较单元产生一个输出信号时的事件。! }# c1 V& H# m 9 z( n, R: F4 j3 k1 X4 P9 C
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。; X/ `3 w# L, G4 M, i. H' w 7 Z) c3 Q: H5 [ c/ b6 F* s( r+ x3 T 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。, ~1 O/ P5 ]) f) ~
, p. w5 _8 a% ?' O 最后别忘记开启相对应中断源的中断。 & X# R) @- l" m; m- a$ Z 接着就是创建工程。% P2 ~; \6 f9 {9 }
定义一个数组用以充当DMA的缓存区。
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。- j8 K/ M9 ^& d3 B( H- u, b* \ 6 Q" O0 c; ^* Y) `& D& x' Y8 a 我们使用HAL_DMA_GetState函数来获取状态。1 I3 K7 p. ?) P Z/ K
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于9 d" ~. {% E9 t" R HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
这是我们采集的方波信号。+ ^* L; Q0 N; t5 Z: a - _' ?6 ^2 W" C' _ . W* O9 P0 M; ^# M( c C0 Y" d) [ ^ 转载自:电路小白 如有侵权请联系删除; ]4 o7 l# H* B5 i 8 y/ v2 r+ r. n8 {- b 3 _1 j, l4 `$ H |
【STM32H5 评测】ADC 电压表
经验分享 | 通过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采样设计说明
微信公众号
手机版