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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
: [6 I5 q& o: F. p* H; a: Q6 q( g% J5 B' q2 T
板载运算放大器
& O/ \3 y6 y- l1 Z  _& E6 g2 _板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
+ y! Y+ `: c: j; |
2 ?. J# c% }$ o 微信图片_20240525133129.png ) `% d& B# V( P  X( p. |

8 g/ y- `, E2 N& y1 R4 \: M" w5 l* q$ i: M& k# |+ [$ x
微信图片_20240525133126.png
- q1 {9 H; t7 ?$ b
3 w2 ]3 u( Y4 L我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。! v  Y7 u1 T+ Z$ V7 l
: B' @; o4 |9 D4 [6 x
ADC配置
3 f- B1 w& N( k, Y
2 R: @$ S2 _8 i  i8 a  I/ V* { 微信图片_20240525133123.png ! `3 T9 {! M( n+ x
5 y: o! Y3 F% g. z
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。* o; H! |" d4 @1 O; ^% s* g- D- K
* j! P# p0 f% D' W+ n% B
微信图片_20240525133120.png 7 U6 I: I2 j& o+ ]

2 M: b/ \# B. V0 w添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
: `4 _& Z6 e: _0 R( T8 L, x4 \
3 U8 p6 C4 A# `8 o9 v5 q& I" j. v
微信图片_20240525133117.png 3 i: V, s- T* J2 u' o

- ]6 H% y5 F0 \5 q; I. v触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。3 `- J/ A1 G7 v+ w4 r" H

$ p5 U  V+ p) q5 l
定时器配置
% U. @7 j* \3 V( e% `6 @这里解释一下Timer 8 Trigger Out event.4 s1 F! y( l) G' `
5 `: Q* n& j3 _) [7 f8 C
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。( y6 F% H: m0 F$ M% ^1 z5 N# r7 ^
, I- N; B8 d) {' e1 ~; @  Z
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
; G2 l$ t1 d9 Q更新事件(Update Event)! l* N  n8 l- d- u" j0 q& @5 H
当定时器的计数器溢出或达到设定的周期值时产生的事件。
- j9 k  Y. u' a& [捕获/比较事件(Capture/Compare Event)% K5 }- v: g0 E5 {
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。" x: z$ l, @: I7 `! M
输出比较事件(Output Compare Event)! ~# z% s  r6 T; P0 K2 q+ Q& i
当定时器的输出比较单元产生一个输出信号时的事件。% v6 T: B1 l( Y+ F# k, X4 g

" q* D, l) ~$ m$ L

9 ~  S, x4 K. w4 k: U) ` 微信图片_20240525133114.png - F4 ?- b$ s1 \  D0 l

* C  l' l. D4 k& E. @! C. M这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
* K8 k, Y0 j2 K4 W5 C0 d$ r& m2 @* [' q# \7 c6 @
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
) Y# M3 |1 D# \1 B- ]
$ E5 g7 G4 d) i( T+ R 微信图片_20240525133110.png
+ i7 C; u8 I$ e. n. x* f2 `
7 M% E' U7 f& w最后别忘记开启相对应中断源的中断。( c( M* c- g  H  G3 w+ q

3 i- o0 K0 f0 m; N: C, _8 G
接着就是创建工程。# y) P. O: b' u& O6 w. u. O
& s! a; N! E! K
  1. #define ADC_Lenth 1024
    8 [# H) T4 V6 J
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
# F4 }- T: r+ {. M' V& D. s

6 z3 @; x# M. X$ b: ~( Y( G
定义一个数组用以充当DMA的缓存区。5 |6 e  V/ w4 h2 R9 ?
  1.   while (1)
    8 M3 t- n" J1 Z; M8 F' \
  2.   {
    - l  o' C& `. V2 L
  3.     /* USER CODE END WHILE */2 L/ _% v  l% M( ^
  4. ) Q  f: @& |4 q4 q7 C
  5.     /* USER CODE BEGIN 3 */
    $ [5 k4 q) y! S1 j& i" k4 }! {
  6.     // 检查DMA传输是否完成8 B; g! w; M* y* ?
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)- E4 M* F3 u7 }. u& o  z9 t
  8.     {) f% Z0 a# _# ]
  9.         // 处理 ADC 数据
    + F: D" z+ o) n3 O9 W  p+ ]4 \
  10.         for (int i = 0; i < ADC_Lenth; i++)
      H3 }# D1 ^2 S) ]3 Y
  11.         {
    ; L8 B- m, |. B
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);
    - N  v- o8 k0 E
  13.         }
    - G( J2 `0 |+ [# k# G5 R) d
  14.         
    : Y; @% \5 D( P, G. [' U  ~+ y! u$ F
  15.         
    + G1 e$ \2 k: U" y/ E0 `( A
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);3 X* }1 ^' j8 z$ t' U
  17.         
    ; V  B, X+ @- V1 N- T
  18.     }
    0 I% u+ A, Q/ Y/ w- S9 [, u
  19.   }
复制代码

# Y" L8 S& U, m, _在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
, f6 L% d; v" \$ H: h
: s; D. c+ C" o+ N4 f我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态* ^  m+ w( Q+ t
  2. - HAL_DMA_STATE_READY:就绪状态, U8 o- n4 s0 G5 v0 K! }
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    0 ?0 N3 T! T* y- ]# _# k, W
  4. - HAL_DMA_STATE_TIMEOUT:超时状态4 L/ r$ n7 F5 p. a+ O5 ]5 M5 s
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
' }  F9 B. _7 m- M+ Y% N/ M) |; f
) m# w0 x7 d) h9 S7 g: F
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
, A" ?- U8 T/ u3 J8 {0 J
4 e: m" O  d9 `8 x
微信图片_20240525133107.png ! i9 G, m3 B* q- V: g/ A% F
$ b( a0 n; {4 N  b
这是我们采集的方波信号
. O# q+ N! i* i1 [* y5 L' f$ {- w* i% J* G
$ o+ i% a: E4 @# c' X- ?
转载自:电路小白
7 f2 k5 d4 l. k7 q  x如有侵权请联系删除
4 n7 ]6 y, Z1 }: G) J
/ q5 l& o3 e9 l8 J. I* P
* n( q) n  b. R; c
" m& \! B& Y) l) t5 J, e; C+ D  b
/ P) ]: q: }4 o$ R- ?
赞 收藏 评论0 发布时间:2024-5-25 13:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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