请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
# V, M2 S) b+ P  ?7 M6 N* H" ?6 _0 p. s8 z, l) a" n5 y4 D2 ^
板载运算放大器
- F& N. Y+ \" B% D' Z板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。
- u0 u* o+ g! s$ V0 P. _4 ^
& B/ K- z% P5 Q% B# k$ s' v, } 微信图片_20240525133129.png 2 {" m: T, L8 b* X2 I: A! ?$ m) G
8 o- E$ @/ F1 k

& p2 E- s9 o2 I( W! e! {0 V 微信图片_20240525133126.png 2 Z/ x# [- v$ a& i9 r. _, N# r
5 W! ?5 _( G5 b& i& u$ H0 |  W+ X
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。% X) F5 `( s( J' k$ N/ Z9 q9 l+ K* V

' a* L8 M0 z/ M4 ^8 J2 i
ADC配置% ~! ]% }/ T2 ~* I
% r/ r* w$ Y/ H+ V; `. D
微信图片_20240525133123.png
! L/ G- E( W+ x
- ?( ^5 g, ?" X6 {2 w
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。5 S; q/ v+ u4 x" z4 X
% ~6 n, n9 R4 v/ \- W5 W$ j" J
微信图片_20240525133120.png
( R. n) ~$ S9 }* X

& H. ]6 z# `$ W添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。: d9 ?6 I( G. J1 i# O; ?* \+ s

4 P$ O# c' M. x4 R5 V
微信图片_20240525133117.png 6 k0 O8 X) Z  |! X

9 [& x, I; J2 q0 b7 v, ]$ b! s触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。; {) ]" j6 N- D9 C! }

/ z* V4 ?+ s: G/ u0 v. k
定时器配置
0 Z' i$ c5 T1 n8 s* e5 X0 k这里解释一下Timer 8 Trigger Out event.# W* k9 q( }% f
( U4 j% Z% Q9 c* i) w9 _% W
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。. o9 F& T2 M# d2 ]

5 B  x, {, i) E8 ~+ i
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
: U' \/ L8 n" w更新事件(Update Event)% u& _: D5 z; s& y
当定时器的计数器溢出或达到设定的周期值时产生的事件。) K6 z: ]* F1 R/ K8 V
捕获/比较事件(Capture/Compare Event)
. K. g7 [/ B5 ]1 q4 J! Y2 ^当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。* {$ W) y2 [0 f5 d$ C& X# p6 t, J
输出比较事件(Output Compare Event)
/ ~" a" }" y0 D. B当定时器的输出比较单元产生一个输出信号时的事件。
. m  z& R0 j  m7 V# q/ @! E$ ^# A6 _4 r

* Z8 O- T" l1 t1 Q& y+ ` 微信图片_20240525133114.png
8 F# ^  s+ D) v% C! k6 V3 H. U' M

3 o6 C( U& h/ c+ s8 m; n" r  Z这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
/ K" y. y! t4 _, O1 \: Y5 R( E" q# E0 F. V
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。! ^  E$ u1 d; P' N  n3 w1 d) k

$ z* y; R" {; B1 k/ b# T6 v; G 微信图片_20240525133110.png
2 m: W( I8 Z( u6 K7 [# _6 u! w* B/ P% G- m) \* X: t+ N
最后别忘记开启相对应中断源的中断。
6 J/ p9 w7 G3 h7 V4 s, _
' s5 Q2 L1 z. d9 O
接着就是创建工程。
( ?2 Y3 W; p# n
0 F& f, k( h( N' A6 t
  1. #define ADC_Lenth 1024
    % N9 v  [5 O# q- N: y
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
9 ?3 i8 C0 d& A7 {2 R# t
, B+ j; F. z6 t( A9 m  d
定义一个数组用以充当DMA的缓存区。3 F$ r$ t4 w; W! ]& B, Z
  1.   while (1)% F1 V( `" ~9 m9 I2 }$ J% @
  2.   {
    $ P5 y' O* ~& e2 N
  3.     /* USER CODE END WHILE */" U, |( |  f: {

  4. + J, o( A& d7 {+ N
  5.     /* USER CODE BEGIN 3 */+ w) T$ k8 r& S* s& }0 G2 ]
  6.     // 检查DMA传输是否完成% I; ?+ u7 N) E3 U% S+ B9 p
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
    . K+ k+ `8 x0 T
  8.     {
    & _$ T: M) c: w, l5 Q# X- J
  9.         // 处理 ADC 数据
    0 A6 j4 s' N& N4 L- n) A
  10.         for (int i = 0; i < ADC_Lenth; i++)6 m/ \1 H. s) V- E
  11.         {2 t% J6 @# p1 }& \  W
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);
    & i2 e- N. H$ j. q( w/ X2 Y5 I
  13.         }1 n0 c) o& Y; k
  14.         $ Q6 T; K$ m6 \: j+ v
  15.         6 T( J# @( x4 Q, g3 ?
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);( O2 z7 j* U2 R
  17.         3 o& }# L7 Z- t  ~1 i7 e
  18.     }! c6 ?5 p& X3 R
  19.   }
复制代码
$ u' M4 b6 _3 c1 q% {4 u4 X
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
1 v* J# e$ j3 v  Y! _4 i' A2 n9 y4 Y
我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态, [, c# I. G5 K; f
  2. - HAL_DMA_STATE_READY:就绪状态- g! q# m$ u% R- n  w8 `
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    - r" s% W5 q" v" |  U8 U' \$ Y# ~
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    3 Q, e' \# S! N5 ^
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于; Z# O6 e: R0 u* b
5 Q4 i" L8 F; X: h# J5 [  A" T8 r0 L
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
) {) n& Y' h% l+ c$ y" _- L
! q6 K# O4 o4 M  k7 L2 d- z% n
微信图片_20240525133107.png
6 [3 K* x3 @! p+ ^; t+ e, i  p! B$ D  O- N, P& `; h
这是我们采集的方波信号
; V1 l2 j% P' A
2 D6 Y% n9 W" l! r
9 w# a( n6 t0 u' |: b* Y
转载自:电路小白
9 Z7 o( s' Z$ Q8 Y4 M; P如有侵权请联系删除
6 t( d2 g  p* {6 f! Q$ I. n

4 A- P+ ^$ U$ z+ f" C& ~+ }" D$ t% q$ W9 Q3 n5 a. @3 n

2 E  @- {  K6 Y* t8 x- Y* F  d; j; b6 ~" {
收藏 评论0 发布时间:2024-5-25 13:31

举报

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