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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
, D5 g" Z8 Q0 W2 T' Z. L$ G, A- S' q" Z$ [$ X
板载运算放大器1 R0 P# {( r* ]
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。3 S7 P8 S! d. V1 ~1 b9 D  Z! H

  S" p- u  a$ Q0 Y$ u7 z
微信图片_20240615133357.png 6 C! B' p+ C& Y: t2 K
: x, X# z6 K% B: q* H% D7 t6 T
微信图片_20240615133353.png " H% c: ?* J5 Y: _/ T

/ @5 J4 ^) M% ?6 @3 h0 ?1 t2 Y我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。6 {0 l/ n# b! L7 q3 P% g

2 z. V5 r3 O$ n1 t% E0 e% m3 PADC配置

! ~( D$ V6 E/ k9 K+ k. H; }
8 O) ?- a. c6 n; W0 S$ u9 m+ J 微信图片_20240615133349.png
, T4 r( G4 Q- k  x& [9 W' @! I% N
$ d8 [) E& C" i9 C开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。; V7 |9 l4 p: T3 N; P# ]* |2 S
7 K( f: n9 x2 r9 {7 r/ J
微信图片_20240615133346.png
$ I$ P& i: _3 T: {6 m
0 G) z9 C, j3 X1 u" s添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
* X; q  a6 J" i. i/ E! |% f& k$ X+ I4 ?. w
微信图片_20240615133343.png ! L+ x+ \, _: G0 _8 h% {

) U1 p+ W. r8 N: q$ Z- \6 D( t. A触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。# {2 @* ~4 Y( q( Q* X% S* G
/ P7 \* b, f. l, I: T
定时器配置
7 s, d4 j9 S6 W- Z; q
这里解释一下Timer 8 Trigger Out event.% d/ ^# W2 a1 R0 t$ U
& F, t$ \8 R, }- w6 G# s
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
' y3 _3 q& P3 k: W8 I& O8 b

% s0 e6 N# _9 c在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

& J3 U* \- y" {; t! {$ L2 ~# a更新事件(Update Event)
) G6 k0 C: @3 a# D) ^- |8 o# t0 u当定时器的计数器溢出或达到设定的周期值时产生的事件。
: u. }) l  ^  m3 J' A/ B8 ]捕获/比较事件(Capture/Compare Event)- v" d2 h: n* X2 G  R) \) s7 @
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。  a' M  S1 }7 F
输出比较事件(Output Compare Event)
1 B" g$ ~" f% n3 }9 a) }& z+ P当定时器的输出比较单元产生一个输出信号时的事件。, j) T' F& @4 F- F; t

! J+ l3 N7 N0 _7 O$ ~7 B 微信图片_20240615133339.png
$ z. S3 h8 T2 |- \, C6 z% X0 ~' a) B* J# C0 M2 n" E
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
  M5 R9 b! k7 n
6 M+ `3 |2 K7 A/ D' |$ e6 m& o我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
* _) z2 w$ {+ Q4 E4 ?7 j8 G
4 P1 a( q8 N, a" N
微信图片_20240615133333.png
2 @& z% u( }$ j2 u0 Q: U$ i" a0 m) g2 X; |" C9 g
最后别忘记开启相对应中断源的中断。
  F: F% g5 I/ G* q! [6 s
) x  P5 [: C  N, ~% t$ o接着就是创建工程。

) Y+ l5 P) @) j+ a* \3 |, e
  1. #define ADC_Lenth 10243 X# H- T1 h2 Y$ v4 E! v
  2. int32_t ADC_Value[ADC_Lenth];
复制代码

. E: U, C' b8 T# o; K% k定义一个数组用以充当DMA的缓存区。# y. M# i3 u' u! ?, w4 i
  1. while (1)
    3 A3 X! P* m4 t* `8 b& a
  2.   {& A9 o8 ~: ]& P  N& ^4 ^8 [$ Y
  3.     /* USER CODE END WHILE */
    * d, p8 Z  i! f2 G8 y5 o% I% [5 M

  4.   S0 s2 i3 ^$ h: w9 }# |' L9 L
  5.     /* USER CODE BEGIN 3 */5 ^: x! K* g" Y4 U/ x, H% B' A! Z
  6.     // 检查DMA传输是否完成' `5 E* B( C9 P/ p$ p8 i3 \
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
      }9 u9 y! J  M. i
  8.     {$ `: ?5 y" P2 F6 Z
  9.         // 处理 ADC 数据5 t' q. ]6 E/ e" s! O6 k0 X1 F
  10.         for (int i = 0; i < ADC_Lenth; i++)! l) d! s5 T. R" }) p- {
  11.         {
    + g* G  _0 W7 ~5 c3 X
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);/ u, g+ ?0 f: N; \% E) u4 }. J
  13.         }$ D1 x5 S  W% a2 ~& A

  14. 9 e9 C' U! i. j" i- [# P: ?

  15. ; L) Q% J0 \; W! x
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    . H) F( O' o' B& R

  17. ! Q( S4 w7 v. }/ Y# ]; U5 F
  18.     }
    % v8 K0 R& E2 g& F" K
  19.   }
复制代码

+ _+ p0 g  C3 Z) F, f在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。/ q# D& f# C; T
( m- z; {' r- t2 S
我们使用HAL_DMA_GetState函数来获取状态。5 H& f, `! v, L( L$ Q2 E' Q! z
  1. - HAL_DMA_STATE_RESET:复位状态* j! S. ]/ j9 E4 o5 }1 E5 Z9 p
  2. - HAL_DMA_STATE_READY:就绪状态
    " H; \7 K% Y4 i! G
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    & {" T& u/ B2 k
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    4 N+ h5 }! O+ j) o$ U
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

, U6 k& A( }0 s, S( M- \! M- c# J当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于9 t$ M) E( k! Q
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。5 w  ]+ {9 b4 ~, t" N
! Y8 R, E. ^$ h2 L1 d/ O9 v' t* K
微信图片_20240615133330.png 4 x% ~, t! m1 M9 C

* J8 Q0 @# r1 E7 q& R* R8 H这是我们采集的方波信号。
0 N" V' |4 J* p( L, v# C5 ?
+ c1 B2 b: H2 ]9 n% k2 f, c( E# t. H

9 s7 P* H' g  i2 l6 ^转载自:电路小白
  m3 g0 A( v1 }1 B' w, h' x# p如有侵权请联系删除
! A( n/ p8 S$ i: L- b- U- L4 z! P0 D2 T* q4 e

/ r6 _) @6 J  |9 G+ f6 o' C
收藏 评论0 发布时间:2024-6-15 13:34

举报

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