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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。/ I+ Z$ I1 ^2 q% m7 b

4 I3 V( k' T/ ~( S$ {- M" L+ H& q板载运算放大器; C+ T. j7 ^% ?
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
+ ]( ^" E. a2 k! P
& f0 ?3 u9 d% i, u$ A
微信图片_20240615133357.png
$ ?/ U0 I* ]. p6 ?
* `% Q+ R( [, o5 q1 H$ } 微信图片_20240615133353.png + M; W) c4 ]0 P) V- ~

4 |: M) E9 B5 @4 |1 v我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。$ A7 p/ @6 t( t9 Y: H

6 u2 `4 ?7 Z+ y# _& f* dADC配置

% ?3 |' O" E  D/ b: u& Y9 B! }4 k3 ^3 |( ]8 \- Z" @( {2 c
微信图片_20240615133349.png ; T; _' D  {1 o6 U. c3 l
+ T) Q* E8 k+ X
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。$ \: ?5 E5 O, ~0 Y0 P

7 b* Z3 h: h* _' ~! i  Q5 A! Q: K 微信图片_20240615133346.png # k# y, w( [7 i, ], l# k
- N3 `- q: G6 m2 s
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
& }' N3 O  n; Q" {9 H" Q2 Y7 Q3 ]' ~; a9 M# t$ ]: i
微信图片_20240615133343.png 1 `) w  o% R# O) {. h

8 l; C3 n% M) @! ~* d$ O触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。% Z) d# R. m7 v5 W4 P8 }

- v' j, j8 M9 l  g$ _8 g/ f, R定时器配置

+ P" e5 ?3 [2 d) b/ Z: w+ i这里解释一下Timer 8 Trigger Out event.
: {) o3 U1 U$ z! o+ Y+ i  v, M: V( @7 t8 o4 y4 M
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。

' J7 j: k- C& B( @, u# o3 ~  l3 B4 \1 m* }
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
0 i& K3 h5 @: n7 T* [8 ?4 y! t5 ?
更新事件(Update Event)
  r% }4 v. h0 B* G3 _当定时器的计数器溢出或达到设定的周期值时产生的事件。
; n3 \% K; }$ j: k捕获/比较事件(Capture/Compare Event)+ b4 g- x& v6 N7 O& z# m" ?, J$ O+ O
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
3 b, e6 m# }  v6 R" N9 C; h输出比较事件(Output Compare Event)1 O. ^2 z7 B$ q
当定时器的输出比较单元产生一个输出信号时的事件。
# p# ]3 u2 n7 v" d: L$ q& e1 I
( r5 W6 i. @5 f 微信图片_20240615133339.png 9 _/ {! Q: a" @4 g0 R) _3 P
5 B: U- K, H' P. I8 U/ F" G. v0 N: A
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。' B3 t0 {9 U4 i; M
+ a- m0 |2 M% e" G" X  ~
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

+ ?  u( Y, p4 \, l2 w: G6 v, y3 b  r) _
微信图片_20240615133333.png
' H/ E/ @- t$ h2 B! r: T9 N
. Q4 K6 W+ w8 r0 {最后别忘记开启相对应中断源的中断。& G! Z$ w2 z" `" D9 \
$ j) {" Q9 n2 S! K
接着就是创建工程。

; R! I+ m' u& V3 N* s5 c' L' X2 U
  1. #define ADC_Lenth 10244 s  c( Z- {# T- H7 P% L* q- |
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
. B9 j6 h$ l; B$ a
定义一个数组用以充当DMA的缓存区。! X3 O$ _# O* j% l9 {
  1. while (1)
    + y% q" _# ]- G7 n7 u6 n) q
  2.   {
    0 ^4 l# ^3 O- w. J- h. T& k
  3.     /* USER CODE END WHILE */
    . d" V3 p: C, ^  Z% j: R

  4. % }7 Q. m. u1 D9 j4 d
  5.     /* USER CODE BEGIN 3 */
    4 V) m+ ?# F: [: L3 H# e
  6.     // 检查DMA传输是否完成
    ' J+ P5 g% b; N. U
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)0 p& ]+ A- a4 p* r& J* E2 H
  8.     {
      z& `  g! b0 i2 {% \
  9.         // 处理 ADC 数据" |$ D' j5 X: h7 ^, V% B0 w  W
  10.         for (int i = 0; i < ADC_Lenth; i++)9 b( _, M; ]2 r2 G$ Z1 {# N. x8 |
  11.         {
    ' N6 U7 o# \; Y
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);4 V2 T  O+ [  x$ t
  13.         }1 k; e$ z' g( \" [9 w  l

  14. 3 ?/ }8 _" x& y0 Y$ y" t# |7 A, j

  15. % ^  |, {/ F: A  c) R- ~; R
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    ' g5 [- B9 t4 p1 y+ W. u6 ^& U

  17. # c% `" h7 c7 t, U3 t# G1 d- z) V
  18.     }* l; b# J- C9 `6 n+ A# s# b
  19.   }
复制代码
2 S) m+ a# D+ R9 w& A( T4 Z7 M
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。2 D% N0 L5 D# j% Z( @5 @7 S7 X

2 z& T, F+ n# r3 F* O我们使用HAL_DMA_GetState函数来获取状态。+ }" s# d; q/ V$ n
  1. - HAL_DMA_STATE_RESET:复位状态& n" ^; h! m  `3 E: X% e. L
  2. - HAL_DMA_STATE_READY:就绪状态! Z# x4 w' U' H- N: _
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    0 I. f7 u* s! O/ E7 Y0 @
  4. - HAL_DMA_STATE_TIMEOUT:超时状态- _1 l# q; L0 A# @( M' u  N9 k
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

4 E3 K) d, W/ |8 H6 z$ W) G当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于" j/ v% Y8 k5 [5 o. K
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。+ F% }/ N  Y* l' J9 G
& u* O4 K; \5 ?
微信图片_20240615133330.png 8 ^2 c* x7 e% S' m  ?
2 K- R# Y/ j' I7 _1 x
这是我们采集的方波信号。
, {  ^3 D. b' ^$ L

4 l; m2 \2 \7 S7 T4 P" }

5 ?6 z  E( {6 P# _0 ~" `! `转载自:电路小白; ]2 k- f8 U2 c3 R1 `
如有侵权请联系删除5 B7 B* k7 n( \' ^* ^3 b) I1 N
7 z9 v2 X" F* d1 F+ m6 p
) u5 M# v9 y; P; G
收藏 评论0 发布时间:2024-6-15 13:34

举报

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