![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。3 f; O% ]4 \- |% v6 O 板载运算放大器. C6 g: B; A L: Q 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。! K6 l# F% ^, I: J% U2 L* n 8 |! {- N, L2 Z8 ^ ![]() 7 o5 x7 A. {! u8 j2 R1 i 6 I: A' n, ?7 ~) |+ I! g v ![]() 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。 / c b7 E8 V" _, w' b Z ADC配置 ![]() e4 G/ y7 U! S 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。 y4 Y* q7 Y/ r; E% A7 M ![]() I6 \9 R* i6 b) R/ j, c 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。+ \ ~: [& v9 j- w% R0 X & p- {0 b" ?+ d* K5 g9 Y& F ![]() 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。9 x& B5 B# z+ N8 L+ D: ` 定时器配置 这里解释一下Timer 8 Trigger Out event.9 @8 i# a5 r2 j( C3 ] 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。% i8 f; q) J3 k$ [3 @5 \3 ` 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event)# t3 H* J2 f! x* b! H' z 当定时器的计数器溢出或达到设定的周期值时产生的事件。 捕获/比较事件(Capture/Compare Event) 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。 输出比较事件(Output Compare Event)/ V8 D" K& X: }6 F+ i Z 当定时器的输出比较单元产生一个输出信号时的事件。 3 }& k' X' `0 F$ x: f" \ 4 y! Q: l; \2 E' E. w3 b ![]() 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。 5 t5 ^9 `, r9 N" O4 r7 Z+ H 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。5 I E1 c: y% w! y* S$ H, ~& ~ ! [1 W: N4 [6 x( l+ m9 A ![]() 4 h! v( @# _$ J5 i1 N0 s' A 最后别忘记开启相对应中断源的中断。6 E' W. F, e/ @6 b: E 接着就是创建工程。 % [$ i, A4 V$ y- a( Q2 @
定义一个数组用以充当DMA的缓存区。6 k Y/ B, s, V, F) n8 ]
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。 我们使用HAL_DMA_GetState函数来获取状态。
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。/ p o7 `* r* [! x9 y8 ] ' T3 E$ h! z# o( v% U2 d ![]() 这是我们采集的方波信号1 P3 j" s4 d% Z0 l" ^! s , I0 O$ T7 e! o 转载自:电路小白 如有侵权请联系删除0 v* T8 B/ N, J+ ? 6 V& a, v! `; P6 ?$ Y |
基于STM32的DMA经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享
基于STM32F407的DMA采样+FFT时域经验分享
基于STM32利用ADC+DMA采样显示经验分享
基于STM32使用ADC的多通道采样经验分享
基于STM32U5系列TIMER+DMA+DAC应用经验分享
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形