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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。' |) |! ~6 u/ B" b0 @6 L

3 N0 M$ V) ?4 o% r# R+ I# R板载运算放大器
7 y' z" u' @* m+ O板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。' t6 p0 ?, Z' f0 o5 q' g" V$ [

6 n5 O7 u) c6 ]& m4 F9 ~5 a* D
微信图片_20240615133357.png 4 L+ s7 A% _6 q: d

5 X& N- C  ~: I3 ^' w& P; u 微信图片_20240615133353.png ; Q% M+ z& p% c' \

. v8 y$ H( c9 H( y我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。1 M; c. D* a5 ~4 D+ P( M
7 ^# Y! s) B4 R+ Z6 a  B
ADC配置

. d6 j& K3 X$ o' e: i) i8 k$ i& u& G; `$ X3 j
微信图片_20240615133349.png
' B8 D- q0 p# q3 \) K& b
6 y4 `. S: F  l开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。
% p7 P* J( n2 B; r2 i. l# I
4 ?% S' _7 o% H4 Z( A- Y  n 微信图片_20240615133346.png / U5 a7 x# G0 u0 S% [
8 I% ]3 q# v/ a. z  h5 f7 K2 G& e
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。8 j/ h0 k" v; i- V1 M
8 }9 x- ~9 F5 M( x. ~/ }
微信图片_20240615133343.png
# b% J5 V# k* }6 Z" T8 T9 b" S$ u7 u8 A- w2 {1 \/ _9 g6 g" \( x
触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。
2 G0 t, X2 S8 j. P8 X$ ~% Z1 n
% H! R# {% L. v8 C定时器配置
1 ^& s9 `" x- w- O" A( f
这里解释一下Timer 8 Trigger Out event.* x# _0 H/ A1 i+ {4 q# o8 [

$ J/ {7 q/ X. Q( p6 b定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
) y/ M. H7 a1 ~& l2 w
* b: r$ t8 L. P; e2 ^* d4 U
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

) M" X0 A1 H# @3 M) S更新事件(Update Event)
  Z, R# q* F8 e7 ~. Y当定时器的计数器溢出或达到设定的周期值时产生的事件。
* @; t! Q# G. l3 N捕获/比较事件(Capture/Compare Event)- [; D; d; _0 B9 x4 h: c- Y
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
; x: d# e. v" M输出比较事件(Output Compare Event)
% P( B, B5 @# o' v当定时器的输出比较单元产生一个输出信号时的事件。7 D3 s8 c' a) q6 f
; ^7 ]) d' e. i7 J$ G. j, O6 |8 E; \
微信图片_20240615133339.png
( Y0 O7 B( U, w6 Z; J$ V& s8 R" O% ^; J* c4 @' ^
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。7 _: W: t- I5 L- u

7 D# D0 U- \8 k3 B我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

. H2 [0 L* J2 v4 f. k3 C
* W! f0 t3 Y8 E8 g  T 微信图片_20240615133333.png
+ A  s2 L% k! A* u7 ~& K9 h4 Z7 t, W% q# D9 x. l
最后别忘记开启相对应中断源的中断。
" Y7 J4 g0 D% P# w2 t$ M( a: ?3 }  V' Q$ P6 l, u
接着就是创建工程。
: a" I; J6 S; p; C3 v! J# G+ V
  1. #define ADC_Lenth 1024
    ; d  h6 H" T9 ]0 f
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
! q2 d$ d5 y; J7 `
定义一个数组用以充当DMA的缓存区。
4 F- k# U/ Y( {  s: L7 D) S
  1. while (1)' H% z; p$ G2 T6 g$ _4 w' R
  2.   {
    * A- p4 Z; G* w: V
  3.     /* USER CODE END WHILE */7 T. |6 g9 T: R0 l& B% p
  4. , ]/ l$ e1 Z' k6 H5 w) b; s
  5.     /* USER CODE BEGIN 3 */: u- B% q# ^  A1 E* M* d
  6.     // 检查DMA传输是否完成7 k" B' ~9 S! g& R$ Y
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
    " v6 j0 \* U2 `5 j* {( f
  8.     {
    4 M/ ~& W4 F8 }" a9 a, x
  9.         // 处理 ADC 数据
    ) g2 B8 m: }( }( Y9 ?
  10.         for (int i = 0; i < ADC_Lenth; i++)! q5 K5 G1 w* P6 e: u4 I& p
  11.         {
    % l4 @; x: e* g7 _! h
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);
    . m+ A# p# N: L$ q5 T0 N1 c
  13.         }
    ) a/ g6 V1 d, t% D4 K5 s) j, _

  14. 7 y" g2 ~9 M6 ^" Q
  15. 1 r: q; S% T5 r; H+ b
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);) O% ~, `3 X& f& @- l1 }
  17. % D2 ]; |+ B2 }  r: j0 v
  18.     }
    1 Y8 B( ~( E$ R0 ]" U, }& [
  19.   }
复制代码

. w9 ^" m4 H4 z* c在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
' ]! `% j" T6 H9 B
* _1 [4 N# W- j; p9 s# y我们使用HAL_DMA_GetState函数来获取状态。+ \9 e( a/ z) r/ I' G/ j
  1. - HAL_DMA_STATE_RESET:复位状态
    & W( r6 p. t' p/ l- u- S
  2. - HAL_DMA_STATE_READY:就绪状态
    9 z& Y& `8 L# u) h4 @- [0 c! D$ t3 A
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    ' w- X5 ^/ b, D+ N
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    + o# `3 R5 X: s$ m0 t% L1 ]
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

3 ^8 B  F" I( ^8 H0 M' n2 d当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
, E& Z4 L! @  o8 a* j5 J) f1 k# \0 eHAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
0 A2 _( n5 _: J% a
8 s& i; p* ]& ^5 z9 m- F
微信图片_20240615133330.png + r/ @) r% b) j

! N0 z0 ~$ S6 C6 H3 V9 `! F  g. R这是我们采集的方波信号。
  q7 [' ^: X5 F0 u$ M7 o

' u) z+ d( D. N9 F: O  z# q; v

0 d; \4 `" Y- g0 M6 S1 d* i  p: F, r转载自:电路小白
  l& w' }) ^  A' \# e) F! |* L如有侵权请联系删除. `6 M1 ~/ D. _0 f

) |/ b0 ^8 H6 ~+ S
8 g6 t4 J2 z# [' h: M
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版