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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。3 f; O% ]4 \- |% v6 O

2 [8 B) v' N7 l5 ?( e; v
板载运算放大器. C6 g: B; A  L: Q
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。! K6 l# F% ^, I: J% U2 L* n
8 |! {- N, L2 Z8 ^
微信图片_20240525133129.png , q* w# i0 [4 a
7 o5 x7 A. {! u8 j2 R1 i
6 I: A' n, ?7 ~) |+ I! g  v
微信图片_20240525133126.png
5 K$ G/ c& F. I7 E4 \3 ^
) |/ a! `% q/ M" D* _/ x我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。
+ S7 @* Z5 E* y/ c  b7 E8 V" _, w' b  Z
ADC配置
/ `* K' t- I, {" P
% b  \" g* F% a9 w3 O 微信图片_20240525133123.png   }0 t$ F/ l& v) H3 R6 D
  e4 G/ y7 U! S
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。  y4 Y* q7 Y/ r; E% A7 M

$ J2 _, \1 j! L2 C8 ? 微信图片_20240525133120.png 8 F  E5 v! @& _+ v
  I6 \9 R* i6 b) R/ j, c
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。+ \  ~: [& v9 j- w% R0 X
& p- {0 b" ?+ d* K5 g9 Y& F
微信图片_20240525133117.png
: h8 t6 m" g' [, K& s
  J1 g3 G9 [6 I触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。9 x& B5 B# z+ N8 L+ D: `

: F+ l* E  d: g+ T
定时器配置
& t9 ]& O# A9 G) i, i5 k  c8 p/ l这里解释一下Timer 8 Trigger Out event.9 @8 i# a5 r2 j( C3 ]

& T5 b1 q4 g( h# s
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。% i8 f; q) J3 k$ [3 @5 \3 `

$ Z1 H  J5 d& q. p. a) [, w
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
9 X$ ~* V/ {2 D' ]" ~! n更新事件(Update Event)# t3 H* J2 f! x* b! H' z
当定时器的计数器溢出或达到设定的周期值时产生的事件。
4 l6 |- |; m1 t7 K3 E捕获/比较事件(Capture/Compare Event)
6 \! {8 @: S4 f- M: u当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
% W! S# y+ c. \: w. p. a6 I* Y输出比较事件(Output Compare Event)/ V8 D" K& X: }6 F+ i  Z
当定时器的输出比较单元产生一个输出信号时的事件。
9 r/ j9 E' Q6 C& v! n" U4 S- B  K3 }& k' X' `0 F$ x: f" \
4 y! Q: l; \2 E' E. w3 b
微信图片_20240525133114.png
7 C3 v! A) `5 Q

9 \0 k  g: S+ P这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
4 D+ a- F3 J) x4 _5 t5 ^9 `, r9 N" O4 r7 Z+ H
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。5 I  E1 c: y% w! y* S$ H, ~& ~
! [1 W: N4 [6 x( l+ m9 A
微信图片_20240525133110.png - c% v; Y$ [+ j+ N
4 h! v( @# _$ J5 i1 N0 s' A
最后别忘记开启相对应中断源的中断。6 E' W. F, e/ @6 b: E

5 m) {8 ]; i. ?* [$ y% U
接着就是创建工程。
: u7 S6 A" U7 h; @6 n# ?% [$ i, A4 V$ y- a( Q2 @
  1. #define ADC_Lenth 1024
    . I, m/ V: \) ^* {
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
( \$ I  X# e9 Z& t

5 k; I# h1 u* p1 o; G- t( x5 |
定义一个数组用以充当DMA的缓存区。6 k  Y/ B, s, V, F) n8 ]
  1.   while (1)
    ( ?1 ^' \9 Z, l
  2.   {, V/ k5 V' Z) Y2 q% N) P+ M4 I2 f
  3.     /* USER CODE END WHILE */
    , w) V: E$ e  M: E
  4. . `  H' P) p6 b- K
  5.     /* USER CODE BEGIN 3 */; y7 y! P+ u. t& `
  6.     // 检查DMA传输是否完成
    , q+ _! h! @6 G
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
    0 n4 j1 x- o! j$ {) d+ E; l8 @" r: Y
  8.     {
    6 _0 b/ e2 \+ N7 `
  9.         // 处理 ADC 数据
    : Q( k( X2 e% c: ~$ x5 g) J
  10.         for (int i = 0; i < ADC_Lenth; i++)( C0 C: k' ^, A) v6 {- u
  11.         {
    ; t5 L8 @/ P4 w: b0 H) i2 L
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);
    & i* [8 K" z- _, z( L
  13.         }
    9 c' U$ E/ O: Z% T6 O' t
  14.         ' ^+ d9 ~2 }, J/ v4 P9 i
  15.         ; N% l( o/ x( U) Y- C, z, {3 P3 z% C
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    0 y/ M  q% e* T: g2 s/ K6 \! A
  17.         
    ) z' V# D1 J+ G6 r% @/ c4 `
  18.     }* U  i: c. n0 Y  u, ?! n, O& P
  19.   }
复制代码
. _; g' K6 E: O- h: G9 S
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
2 [8 h' h( k! t; M: [
& ^8 [  B' D5 Y" Q/ o我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态! \" t; @% f+ d, o4 I- @* x; w+ o
  2. - HAL_DMA_STATE_READY:就绪状态* o5 Q# O* J' B2 S0 k! ^# s1 \
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    , W9 h* H0 V. W7 k$ T
  4. - HAL_DMA_STATE_TIMEOUT:超时状态+ B2 e) k% B) z# z- n  [* N
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
  P- v! G2 ]4 [) S6 @3 v, G- z* m
  z$ J0 t4 e+ X/ ~
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。/ p  o7 `* r* [! x9 y8 ]
' T3 E$ h! z# o( v% U2 d
微信图片_20240525133107.png 3 Q# y1 ~9 Q4 @

) W% d6 y& `5 _+ K; s1 w9 r这是我们采集的方波信号1 P3 j" s4 d% Z0 l" ^! s
, I0 O$ T7 e! o

: O1 P; Q; Y& R% U1 ^" A' J$ Q+ l转载自:电路小白
2 x: U* `( n; b, F如有侵权请联系删除0 v* T8 B/ N, J+ ?

4 ^/ D( G; a; \5 @6 e6 V& a, v! `; P6 ?$ Y

% c+ ]& s% g1 C& y5 `2 P* z& \
* ]$ b" k# E; [; }* B' \/ C  Y
收藏 评论0 发布时间:2024-5-25 13:31

举报

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