你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的ADC+DMA采样与板载运放跟随经验分享

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。& p, h9 _" g% E2 K- z  w

4 m, ~1 o, h# q6 Z& I$ W* U+ D板载运算放大器4 W2 n4 W4 x) {" g3 t0 J/ n" J
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
% }5 p# s! V( L$ }# F, V0 H
8 l/ j' K+ S( J
微信图片_20240615133357.png $ ^$ a: M1 o+ K

* k' B. @6 P1 z5 l 微信图片_20240615133353.png
6 n3 v- u6 Q5 }  w1 o
& l. A: N8 I2 l  k6 A) z& L我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。
5 C  g" J4 L$ H$ W
. J2 I3 C. t& v! ~- [9 tADC配置
3 w0 y, v! j) c) D3 g6 O7 q

7 I% m  I4 C" r6 \$ p 微信图片_20240615133349.png & _  x& R+ a9 F; U" A
& I5 R1 T3 `2 ?' }; ^
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。+ q( ]2 w2 Y6 }

, r( v! E) W3 A& x! p1 u3 m' s 微信图片_20240615133346.png ' U2 P& O" J$ O' u  x: n
; b& H# ]0 H6 f6 u( E' x
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
' ?/ C" O! y& Z. Q. ]; ^! K9 U
' Z. j) L5 o+ w: @) e8 X 微信图片_20240615133343.png 4 \; o/ R5 w) r. K7 k1 k

4 E/ V5 A' `7 l9 T触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。4 p. {( V1 y2 f4 A
) x! R8 X. |' ], G# ~3 v5 d# p
定时器配置

) {. c. D; _( L. h8 C这里解释一下Timer 8 Trigger Out event.* t# h* u% g  i- v# T

. V, @& ^8 t" O( _8 A" R) q. X定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
; l& a& k: {" t) L* g2 I
1 {9 v' T8 k3 n6 }# L
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
8 R8 k8 T; R/ U0 x
更新事件(Update Event)
6 q3 T, e1 g: `% Y当定时器的计数器溢出或达到设定的周期值时产生的事件。) B# n! v. O& M7 R6 C, J
捕获/比较事件(Capture/Compare Event)
& Y: ?2 U1 Y: q( v* g! u3 h当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。( C' L. |, `) f. g: ^5 Y
输出比较事件(Output Compare Event): p  o: \8 i9 I. [: w& Q8 Y+ `
当定时器的输出比较单元产生一个输出信号时的事件。% y0 e7 [; i/ z. Q4 z/ z
2 R' r" S2 V- d6 `0 U) T" B
微信图片_20240615133339.png 3 P" S6 [6 O- S; t

- g& P8 B3 A9 L: m' u这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
2 ^9 [' \7 A5 s7 t- r/ R+ x/ k
% O' y: s/ a2 R6 N我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

5 V5 r- t: \+ C& [
3 ^" @& M) C4 h 微信图片_20240615133333.png
% Q  V$ T5 G$ F! R+ f* H0 p+ {1 K+ R2 }
最后别忘记开启相对应中断源的中断。6 e% F7 W3 u7 _5 `0 `. n. U

$ v1 J: E- q0 v% G6 S1 o接着就是创建工程。
$ l2 |) [) Q9 Y; i8 H7 A
  1. #define ADC_Lenth 1024& l. ?2 \/ X7 `8 S
  2. int32_t ADC_Value[ADC_Lenth];
复制代码

' f+ m4 d8 Q4 a; `, R# t定义一个数组用以充当DMA的缓存区。
8 h& B! p* C0 V9 ~4 u: e" L
  1. while (1)
    9 d3 j% s, O* T6 @% x# z" a5 A4 ^' G
  2.   {
    8 D# X# Z- J8 o: S' |: r
  3.     /* USER CODE END WHILE */
    % R* l- K' W0 m( L% R

  4. - I& `. c4 X0 ]8 d9 I4 F  o, n
  5.     /* USER CODE BEGIN 3 */; ^: ^' ~4 w3 s# J1 H. Q7 T
  6.     // 检查DMA传输是否完成; l( q' k8 E; _5 S0 {8 R
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)5 x/ R# |6 C% x& h- Q! C; P" S# _# W1 Q9 o
  8.     {
    8 d/ `2 L6 k+ K) E% F% ?6 k8 P
  9.         // 处理 ADC 数据+ [% p9 A4 o) b) q7 O( b! V
  10.         for (int i = 0; i < ADC_Lenth; i++)
    3 ?" Q" X- p' w7 B$ J& M
  11.         {. V4 r* T$ T  @/ C+ g
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);
    7 d3 ~6 ?# h5 c/ \' s
  13.         }
    ) K; J# l3 K: y+ X; Y1 c# M

  14. " h# H$ R" E2 W1 N7 y7 a. S

  15. 8 F" l( O' n; `. Q6 s% x; N
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);4 ~/ y. e' a  z' h$ A2 e1 j
  17. # W7 c+ O; S* h" S8 U3 q
  18.     }- g2 N  ?0 U/ f: M- a$ J: Q
  19.   }
复制代码
3 f( J  t6 f' V# U2 P
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
, g+ w# J" B) j( O% F  L6 o* T% X
我们使用HAL_DMA_GetState函数来获取状态。
* ?3 I" r7 Z0 Q' l5 Z+ H8 s% c
  1. - HAL_DMA_STATE_RESET:复位状态
    ) T/ R& x8 T+ f& ]; \
  2. - HAL_DMA_STATE_READY:就绪状态
    9 m$ k6 ]/ w1 I3 k0 h
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    : F2 w, a! O* ?, _6 `  B9 z1 f
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    ; o9 r/ ^9 s2 d9 a* q: X0 G/ l! X
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

+ Q/ M" {4 ]! @  S- W当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
# h0 Z3 \* D' w) ~1 p% ]1 QHAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
/ ]) }" r8 o* c- ?8 q9 G: h) Z  O+ d4 `3 D6 l  q$ m
微信图片_20240615133330.png / t7 e; H- a9 ^% \8 P
" q7 D* C  }: t/ z# a9 @9 |
这是我们采集的方波信号。
3 ]/ R& a$ J5 D. W

# k" O- c1 U& K

( u, \0 U2 m% n# y; Z5 D! u) F( `! B转载自:电路小白; T) ?. ^; _7 V# D7 `2 a$ U% L
如有侵权请联系删除/ F  Y7 [7 K* m
* O' Y$ N! H# d+ Z* e

0 x5 x1 Y$ N% ]. `4 G
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版