之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 板载运算放大器 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。3 G7 l; J( P0 O# q- |( L - g0 ]) A3 a* o% X; r 0 U5 f, S" X" m, _/ a 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。 ADC配置7 ~) t' K/ ?5 _3 u- E- z . q. A/ ~# C3 z% a5 N 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。 0 i) ]" I% P/ {2 _/ ]8 E) a 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。+ N% }* j, i# R" u 2 K, f4 y' k. R3 d, Q 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。 " f$ R* C# U3 h4 y5 F' K 定时器配置6 P+ B2 U7 |7 U# e 这里解释一下Timer 8 Trigger Out event.4 |' g: [ _5 P2 ~3 L7 b 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。 ) ?: i0 W' m, Q6 k, ?# Z" x$ a 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event)) N$ s: E5 h* F+ A) o9 J 当定时器的计数器溢出或达到设定的周期值时产生的事件。( m1 z9 o/ Q2 c' H* w$ d* I; { 捕获/比较事件(Capture/Compare Event) 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。 D: ~6 Q3 o; A( _0 C# o4 b 输出比较事件(Output Compare Event)8 ? x j( p1 C2 W2 o: y( M& k! |; p& V 当定时器的输出比较单元产生一个输出信号时的事件。/ R! X( F- s+ o, W& m- f: D2 L( O 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。 % J. S5 g0 D- L h& V6 M- L" ?( B; K) ~! l 最后别忘记开启相对应中断源的中断。2 w/ ~; l" s( v y- U 7 d; @) f2 T) H% |, j) i7 z. ^4 K8 ^ 接着就是创建工程。
' s4 i3 y8 g7 j: B* L. m* E% n3 M 定义一个数组用以充当DMA的缓存区。
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。) W7 A% ?2 |) f8 |6 d& i " |) u) L- y0 l0 |6 u) w5 B2 j* ~ 我们使用HAL_DMA_GetState函数来获取状态。
' o, f, C$ T8 Z% S0 k HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。 ( M* d U7 z$ s# U( \; Q 这是我们采集的方波信号 3 p m9 \. ~: p) D" H' Q* a6 ^ 转载自:电路小白& U5 P! w5 C6 F6 t, Z( Q& q0 ^! A 如有侵权请联系删除+ T/ W, e0 s3 h" B) U! O) E( H, r |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
基于STM32使用ADC的多通道采样经验分享
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享