
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 / n: B2 ~9 H- ]8 B4 V+ ^: T 板载运算放大器 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。/ V" p' w z; x3 q2 @6 c - O+ {8 g7 N% v8 a! b# u. F ![]() ![]() 6 p2 e2 v& w* z9 W& C 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。& U; ~( v1 j$ _5 s- f8 N K1 z1 B* z8 S; F8 \ ADC配置 ![]() ! S0 X7 {/ x. \: R$ E4 d* j e! [1 S 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。 ( v# R1 I/ L r6 w2 T+ t+ G2 j ![]() 8 P( o1 ~; o% N$ o7 v: H 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。! v0 C6 @, O5 ~0 o7 x7 A ; T# v! A9 A/ B- u3 d4 ]: r; F ![]() 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。, z, o: b' l& s! J 定时器配置 这里解释一下Timer 8 Trigger Out event.* A* s [& i& @6 ?+ T+ P ) W h* L4 X' S1 A0 y+ b 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。3 ~! h) L5 p2 H$ \6 J) z 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event) n7 e" o& l/ ~6 M+ Q 当定时器的计数器溢出或达到设定的周期值时产生的事件。 捕获/比较事件(Capture/Compare Event)6 C/ L; n8 P) e" Q7 h( Q9 ` 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。$ Y' y9 _- E/ d5 w# J$ E2 \ 输出比较事件(Output Compare Event) 当定时器的输出比较单元产生一个输出信号时的事件。 ![]() 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。 8 E( ], H3 V4 [. G+ F- R 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。2 s, b# D+ T% R' h5 ?- n! p ![]() 5 G# q7 j. e6 J, u) d 最后别忘记开启相对应中断源的中断。 接着就是创建工程。
定义一个数组用以充当DMA的缓存区。: c( d$ u2 q1 ^9 S, V3 r! E
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。 & t0 Q( l; o" k 我们使用HAL_DMA_GetState函数来获取状态。' F! L% T1 _5 e7 L% _4 P
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于 HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。9 w1 V$ n2 H3 P. L" G0 O. }( W $ B5 n0 Z) L8 A$ ~ r: G5 Y ![]() * f% o7 r; U2 \+ f `. O8 y9 L0 p 这是我们采集的方波信号。6 a1 ]. M% Q) o/ }" r, Q' R Y; U 1 D% V3 j/ @/ D' A" W. U; b 转载自:电路小白1 L5 Z& i- m) w0 ?1 L- T9 G 如有侵权请联系删除1 J9 T; b5 e3 f( N W* j1 i6 D ; \5 B y1 T1 h& d9 `% S |
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
基于STM32使用ADC的多通道采样经验分享
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享