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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
2 a3 v6 Y/ U: w; S! S/ K8 B
: i& h( P7 U$ a/ u1 D板载运算放大器
; |& g$ F& \8 ^2 n( f# ]板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。  E9 w$ C, L: r% Q7 Y* W

9 p+ o2 U9 O$ b
微信图片_20240615133357.png
) V5 q5 H8 x, r, I" ]$ ^" `8 q
/ c1 @, [. g& A; D* e6 o7 s* x 微信图片_20240615133353.png   S+ B% T9 U2 g* o& f

3 i7 h( ?. N$ M' V我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。' g. d8 b0 Q8 k7 A6 n$ h7 F

. Q# V- o: }% ?, yADC配置
& _) P7 j8 D  y* w3 v4 m; @( B
; W; Q( `8 y8 c4 j+ M; W6 Z
微信图片_20240615133349.png 9 ?( g& q0 m. x$ X
, e8 H; X4 c, p  n
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。' ^3 _+ }+ T' J1 h

( x) H  o- l! c2 R; s) S4 E( a 微信图片_20240615133346.png   {9 b3 L+ f5 J5 h, A
% e) _5 f7 k6 H; U. L! m, J5 o
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。; U) r: G# U- x) ?
, \5 [/ [0 D: g2 C  F2 c6 [% f
微信图片_20240615133343.png * P! U9 ^3 L0 p8 D5 I

' S, o' m$ T7 W3 N# m触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。
5 r) y  I/ G: n: [3 P
( W& W+ g0 P7 L定时器配置
0 t/ a3 j& h6 w! f
这里解释一下Timer 8 Trigger Out event.3 u& [4 E! N, I4 [( X+ P$ u
& Y% O( Y0 N7 y/ ]) j. H& p1 F
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
9 X" @, b, i6 T! R

, G3 n8 a6 `- [% }& m  m$ w4 x在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

" C9 r& \7 {1 k; `) _; \更新事件(Update Event)6 X# ?; o* k6 |3 i
当定时器的计数器溢出或达到设定的周期值时产生的事件。
5 |5 U0 ~8 X4 q捕获/比较事件(Capture/Compare Event); N; h  ]' g  R/ d$ O1 p$ s$ B
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。4 T5 w( P0 W  q$ m6 {9 v  K
输出比较事件(Output Compare Event)
3 E! u/ ~, U" |6 ?当定时器的输出比较单元产生一个输出信号时的事件。
2 \# a- o' C+ Q1 T) M, q
4 T& @* ?! D' b" h' K 微信图片_20240615133339.png 7 C+ ~5 k+ v& P1 d9 _! V2 t, ?# e

9 X! a! s; Q* C* h7 Y) ^+ w6 f0 z这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
4 b1 O+ z' }7 }/ b$ ^" T. u3 d0 h7 N5 j& V8 B; S6 y
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
8 D+ j$ E3 L. e+ ^- r. O

* Z! [$ _7 _, a/ T 微信图片_20240615133333.png " V1 ^( y8 d, V1 I1 v; @: ~+ F
2 F6 _, \2 _  L) r# I' ^
最后别忘记开启相对应中断源的中断。# m; n! q6 x( H( T; l) l7 y; R
7 y* I7 }/ M- N- p
接着就是创建工程。

, B7 \+ Z( y* m5 S2 R; c/ p
  1. #define ADC_Lenth 1024
    # f7 J- R1 o# i* n* M4 ?
  2. int32_t ADC_Value[ADC_Lenth];
复制代码

6 @, R7 P) J# j- ~" G定义一个数组用以充当DMA的缓存区。
" s2 r! k9 }  v
  1. while (1)$ m' K) r& m' j: j+ J) b3 A, L
  2.   {' m$ J% D5 ^& N; e1 p9 N" V8 Y5 ^
  3.     /* USER CODE END WHILE */
    7 X  [/ a% e' W+ d% t" g; I
  4. 0 d3 A4 M! ^, `' W# ~1 }% y4 `
  5.     /* USER CODE BEGIN 3 */, R* w% t' }) ?$ L
  6.     // 检查DMA传输是否完成
    4 e/ q  J1 s: o
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)* s  D4 h: U4 O" H% a& Q! n- i9 g
  8.     {
    ( E' w8 _0 E" U* [3 t
  9.         // 处理 ADC 数据% p! {) f8 v7 x! \% a2 E0 }
  10.         for (int i = 0; i < ADC_Lenth; i++). T0 b* T' g  g" p* T1 n. P
  11.         {
    0 S+ P) I. B- h/ w/ y* t4 g5 _2 Q" n
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);
    0 E3 F7 G9 z! S: o$ z
  13.         }! P3 U3 p, t3 z  p

  14. : q# S5 `+ ]! v" O3 V

  15. " y0 J; M9 o. N8 M& _+ U4 p/ ?
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    8 C7 B3 ^% {" m; X8 t. i0 b

  17. 0 J5 ~1 P) @9 p: b1 x
  18.     }
    - x' S  I8 N1 ]' |4 K
  19.   }
复制代码

6 z4 J+ c; v$ W1 ~在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。; U" @' ]. ]0 P8 S

# N9 n7 X7 q  L9 ^9 i, k我们使用HAL_DMA_GetState函数来获取状态。
% k% N+ x7 S3 J7 U& _
  1. - HAL_DMA_STATE_RESET:复位状态
    4 ^  p# R5 ~' P, j) p" @- R3 o
  2. - HAL_DMA_STATE_READY:就绪状态5 s2 Q, O1 b, U3 i- B( V1 B' n
  3. - HAL_DMA_STATE_BUSY:忙碌状态7 K+ r* V) h4 w$ O6 R
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    * R' d" M7 P1 G4 t! J  @  E
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
' Y' N2 B  D7 w- N
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
+ w5 ]6 S) ~8 T4 K0 _1 @7 f. T6 {HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。& p/ h7 o& M$ p2 s) @5 P7 L

* E: R7 Z: F* c
微信图片_20240615133330.png
1 ?% [& x% i4 U+ q5 u
0 z" {- Q, Q1 s9 n4 i这是我们采集的方波信号。

$ h8 l: u; e6 G* _% v  r9 s6 H
) |& n& \# Z9 k$ G1 f' a, P2 J; N- F' G
4 p* Z6 b& T+ X- y- ~
转载自:电路小白" }$ L, c4 h0 K* S( `  b1 \# E: j. E2 n: J
如有侵权请联系删除6 F+ N, e, W7 D. @4 m8 ~

7 o0 u, N- S- I0 [8 @; x2 H  A. V3 E6 M8 m8 ]# T3 g
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版