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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
3 m* u+ f6 C/ P: v  y
/ g; E* J9 K; ?" t: [1 b板载运算放大器0 {& Y6 T8 ]: |2 ?6 b# z
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
2 O% V' G" t0 l% D: W7 u- m1 I  }2 E5 W  e- n7 @2 U5 ~$ l+ e
微信图片_20240615133357.png
. R5 G4 |. M6 Q  ]7 b$ J+ p2 `- A5 d# h5 E+ J3 Z
微信图片_20240615133353.png
; {* \) q1 }( p" s( g5 h9 |
; C& g  V' P' L: E. W我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。6 Y- P7 }" Z! U* q6 ]& g
2 A) w7 T# c/ q6 `
ADC配置
9 ?9 \. A8 @. O2 P) i0 j$ @. x  j

/ p) ?/ |! I# l7 [& m9 J 微信图片_20240615133349.png
3 D0 i0 m2 d! m; F
" _( I4 s, Z  G% f7 V& m, X8 X& r开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。4 E2 y/ g0 w' D5 }# s% m/ ^
2 R# e$ [4 `& j  S; O. f0 j
微信图片_20240615133346.png
4 m3 f! P3 y* M8 r9 a9 G  L. S# M4 G3 O' i8 v
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。; c) o  t; k. @# q
9 }- w$ Q9 ?4 e3 Q( ^5 {% b
微信图片_20240615133343.png % a  e  i/ b$ D, C
; R) g/ d4 g  W4 Q: N8 V
触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。  u8 Y) p- I0 v- ]

, o6 G9 E0 q" ?3 Q+ f定时器配置
3 S. V% M; P- f! l: t' {4 b. p  [/ W
这里解释一下Timer 8 Trigger Out event.+ x. G9 P/ j3 v7 a5 f% O- d4 g9 U

% k" q7 ^/ a0 e定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
. f) B' J2 O, s: g9 K
9 w+ U; l7 V- i. r: _2 {" r0 R, Q
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
2 n/ l5 a" `6 X" P" w
更新事件(Update Event): b2 s8 \1 ?9 o: p
当定时器的计数器溢出或达到设定的周期值时产生的事件。
& u' z7 k  ~5 e1 ^/ _: g$ S6 f捕获/比较事件(Capture/Compare Event)9 J  f. I8 Y: R7 I; J8 Q# V
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。0 L" f! K; C4 ~. K# _
输出比较事件(Output Compare Event)% j  F+ A. p+ L. @  X
当定时器的输出比较单元产生一个输出信号时的事件。
7 a$ _. W8 t" L4 N) ]
  P* X4 K7 D7 Q5 y. l/ [ 微信图片_20240615133339.png 6 W. f7 m* o* H( U  c9 L
& q) n" b9 U( M" U
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。. U1 N% p2 W' w+ M
7 c% L9 @" @& X" R4 `6 g; T/ R# g
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

* V5 ]$ L. D8 T" B
$ f& |6 B& W; O, ]) B3 P) M 微信图片_20240615133333.png * C% n8 C( K/ U7 x
$ V) p! n3 d/ x: t/ K. T/ d+ Z
最后别忘记开启相对应中断源的中断。
% i, f. b& Z4 ~  p) V2 |  ], n; o: z: N6 s0 P
接着就是创建工程。

# }1 c* C' k4 ?4 n9 W1 t
  1. #define ADC_Lenth 1024' W0 m' ~' j9 D# m6 ]% G5 F
  2. int32_t ADC_Value[ADC_Lenth];
复制代码

& c% W4 z- U8 P; F$ u定义一个数组用以充当DMA的缓存区。4 a0 o8 z  u0 @' Q# J% g" P
  1. while (1)
    , b) g+ p8 b/ l
  2.   {4 s0 G" ]0 X* j) J- r- x% ^" V
  3.     /* USER CODE END WHILE */
    2 z( p; @# J8 c- S# ~# _! C
  4. ) r2 G- [# l; G8 v
  5.     /* USER CODE BEGIN 3 */( ^0 e5 e0 D: f
  6.     // 检查DMA传输是否完成. t' P7 \' d- _
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)0 O, ]$ s' ?  g! d' }, B6 Z6 }. ^$ |
  8.     {' [, [% Q+ A  F$ s
  9.         // 处理 ADC 数据0 d' Y7 y2 i1 A2 _( j, o4 k
  10.         for (int i = 0; i < ADC_Lenth; i++)4 I* y+ m* o- b
  11.         {
    + d% t, \; {6 d, Q2 z5 C3 ?2 q
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);' N# j% ]0 q$ X- y" r
  13.         }; f! s# A1 a+ |/ Y' S" w8 w- j

  14.   \  l1 g4 t" s

  15. 1 ^! I* m# G9 H9 ?; {
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);3 P' Z, `1 E6 ^2 A" x' q8 I
  17. 6 h: [. \% t: p. E$ T, G- u
  18.     }' L5 M3 L7 Y4 j! _  M- h( i
  19.   }
复制代码

) g4 d' x/ N" N4 ]. E/ ~4 [在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。5 k8 e& @( ^6 ]4 p3 s& X' k
" t* t$ R; D) A5 I9 e) Q
我们使用HAL_DMA_GetState函数来获取状态。
1 |! A) |8 t, [' `- \, N
  1. - HAL_DMA_STATE_RESET:复位状态9 @' e) m2 B' u1 c  @+ Z
  2. - HAL_DMA_STATE_READY:就绪状态8 m) r4 C* `# j' d; F8 u+ K
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    ( r% b, G( z2 S  R+ F" c% x
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    ! F" g" W5 |. l  X
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
! [5 m# b/ w! a6 O$ Z5 V+ `7 v
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于& j; T: p5 x5 j
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
8 T. Z! \0 D" X6 g. o; F/ D* r
微信图片_20240615133330.png
/ j6 V- o, V$ _9 n1 o% J  ^3 W4 [
4 A- H7 g. ?, }5 V0 z3 I这是我们采集的方波信号。
! y. S; M1 G, e
, |! V8 R. A9 W
* g7 F/ x5 r# d+ _- h( E% X
转载自:电路小白# l' e( M( _6 T6 u8 v
如有侵权请联系删除
# z2 ~8 f$ f& O9 ?& Y. _. w4 k/ K
# ?# I( ?) R! p3 r! X
9 O7 V( s* s2 P4 |2 n4 v6 f
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版