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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
) X# `" d8 t8 `6 j; |- {/ n: B2 ~9 H- ]8 B4 V+ ^: T
板载运算放大器
' S3 |+ A' P, C$ |2 q" O$ j& j板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。/ V" p' w  z; x3 q2 @6 c
- O+ {8 g7 N% v8 a! b# u. F
微信图片_20240615133357.png
9 h! ^# z- s. \& x4 N# i' F
8 _6 E1 v  e2 n  P  P& w. L 微信图片_20240615133353.png
% k+ v4 I2 G$ _3 f$ K. D! ]6 p2 e2 v& w* z9 W& C
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。& U; ~( v1 j$ _5 s- f8 N
  K1 z1 B* z8 S; F8 \
ADC配置

. d9 r. j1 J0 Y- d' ]
- j# y5 h3 V+ E 微信图片_20240615133349.png % Z4 b( Q9 {, s, [  n# m
! S0 X7 {/ x. \: R$ E4 d* j  e! [1 S
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。
0 I. f  |4 g1 s) w' m( v# R1 I/ L  r6 w2 T+ t+ G2 j
微信图片_20240615133346.png / Q' f3 W6 ~9 p. E" x
8 P( o1 ~; o% N$ o7 v: H
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。! v0 C6 @, O5 ~0 o7 x7 A
; T# v! A9 A/ B- u3 d4 ]: r; F
微信图片_20240615133343.png
% P: t# d8 G7 c) d2 N! c
, g0 }6 L- {) L# I6 @1 b! _触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。, z, o: b' l& s! J

! Y* ~: K. }, \: E0 m定时器配置

# y* n5 P4 e# J+ ]: S; w这里解释一下Timer 8 Trigger Out event.* A* s  [& i& @6 ?+ T+ P
) W  h* L4 X' S1 A0 y+ b
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
3 ~! h) L5 p2 H$ \6 J) z

+ n+ Z! p) b1 E7 l& z在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

. @: G( J! r% i! Q8 M0 S- @5 C更新事件(Update Event)  n7 e" o& l/ ~6 M+ Q
当定时器的计数器溢出或达到设定的周期值时产生的事件。
% c/ A9 a! K! a+ p$ A捕获/比较事件(Capture/Compare Event)6 C/ L; n8 P) e" Q7 h( Q9 `
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。$ Y' y9 _- E/ d5 w# J$ E2 \
输出比较事件(Output Compare Event)
- t( `4 I+ }2 }5 U0 H" x当定时器的输出比较单元产生一个输出信号时的事件。
: D( K+ B& |/ `0 x) x
; G9 X0 S1 J/ \+ H9 H9 A 微信图片_20240615133339.png ; H" ~9 D7 f' ~

; e* y- Y3 O. n2 @- t这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
3 C+ B1 f: ]- W/ m8 E( ], H3 V4 [. G+ F- R
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
2 s, b# D+ T% R' h5 ?- n! p

/ _8 U0 Q, M: H 微信图片_20240615133333.png , m& j: j0 [( _& z  [
5 G# q7 j. e6 J, u) d
最后别忘记开启相对应中断源的中断。
$ g9 Z+ z# n/ h$ G9 E9 Q
8 l( D6 r  O5 I6 r) }1 v) n* [# A接着就是创建工程。

" k/ u+ K3 a5 x0 R
  1. #define ADC_Lenth 1024
    + o5 Y5 W1 R# ]3 V- j0 b, i' B
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
( x! @. d7 t* s. _
定义一个数组用以充当DMA的缓存区。: c( d$ u2 q1 ^9 S, V3 r! E
  1. while (1)
    ( B3 L) @8 P3 j; `
  2.   {
    # M0 X8 z, b' u2 _+ a, w
  3.     /* USER CODE END WHILE */6 S6 z# ?7 T# C
  4. % S1 Z  Y6 a. i- q6 |2 a" x
  5.     /* USER CODE BEGIN 3 */0 \+ ^1 Q% q3 _. i
  6.     // 检查DMA传输是否完成  w0 `4 E& V" @; A* Z
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)* J9 o$ e5 J# a, `7 X& M0 Y5 D
  8.     {6 q9 Q( R! n$ M' ~$ @. ?. D4 y
  9.         // 处理 ADC 数据# `3 e$ H+ A- I* @( B
  10.         for (int i = 0; i < ADC_Lenth; i++)
    ' d6 j: h+ U2 U7 a% K2 v+ j
  11.         {& Y* ~% g/ J+ Q9 I/ X
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);
      C* `. X7 A0 W# t2 B8 C1 P9 ~
  13.         }
    7 L" C$ N* A: Y8 U/ J
  14. . \% @. `! r+ e

  15. 7 O$ v. a' |" J9 Z6 K' R/ y
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);! S' d) f- {( o, [' m1 W
  17. + O# ?5 X6 v# F" B
  18.     }6 U9 K/ b% y1 x  \& T, f
  19.   }
复制代码
' r' o2 I7 I1 G
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
9 A7 G  o* J- J5 _+ W9 R* ?& t0 Q( l; o" k
我们使用HAL_DMA_GetState函数来获取状态。' F! L% T1 _5 e7 L% _4 P
  1. - HAL_DMA_STATE_RESET:复位状态& k1 S6 R* V9 H, r
  2. - HAL_DMA_STATE_READY:就绪状态
    ' P. p0 M5 e. I8 g5 S# o- V5 u, E
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    ) n4 u* ^5 P! B/ `# ]
  4. - HAL_DMA_STATE_TIMEOUT:超时状态) w$ r- T9 {" C. ^5 j- x# H
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
  }5 m8 Q/ ^* O0 a& j/ S, K
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
  Z6 G  F. M) V- u/ UHAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。9 w1 V$ n2 H3 P. L" G0 O. }( W
$ B5 n0 Z) L8 A$ ~  r: G5 Y
微信图片_20240615133330.png 9 I& a6 u4 N. Z) l, V1 ~# S) P# Z
* f% o7 r; U2 \+ f  `. O8 y9 L0 p
这是我们采集的方波信号。
6 a1 ]. M% Q) o/ }" r, Q' R  Y; U

* R. W6 e  [% m( [" n+ n
1 D% V3 j/ @/ D' A" W. U; b
转载自:电路小白1 L5 Z& i- m) w0 ?1 L- T9 G
如有侵权请联系删除1 J9 T; b5 e3 f( N  W* j1 i6 D

# H) R# H* G% c" A4 c( D6 M; \5 B  y1 T1 h& d9 `% S
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

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