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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
2 }# e. t* J) e! t6 ^( a6 {) p3 E/ y2 e4 x/ @
板载运算放大器$ @. o* C9 f  {' F2 g# |' d
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
* h8 _' r+ _6 [: h$ C- w
  X! z( g" u% L! T 微信图片_20240525133129.png
) S; C/ {# ]3 T0 h/ z/ j5 R4 d# A
3 g  }) |$ Y& E; t1 d- |6 ?9 Z& B% [8 H9 S; ~
微信图片_20240525133126.png 6 {9 S. g$ u4 d" C* o1 _
2 J5 i0 P( A5 C( |
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。: k8 G. i0 O0 o
8 |  r* V( e5 J6 T& }
ADC配置
: H# E$ ~' Z! ~- n9 _) Y, S' z# K. x9 ^
微信图片_20240525133123.png $ e6 j, `/ v  j
& h2 {! B' `4 F7 i) G* Q
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。( ?) r: F" l0 ^+ P9 |, W4 W
" a0 b9 k; E6 \4 j( X
微信图片_20240525133120.png # \/ y3 H* ]& y: o6 b
" |- b* Q& z5 X  ~
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
. U, t4 U! L: |$ `4 r* n* |+ V, u0 A* ]. d
微信图片_20240525133117.png ( Y( r. F. T6 Y  g

1 c* j% J: R2 F1 `+ }- s触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。% k$ O( j, U4 f# y6 q

2 n8 Q" j5 @* j1 p" [4 @9 Y
定时器配置9 S- p* }  u- k# @7 l
这里解释一下Timer 8 Trigger Out event.
' Y% l" |, z  R- K4 \4 N2 p7 A1 ~+ [1 b7 v( H+ }
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。4 [7 G7 `- g% Z: P7 ~6 M7 s" J  |$ d

, r2 h2 [4 R: w
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
- k7 H' @& X, |$ b1 M更新事件(Update Event)/ H; I. x6 F% e# q* ?
当定时器的计数器溢出或达到设定的周期值时产生的事件。& a# w. \) v8 Z7 x% i" K5 b
捕获/比较事件(Capture/Compare Event)# y- Z; f, L. m! X2 x, F1 _7 V  i
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。/ p7 p0 v* U( }$ u" b8 R
输出比较事件(Output Compare Event)# `& P# l8 r' e& M" u6 T, D
当定时器的输出比较单元产生一个输出信号时的事件。% _# V) C# O0 ^5 v8 y" P+ m

. o3 m9 a" w9 K* q/ u
' t1 Q# D/ x1 O9 w# `5 u& _* S
微信图片_20240525133114.png
0 U: @+ Q, o) S! x' j2 e4 P$ N

2 U! W1 {# b  [0 P' N这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
9 _* U/ i0 b$ g; S
& z. u" s$ F+ s  t) l
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
1 q/ a+ Y- {+ ^- Y- ]
' P# _4 N0 B1 j- h" R 微信图片_20240525133110.png
2 K- j! g! d, Y0 J, \7 X1 ?  O* z
! m* Z$ Z* U" K. R# \" @最后别忘记开启相对应中断源的中断。
& A2 L7 W+ ?( T% Y- i% _- s# x, v& L5 c# j5 v
接着就是创建工程。
7 J/ Y# p) R: N: @' B: q* ]% }4 S0 E, D
  1. #define ADC_Lenth 1024
    $ _  i: ^! s2 q. f) v& F$ k7 u
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
; q1 z2 d. l, e; Q% L5 W# B

0 E- ^! d- T% ~
定义一个数组用以充当DMA的缓存区。
7 w% i0 v; g# ]
  1.   while (1)7 K; O5 A1 a& J) t; `
  2.   {& e: l# x' j4 G$ g0 @9 H
  3.     /* USER CODE END WHILE */
    6 M( W5 z4 X' B5 P' p7 c
  4. . f7 }& R8 O3 }
  5.     /* USER CODE BEGIN 3 */; X2 K8 ^% g+ T5 S  i8 l) q* J! g
  6.     // 检查DMA传输是否完成" ~" `0 x- G) w, L( R
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)+ @6 F4 J: [8 d, j
  8.     {4 z' }; r/ F5 K- k
  9.         // 处理 ADC 数据2 e. `1 K: Z1 g3 W) e4 N' _
  10.         for (int i = 0; i < ADC_Lenth; i++)1 q9 `( A$ ]; q. V/ y. v* {! T: E
  11.         {1 S# D! e- p! I, U4 U5 P
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);' P9 j4 {2 d7 @2 P, i) N; L2 l1 E
  13.         }7 X% P4 b) i5 \$ h, n3 D- C
  14.         % c- |* Z: y7 h, M% N
  15.         3 I8 F8 W- f* b% g5 C
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    5 _+ r7 U; a. C; l! [) M2 G# v8 ]
  17.         * L7 `0 o+ f) _8 H. F2 Z
  18.     }
    ! Y5 g; \) W. \" v2 C# E
  19.   }
复制代码

  R6 ?) `6 S& |: T: J! p在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。- C' A, H4 Z( n; k! O+ m

$ P0 C8 H/ y2 e- m  b我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态4 o% v0 W7 S; [& r
  2. - HAL_DMA_STATE_READY:就绪状态
    9 @8 w8 n7 P! J9 `0 C
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    ) _( u8 V9 W6 u" ^3 o5 m# K
  4. - HAL_DMA_STATE_TIMEOUT:超时状态# x1 c; R& J7 n! G& m2 L& w+ H
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
5 F7 {& M' O- c' \7 P3 N; ~4 G  E: k5 X0 C
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。7 F( a/ z5 ^9 E) r- x0 Y7 [1 o6 F# m
0 \3 C* u( v) B: w/ {2 ^' J' _
微信图片_20240525133107.png
2 K7 P/ u4 i9 O2 r/ l" ]
  o! n4 Z( f8 j: C; h这是我们采集的方波信号
- E) g9 h3 Z! A! ], w" [6 v5 I, L& k6 P- o

& b( d* g% C/ t  t转载自:电路小白4 |+ S: o4 A; F9 M2 s  k' q( G$ n
如有侵权请联系删除
3 w5 V" {. g3 u- Y- L& t' d

- |, L" A& H1 b# C7 T- g7 M- r! X( A- c

2 m# M0 `/ _: J$ w, ?& J3 N$ m9 d$ E
- s3 k: ^7 T, A3 e
收藏 评论0 发布时间:2024-5-25 13:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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