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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。% ~, {- v4 V6 K# \! a

, w$ u' v5 u  {# |5 r& G板载运算放大器
. f: ~# o/ ^) V+ b! h- o7 m板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。/ w  p9 P; u  ~& K, Y
8 n4 k8 F: Y: [! _. `5 [( H- o0 k
微信图片_20240615133357.png , F# H; ?+ a# i3 x
8 W4 c/ D$ i5 e* M
微信图片_20240615133353.png
# d% M8 ^1 e4 x& J7 l( y- i- x* [1 ]5 s- I2 _7 x+ d
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。' _8 Y, m' ^. _4 C7 K) w
( R5 d7 D) ]4 ^& |: ~
ADC配置

6 v* o, q2 }; {8 ~
! L/ ]& _) J0 { 微信图片_20240615133349.png
% u9 [7 v- [8 J& s5 @9 G/ V  R/ q2 b" Q" U: g) J
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。) |, x3 _) n4 d" ^9 v& t

7 @: @- t# k" M( l# s7 d; @6 ~9 r7 } 微信图片_20240615133346.png 7 X, K' [; Q# R: |6 L, I
( Y% F, T$ k  C- x, P. b/ F+ }
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
0 Q$ U% D) a. e0 N% p" s  q
! b: r: Y3 h" J  @2 a2 W 微信图片_20240615133343.png ' i' N1 p! ~7 x3 _! F1 S

0 {( M3 k! y7 U0 p# v3 Q触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。
1 G* i% N1 N* z1 S0 S7 M+ \7 }" r9 L
定时器配置

/ z! O7 u# d6 R这里解释一下Timer 8 Trigger Out event." q* r% T; Z8 F

- Z9 V+ {2 U7 R' H定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
; s& f% X- I; d9 S. ]7 P9 m
; z* p# r! {. c4 v) `6 O
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
8 z0 e) d6 d, _5 y% ]
更新事件(Update Event)
7 N2 U, z- P6 j: K' ~0 `当定时器的计数器溢出或达到设定的周期值时产生的事件。3 p: T5 o/ H) u& f% o( j& l
捕获/比较事件(Capture/Compare Event)- o1 L2 v/ Z9 m- s9 B' \4 ~6 ^
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
& p2 |! I9 F/ K输出比较事件(Output Compare Event)1 L' t% x& Q: \( a! j5 Y3 B: W
当定时器的输出比较单元产生一个输出信号时的事件。
: b7 t- }% Y3 q( F* V
; o4 f; `! Y6 d' g. w. _) x0 m7 u 微信图片_20240615133339.png
5 D' |1 }+ l' q; \; o# e& v& |3 J  ~3 `
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。" Y$ J0 x: C) u  \

9 ?4 Y, u. {6 c2 v. R6 R我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

7 ]  h$ q& \6 i+ l, A
# `4 D- t. P0 Y- G8 l, `# ]! y, q 微信图片_20240615133333.png   m  j* i  R& A) ]

. e; D1 E5 W6 W0 J3 C/ `* {* L最后别忘记开启相对应中断源的中断。% e. k5 F6 y1 H' Z* _1 L" l1 e5 T
9 o- b) t, T" s$ H1 `0 N
接着就是创建工程。
: T# `1 |) P( P) r4 x
  1. #define ADC_Lenth 1024" U$ J/ I0 A7 U, t* v
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
' W' g8 x1 p' t' O, V. N, M
定义一个数组用以充当DMA的缓存区。4 v2 z$ O- u+ O; y9 y; _
  1. while (1)
    ; n0 y' J) U, m* V
  2.   {6 M9 R# I) A! E. s
  3.     /* USER CODE END WHILE *// `" c1 d3 z+ O$ I+ j( g

  4. * e0 B' L, B" ~9 b
  5.     /* USER CODE BEGIN 3 */8 H9 v  Q/ z- H$ k6 v
  6.     // 检查DMA传输是否完成
    6 h0 @: Y( ]& H$ J8 v
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)! g; D8 Z. B+ S
  8.     {
    ! ~- P0 q1 p3 y0 T7 j+ ~
  9.         // 处理 ADC 数据# ]* r7 f( I# s) x0 |/ w# r3 P" m
  10.         for (int i = 0; i < ADC_Lenth; i++)/ S2 Z% e- g1 d' j' W0 m
  11.         {  L( t, s. E  Z  [2 T2 Q8 a) {; @/ `4 X
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);
    - z" w. t4 [* }8 P
  13.         }
    3 }& D9 j5 ^( e5 i6 p% _+ y4 J$ }

  14. ' j3 E; @  l5 V6 u; n# l% V- Z
  15. 5 `3 t. L6 q* v
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);0 s# c" ^2 z0 M$ B. r

  17. . }  a7 v: c6 s3 m' w/ R) X
  18.     }( L" Z, f; ~: I/ [: [  R
  19.   }
复制代码
7 E- e. H) x* U" D5 L5 ]6 K) i
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
  o: P( f4 F7 Y1 V' n% w' w% T1 S0 `; A3 p$ x
我们使用HAL_DMA_GetState函数来获取状态。3 l( \4 ~( G% \) n: ~* [# M3 H2 l
  1. - HAL_DMA_STATE_RESET:复位状态
    6 n, H) m; n! {3 u4 B
  2. - HAL_DMA_STATE_READY:就绪状态) ~0 V( _7 c; p4 d3 A
  3. - HAL_DMA_STATE_BUSY:忙碌状态. `: i: u6 H  m
  4. - HAL_DMA_STATE_TIMEOUT:超时状态6 y$ s* z/ x* C( Y# C
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

/ ~8 x* R, d4 k! E当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于6 ^7 g7 c  [0 {) |7 K
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
1 g: I* [/ @% Y# E1 {+ O" \
( R+ F% e) [* m1 `4 J0 g$ y
微信图片_20240615133330.png
& {* P6 |; t- L+ z: o9 Q1 S
6 c! T2 H3 Z+ x) p2 ^( V8 J; `5 }这是我们采集的方波信号。
: P5 Y& P. ]1 [
" ~6 Z- f$ w% V4 O5 f- u, N
! r. P8 B% i8 I$ C2 r- x3 E
转载自:电路小白
( i) ]) w) d3 ?; c7 h如有侵权请联系删除
' p- H! O- [) d1 S
0 B9 |3 z0 g( T" ~- _
1 b3 r8 G( }. l9 z: b3 ~/ a3 v
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版