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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
& C* V+ p0 N# B/ E, w2 @' I# P6 w. F8 ?  B  Z0 R. k) J! B
板载运算放大器
- O, Q( b6 D' _9 M0 C板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
; p- B$ |7 |0 l$ N
0 M) @: b% f% b: f
微信图片_20240615133357.png
0 O) J, F* m3 N. u! F3 m' D+ m7 Y. u
$ s$ m* v  f: d/ w/ e" V$ { 微信图片_20240615133353.png
; y  z9 w" i) ^# g
7 f  O- u) e- }; N4 l( X- T6 y: \我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。
1 f  s  p9 b6 d- z& a
' c+ n% c- C8 I4 _7 W) t0 }* EADC配置
7 V3 u& x+ l9 n+ j0 v( i  v

7 q. G! h  Y" N. O7 o 微信图片_20240615133349.png
8 _2 }2 l( ?! g4 ~; q7 {5 p) |+ v
2 e5 ^2 ~3 s/ O" Y: R开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。$ V+ g3 m6 |. q7 n' f# X& w

4 C9 \" ]( A$ Z2 }: I) f 微信图片_20240615133346.png
+ J6 Q( Z0 Y2 _3 Y' \) c1 p% s
& G4 v$ P) T& ?& e3 T% \添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
% J( O9 V- I& k& t. F) }; ^. u+ t$ B7 w8 ^+ A. z
微信图片_20240615133343.png , p7 Y+ p, l4 p* @
6 S8 s2 }" g$ b' j
触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。
- ~2 x1 Y9 a! a: {7 w) w
7 L8 i; F' c9 E5 D3 `1 Y9 j定时器配置

1 E2 G) U. j6 i这里解释一下Timer 8 Trigger Out event./ S3 q- L$ z5 x+ I0 \/ U
  l5 s9 g/ H+ z% G& v5 }6 q
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。

( C) D  _+ z# D# m4 @7 o
" j3 \: h% Y0 g& @5 t6 U7 k# E7 N在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

% |- y2 Q3 V5 {$ ]# y5 q更新事件(Update Event)0 {# T0 U) F1 O* p$ A: j
当定时器的计数器溢出或达到设定的周期值时产生的事件。
: s9 B4 I$ L9 }# o* A, L捕获/比较事件(Capture/Compare Event)
# k, T) N# }3 I# F1 B6 a: m) ]( Q当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。# h1 A9 b7 ^" s% z6 E2 H
输出比较事件(Output Compare Event)
: S5 ^: q$ |7 @  V+ u6 U/ A当定时器的输出比较单元产生一个输出信号时的事件。
; J/ N/ q2 Q7 v1 N: }% K8 }8 a, D" A1 {+ N, Q7 W& r1 o
微信图片_20240615133339.png ' p+ K2 O2 @" L& o7 z

$ O7 o3 u/ v; x0 v这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。3 @$ J# B6 l+ B" p$ q7 i, Z

6 S1 v6 ~( [9 P7 M; r4 I5 f% P( W我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
! t1 U* p7 e( w
0 ^0 K; z1 a2 L* f6 [! W0 ^- l9 P% S
微信图片_20240615133333.png
0 z: l; r" j6 {8 i! e
3 j3 {6 D# |' g/ ^# p最后别忘记开启相对应中断源的中断。; a# H, G! k" B: o- C

: D0 R2 ]5 j- k/ \- K  G3 l! [, d# m接着就是创建工程。

1 [: s9 m3 J: _; [
  1. #define ADC_Lenth 1024
    - D/ o, V3 X1 }9 ~% e
  2. int32_t ADC_Value[ADC_Lenth];
复制代码

5 T. W9 N( a& R5 u  D! D5 W) X定义一个数组用以充当DMA的缓存区。
$ p  s" ^  t1 ~
  1. while (1)
    4 ~) [1 i4 z2 i3 S8 n1 y/ C7 l- C
  2.   {
    ' D7 X6 x8 R  `, S9 n+ f7 T# b1 |
  3.     /* USER CODE END WHILE */
    . W6 p+ [8 a5 v% {* v
  4. - w6 A. c3 }/ \5 T9 y+ G4 E
  5.     /* USER CODE BEGIN 3 */
      x; Q2 r. l: B8 R. [" }# R1 W
  6.     // 检查DMA传输是否完成
    # @: L* z, Z1 R. X& a3 i) `
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
    7 ]1 ^- W# i" h
  8.     {
    5 P( J( a8 J7 E
  9.         // 处理 ADC 数据2 J8 M. w4 C+ N# X
  10.         for (int i = 0; i < ADC_Lenth; i++)
    ( r% V9 c7 C$ G* j+ E
  11.         {4 `' @6 N0 A1 @
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);# ?) p2 c. Y. V
  13.         }" O9 q" U% f: s" |% T, N& y
  14. 9 @4 R& ^% t6 X9 B2 {0 i
  15. 6 \, `# A  H2 O. q2 A0 c3 Q/ e8 @
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);8 N+ O' i+ u% }) t1 X5 O$ F' }

  17. 4 |& ~' o1 O  C  y6 [6 r7 c
  18.     }5 r8 H* y  s" {
  19.   }
复制代码

2 }+ Y, n, Q3 E/ v& P在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。( y  \+ [* x. V, i( _
8 H5 a& A9 b2 w& l
我们使用HAL_DMA_GetState函数来获取状态。: S/ y: N, J3 z% @% p6 O
  1. - HAL_DMA_STATE_RESET:复位状态
    , e3 ]7 U0 o1 |" n
  2. - HAL_DMA_STATE_READY:就绪状态
    / A! P: r0 O" l" T9 r/ s
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    # |$ X* i, j6 A+ ?( f/ c
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    , B, C+ F9 C. _3 x
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
1 }- _. Z" m  T0 S; `
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
  r+ W0 S: C2 s! r7 j) H# }HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。; m, [  j. D2 D' n* C- C: b" E

3 ?2 G& j4 y9 z3 L3 i, \6 d  I1 X* L
微信图片_20240615133330.png
) L7 P4 m  Z$ X! f) e+ I' u) S
* l7 a6 ~- x3 r7 B( V这是我们采集的方波信号。

# }& A& g/ V5 J- l" V- I
/ l9 ?3 k8 `) W$ \- ~! N- R

& K5 C: ]* l# O! c6 K转载自:电路小白
2 z' G7 }1 R8 P% _8 i" Q如有侵权请联系删除
( a) N  T7 n) j8 F9 v1 Y/ p% s9 \+ C' x7 \  X

2 \6 O+ _9 ^# ~
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

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