
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 板载运算放大器 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。 ![]() 7 |2 w, S/ x6 s& F : @5 F9 t% p+ K1 ^ M0 I/ f9 ^ ![]() ^9 B/ t5 A! J4 W6 `3 E* N3 ^0 b 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。 + _( r1 H% `0 ^) P ADC配置 ![]() 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。 ![]() 8 Z& P3 g/ J/ R( H0 ` 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。7 c. l! Y: f- p& k ![]() / e! w; D' a& H+ P0 _6 u4 ` 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。, \! t) B3 a3 t - r/ O! v6 g4 m; _# t& a 定时器配置 这里解释一下Timer 8 Trigger Out event. $ j8 e. N0 v+ w6 C- ?& R3 [3 T" L 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。 # L! n8 A) d6 f" |9 n' q 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event)" f" B& o p7 X2 ? @2 Z 当定时器的计数器溢出或达到设定的周期值时产生的事件。6 A$ m5 Y9 J' ~1 ] 捕获/比较事件(Capture/Compare Event) 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。 输出比较事件(Output Compare Event) 当定时器的输出比较单元产生一个输出信号时的事件。* ?/ u/ w0 Q1 i7 q6 e & A1 \# D q8 }- S) R: s a & b( B8 m I8 u% J8 b ![]() 5 G5 Q* y& D( l 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。7 W/ w" f4 f. ^' m- x2 R 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。* H4 w4 o" g0 X: T. A, n5 b ![]() 最后别忘记开启相对应中断源的中断。- j+ ^& k1 l. ? 接着就是创建工程。' \6 \3 O4 W" M) l) K6 R" l 1 s2 }9 [3 y: V
- @; _; ^! j6 k6 z4 K$ w 定义一个数组用以充当DMA的缓存区。
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。 N; }2 [0 O6 I/ t$ R4 A 我们使用HAL_DMA_GetState函数来获取状态。
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。" i" e; d6 C S4 k( V: h 9 T" T7 s: E, ` ![]() ! x0 z |7 u* P 这是我们采集的方波信号7 g+ N. A, X& u' V! A$ s }* y & |; y: J8 G; ]& J. Q9 R. x5 b 7 h2 k5 N' I; o# U5 x 转载自:电路小白+ K( v. k, X( {- w. s9 ~ 如有侵权请联系删除$ t# y5 m$ A3 L! _ & D; V; R) S3 y4 s8 z |
【STM32U3评测】SPIDMA发送
实战经验 | TrustZone应用中串口通信的DMA传输失败问题
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
基于STM32使用ADC的多通道采样经验分享
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享