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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。7 [. {7 L2 X6 t, w) c7 y# J7 _3 O: u
) V2 z0 M3 s% \2 e! J9 B
板载运算放大器0 ^! S6 d3 l9 q6 c( \, i1 I# j  ?) N
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
8 }% j5 o/ E6 S4 _5 w! _( t: g& a2 c2 P9 @
微信图片_20240615133357.png 3 T0 `/ C8 B. C* r
8 I8 z, q  A0 n5 m
微信图片_20240615133353.png & S# g) B; v: ?" p1 X
" t2 t4 C$ w2 x) {& _
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。/ a: n& e2 z! O3 K7 s4 b  @

# K( w5 }: @$ H( t8 Y3 j# |ADC配置
% e( Y# x# O  U

5 M% J! ~! x3 N4 I7 S 微信图片_20240615133349.png
* w+ t5 X" f( I
, J) E& f. K/ c. t开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。
' i- J* F' e4 m0 h7 w& k$ F2 j
/ W$ _; u& }; J- q 微信图片_20240615133346.png 7 b0 U7 u$ Y( \% ?) ^

! R7 X! g" `) A- X添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。7 ~# `3 n. g+ U, [  i  _/ o$ K( E
% S* j; ^; g. N% d
微信图片_20240615133343.png . M' r4 r4 ~; C+ {9 ^/ I  h
) W' n) V% i7 }% R0 y7 ]
触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。
1 T6 P- x# n% @8 o" T( p4 N; m  [4 d! L# n" W5 z: Z0 {$ {
定时器配置
: j1 `3 r- m4 Z+ ?1 P
这里解释一下Timer 8 Trigger Out event.4 v0 X" g" e& t1 l7 C
3 t9 X6 ]  f0 c7 X0 u/ f
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。

1 y& n, |* b$ s0 n  G+ g- M% O3 J* S$ ~
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

* H8 x% d5 I- ^+ {/ {2 F8 j. }6 ?更新事件(Update Event)
$ \6 z. h# J" `- C4 ~+ p( i' T当定时器的计数器溢出或达到设定的周期值时产生的事件。. d7 E9 R  S0 Q- F! A. a. `2 j
捕获/比较事件(Capture/Compare Event)
: ~4 q) w$ H- q1 P( d) j当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
" h! E8 @0 u# o2 T" J/ n' j% X# j输出比较事件(Output Compare Event)3 t2 F8 n2 o* ^" O. s
当定时器的输出比较单元产生一个输出信号时的事件。! }# c1 V& H# m
9 z( n, R: F4 j3 k1 X4 P9 C
微信图片_20240615133339.png
4 B% R, O& Z/ u5 Z* f0 v
5 I& I: j/ q5 h8 o. {这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。; X/ `3 w# L, G4 M, i. H' w
7 Z) c3 Q: H5 [  c/ b6 F* s( r+ x3 T
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
, ~1 O/ P5 ]) f) ~

, k& V7 h, m' a/ I! A- p( O 微信图片_20240615133333.png
0 |  g6 ^3 D9 P( M( \7 i, p. w5 _8 a% ?' O
最后别忘记开启相对应中断源的中断。
( p4 N  i6 N# U( w$ g& X# R) @- l" m; m- a$ Z
接着就是创建工程。
% P2 ~; \6 f9 {9 }
  1. #define ADC_Lenth 1024
    0 e" N" E! ]7 [, \
  2. int32_t ADC_Value[ADC_Lenth];
复制代码

: W% f, F' k; w  x0 f, G1 a定义一个数组用以充当DMA的缓存区。
' b* X! \- ]" ?
  1. while (1)- }* _' Y2 h7 N0 u3 k5 Y
  2.   {
    * i/ D9 P3 W$ `$ X/ s0 D$ y
  3.     /* USER CODE END WHILE */
    * r/ K. A2 b* K7 _. @

  4. 9 ?# S5 C7 @! u7 q
  5.     /* USER CODE BEGIN 3 */
    ! L  G- d% _4 X, x( i
  6.     // 检查DMA传输是否完成' {+ }# d- \- H! [$ f8 k5 A, O
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)& d! \  o- m" R1 k# U
  8.     {
    ' w: t/ P# C, X, ~1 u; o  Q
  9.         // 处理 ADC 数据" c6 R; _$ T6 h" C7 a4 T: Z- a9 ]$ E
  10.         for (int i = 0; i < ADC_Lenth; i++)7 ]) q/ a3 e+ n0 {7 |7 z
  11.         {
    : i) ~3 U: j- t% l: \- k* p( o4 `
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);& W* J# M0 u. I) k: x. `
  13.         }) z0 Q) z% {' u3 S

  14. & L3 b9 G2 f! r6 }& I5 b

  15. % N% |' n. F% V3 M1 m
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    . A, U$ |: \* x, G7 v  e4 O. }
  17. / \0 {2 \3 Q! `
  18.     }
    + g5 e& L7 F$ E1 u
  19.   }
复制代码
. l7 `2 @0 V% j' @
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。- j8 K/ M9 ^& d3 B( H- u, b* \
6 Q" O0 c; ^* Y) `& D& x' Y8 a
我们使用HAL_DMA_GetState函数来获取状态。1 I3 K7 p. ?) P  Z/ K
  1. - HAL_DMA_STATE_RESET:复位状态
    ) O5 g" ]  g3 ~: |& i& Q8 Y. F
  2. - HAL_DMA_STATE_READY:就绪状态4 Q" J0 l1 W7 f6 l  @- l
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    5 `: m6 h, V" B# b6 }$ q$ ?
  4. - HAL_DMA_STATE_TIMEOUT:超时状态/ N2 C% W9 H8 S. R+ W9 M; T
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

5 |( `; W& s* {  ]( B8 i0 ?9 Z当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于9 d" ~. {% E9 t" R
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
( B2 p' @9 G- H0 e
) `+ D4 G; J: d6 N8 z- S* f: l8 n
微信图片_20240615133330.png ( L2 y- F# e9 j1 e7 L' c/ N# z

, W6 R3 |: z- d5 [这是我们采集的方波信号。
+ ^* L; Q0 N; t5 Z: a
- _' ?6 ^2 W" C' _
. W* O9 P0 M; ^# M( c  C0 Y" d) [  ^
转载自:电路小白
. l8 b, _& A. q1 R- y如有侵权请联系删除; ]4 o7 l# H* B5 i
8 y/ v2 r+ r. n8 {- b
3 _1 j, l4 `$ H
赞 收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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