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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
2 b, w3 O% h& m9 ^! y
, Q* J: C- R# J- f, ]  m
板载运算放大器+ X- b* o: @. X- i; R3 z
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。$ H, ~# c* q8 y% Y0 N
* b- a' K! R" N- g+ x' c
微信图片_20240525133129.png
9 R& z: P# _2 @  G/ ?7 T4 ?2 n% G/ Z$ r6 z- D
6 T9 m" P7 i, T3 I
微信图片_20240525133126.png - J7 K5 V$ P/ Q$ [1 U4 I

% C/ O* o- V$ ]4 _我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。
9 b" f" B' H- g% `% n/ [
: `" \; [! y& B
ADC配置
# k: o, Q  r' B' _. c+ L
  V! E+ B# h" g2 E7 s 微信图片_20240525133123.png . R& `, y5 J6 d9 W: d

7 Y3 p8 s9 p7 T1 y2 v) @开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。" G$ f8 F: R/ L+ r

' s5 s/ ]* }  [& _+ W5 T( R 微信图片_20240525133120.png ! g& ?+ i/ j6 y" W

* S% [# L" P: o5 l) b. J添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
5 C- a5 T; u5 V
2 `* `. O5 G7 h' b* F+ c$ W
微信图片_20240525133117.png 3 M( X, s0 A. Z& S9 q

- V5 E5 j9 E4 s1 p. X1 A触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。, t2 M: t9 ]( }! ^( C

7 s7 ^4 ^% V# e" N2 C# Q
定时器配置
, L1 m& F# X' H% C: H7 [1 w这里解释一下Timer 8 Trigger Out event.
; ?, z5 G& {$ @) w) q3 y1 Y1 w. N$ b1 @9 H
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。9 H, G1 N9 i5 b+ x2 |+ @; B% ]

0 B) q( l- W+ \* \4 A
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:4 D* n" K$ E* o6 }0 c1 j9 G  P5 t# l
更新事件(Update Event)& f: O9 O9 T: c* ~6 I
当定时器的计数器溢出或达到设定的周期值时产生的事件。
1 s. n" l. H% p- I/ P) ^捕获/比较事件(Capture/Compare Event)
2 h& s! K6 R( h2 o当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
" H7 V' G, s4 H3 m2 {输出比较事件(Output Compare Event)
) [) P2 ?, o% q3 |- z1 a3 U当定时器的输出比较单元产生一个输出信号时的事件。' x; E: I( a8 ^" M1 D. w
& g0 c; l$ n2 \4 [* s
$ ]* X: I8 B8 N- l. Y& }
微信图片_20240525133114.png . i) t$ t6 J5 M2 d8 m0 [) a
; |  A6 ]+ @* ]; l1 I' x0 P
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
3 y0 G+ W) p' A0 g& G% V$ r  ?
9 u9 _7 K: O$ ?  B2 `
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。8 G: g( L# o0 e0 R

$ C# @0 ]; j& f& Z3 c  E3 d* k2 \ 微信图片_20240525133110.png . K. Q! T" P) |
! N  L4 T5 E. n5 [
最后别忘记开启相对应中断源的中断。
+ d; b6 R! |9 V$ `
; \' q2 F5 V3 z- C
接着就是创建工程。  S; f3 c9 u1 B. y2 m8 k, v0 m
  S& z* b$ Z/ _7 d  }3 L1 J- G; q4 F
  1. #define ADC_Lenth 1024, x- p2 |. C* d6 c
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
+ P* ?" b6 P' N' y1 V2 a
& f2 f4 ~# S, l" e7 w  m+ ^# P
定义一个数组用以充当DMA的缓存区。# X/ T7 n- Q& l/ s* ~
  1.   while (1)
    $ ^( m& p' B# v6 V+ ~& I% o
  2.   {
    ' P- b; p5 M6 x. x+ A- T
  3.     /* USER CODE END WHILE */# t8 d* d6 S' H. G, i/ O4 g$ ^6 t4 R
  4. 3 ?# h0 x% W. K. v! m0 {
  5.     /* USER CODE BEGIN 3 */
    9 v5 s( n1 m, L; }0 m
  6.     // 检查DMA传输是否完成, v9 G! a' |+ b& v
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
    ! r- E5 [$ |( n7 ]( }# r4 u
  8.     {
    # b* x9 s6 r" L
  9.         // 处理 ADC 数据
    % H, P' n0 Y5 a& q7 E
  10.         for (int i = 0; i < ADC_Lenth; i++)
    0 w# ], u2 w6 U5 ~$ T# S6 X; p
  11.         {  C8 W9 y; Z$ R, |' k* u# ?9 j6 Q
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);$ j8 g1 P% X. M, b/ U9 o2 m
  13.         }' }& |5 m' z+ m5 h
  14.         6 q8 ]* `* L2 u: ]$ w
  15.         
    1 I/ A8 Q3 @" E+ @9 ]
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    1 Z+ V! B; L. Q; |2 C( R
  17.         2 i0 u' N2 ]2 P) j- X, S4 Q- g
  18.     }5 C# n" c$ Y+ E* z0 K! ~
  19.   }
复制代码
" z: O7 R3 t5 X7 _% {
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。, g  e9 r- f. Y$ t: N. [2 \
! {' G& R' T, w1 ~- d1 w
我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态
    " F& d3 \9 [, W8 t1 J
  2. - HAL_DMA_STATE_READY:就绪状态/ g- _9 \" V3 L, @. W8 ~# i
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    / V' `1 [& j7 [# F3 w6 c& [
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    5 J+ ]3 k4 e! X# v. X' v! x
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
; P  c" e$ h- ]$ K2 M4 M0 Y- I, W- W% n* u$ H
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。: x. ?. r) b' t0 A. i/ f5 |" @  e. y

" t, \6 K& S, ~& H9 N$ W1 P
微信图片_20240525133107.png * q6 n+ J& s" J8 x7 ^

! x0 Z6 A: W# M这是我们采集的方波信号$ S8 m, h) q8 u9 o* m
: a' C5 z$ V1 u2 Q

8 _8 e  z# C. x9 L6 d5 U转载自:电路小白
( z5 r' w' f! X6 X如有侵权请联系删除
2 s6 f- W5 Y+ p2 d' f& z

  N( {1 Y2 y' `; P* w. y0 Z0 ]& X, ~. O

( t2 y( o# R. |. U
4 P0 l4 U* c0 `
收藏 评论0 发布时间:2024-5-25 13:31

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版