![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。 . L$ G, A- S' q" Z$ [$ X 板载运算放大器1 R0 P# {( r* ] 板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。3 S7 P8 S! d. V1 ~1 b9 D Z! H ![]() : x, X# z6 K% B: q* H% D7 t6 T ![]() 我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。6 {0 l/ n# b! L7 q3 P% g ADC配置 ![]() 开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。; V7 |9 l4 p: T3 N; P# ]* |2 S 7 K( f: n9 x2 r9 {7 r/ J ![]() 添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。 % f& k$ X+ I4 ?. w ![]() 触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。# {2 @* ~4 Y( q( Q* X% S* G / P7 \* b, f. l, I: T 定时器配置7 s, d4 j9 S6 W- Z; q 这里解释一下Timer 8 Trigger Out event.% d/ ^# W2 a1 R0 t$ U & F, t$ \8 R, }- w6 G# s 定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。' y3 _3 q& P3 k: W8 I& O8 b 在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括: 更新事件(Update Event) 当定时器的计数器溢出或达到设定的周期值时产生的事件。 捕获/比较事件(Capture/Compare Event)- v" d2 h: n* X2 G R) \) s7 @ 当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。 a' M S1 }7 F 输出比较事件(Output Compare Event) 当定时器的输出比较单元产生一个输出信号时的事件。, j) T' F& @4 F- F; t ![]() % X0 ~' a) B* J# C0 M2 n" E 这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。 我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。* _) z2 w$ {+ Q4 E4 ?7 j8 G 4 P1 a( q8 N, a" N ![]() $ i" a0 m) g2 X; |" C9 g 最后别忘记开启相对应中断源的中断。 接着就是创建工程。
定义一个数组用以充当DMA的缓存区。# y. M# i3 u' u! ?, w4 i
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。/ q# D& f# C; T ( m- z; {' r- t2 S 我们使用HAL_DMA_GetState函数来获取状态。5 H& f, `! v, L( L$ Q2 E' Q! z
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于9 t$ M) E( k! Q HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。5 w ]+ {9 b4 ~, t" N ! Y8 R, E. ^$ h2 L1 d/ O9 v' t* K ![]() 这是我们采集的方波信号。0 N" V' |4 J* p( L, v# C5 ? + c1 B2 b: H2 ]9 n% k2 f, c( E# t. H 转载自:电路小白 如有侵权请联系删除 : L- b- U- L4 z! P0 D2 T* q4 e |
基于STM32的DMA经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享
基于STM32F407的DMA采样+FFT时域经验分享
基于STM32利用ADC+DMA采样显示经验分享
基于STM32使用ADC的多通道采样经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32U5系列TIMER+DMA+DAC应用经验分享
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形