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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
- s! a: f5 y2 \6 v2 C
) l, o% a# l# A$ m2 Y  p, h+ ?+ U
板载运算放大器, M0 i! |# m8 s' J: b
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。$ x; e+ g$ S. O, F! Q

, m0 d- r- t6 ~ 微信图片_20240525133129.png . I* r6 r+ D* ^* Q) ?( x% E
* p# a2 T8 ?3 l7 b  m2 L) o

' m; d, |& F: \7 [+ | 微信图片_20240525133126.png 7 F7 s1 o! x0 L; |' y
  ^) R8 w- `" M
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。
/ @# R3 A9 }; u5 n) Y; D7 [" u8 R" b1 Y" u9 f8 i2 @" v% I7 C
ADC配置$ ?$ t0 O9 T- N1 Z+ z
& P6 e3 T! C# a8 `1 H
微信图片_20240525133123.png
# m9 \( S, N1 n% j- i6 B
! g- N% `3 h5 e/ N! f- ^( M% }  S+ e3 K
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。; y( p9 ^7 k0 B* |& @

; C0 f5 F& N( r& a9 {# G" p 微信图片_20240525133120.png
' m5 ?' p- M# B. `# K

1 I' M1 v- V; o& W7 O  Y添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
. A* q" n8 d/ u/ ~4 L( V/ {7 T- h+ g- c9 w
微信图片_20240525133117.png
- C6 b0 O: D9 c0 a  [7 M
2 [2 `: g+ q( r7 D& J: q, O触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。/ z' U. b' n1 V3 ]' P% P4 p$ @
6 k3 f# X9 `0 d' {" X9 j
定时器配置, t5 h5 S8 ?0 k0 D
这里解释一下Timer 8 Trigger Out event.% U0 e) P. H: m6 L1 K* ?- i4 W7 G0 p
& e) I* [  [" ~! ]% Y. f
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
7 n' G/ a) `0 V: j( I+ p; ?( T: P5 n, d& Y$ N
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
. E3 V8 V& h3 o  s* d7 k更新事件(Update Event)0 Z' m7 \# |( }; Q5 }; k
当定时器的计数器溢出或达到设定的周期值时产生的事件。$ i" N" X3 M6 u# ]9 E
捕获/比较事件(Capture/Compare Event)
3 w' l; n1 {8 _5 J1 [当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。9 S5 G. |2 }5 w" w
输出比较事件(Output Compare Event)
0 {4 M; [/ u+ l" J2 b当定时器的输出比较单元产生一个输出信号时的事件。; E) p5 v) ~' u4 S& z. j4 r

/ a) x! u# C* s1 Z
* Y# p: V4 a' S( {* K
微信图片_20240525133114.png 3 t. V2 ~. r# I1 c9 m. d

% U4 D8 m4 \0 A& A这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。8 A4 Z/ I- N% C$ Q! d6 o

' v0 X3 x/ N) M& S% P8 j& e
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
+ b3 ]: u- S8 V  }# q6 C
& T3 P% ?) F* W- w" ^ 微信图片_20240525133110.png . E. _2 |9 \: U4 n8 L

' J& l1 S. ?' a& m0 u9 c最后别忘记开启相对应中断源的中断。' Y- V1 r+ E2 T4 u- c
% d3 |" Z& @3 |
接着就是创建工程。" U: |" ?% }% C0 I0 s7 M$ t
, ^9 g! N# N8 x- y# C
  1. #define ADC_Lenth 1024
    # p: F. u, k" g3 f0 o/ ?
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
( H8 _! K# I6 w3 H* v4 k

$ M2 [. T* B/ w% k1 g& i5 G- U
定义一个数组用以充当DMA的缓存区。
  P% X% r  F8 v: c5 U
  1.   while (1)* W* A- i, A! q+ T! }& E. M
  2.   {4 W' B: f0 z7 K4 n
  3.     /* USER CODE END WHILE */, V# I, C3 E4 I

  4. " _. R: ^. Z) d/ G! C2 D$ m2 U
  5.     /* USER CODE BEGIN 3 */
    8 e3 W+ \+ O: w' Q- f
  6.     // 检查DMA传输是否完成1 _1 \0 M0 [% N! j% j1 C9 q
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)7 B8 _! D) d8 {$ L. X
  8.     {
    & f  {' ]5 B" P: d; D# W1 t- H. s
  9.         // 处理 ADC 数据' y9 i, k/ G6 u" A4 U0 L
  10.         for (int i = 0; i < ADC_Lenth; i++). B) v% L6 @% B4 s" N
  11.         {
    3 |0 A. y% I6 N2 \8 D) R
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);" X1 m3 l3 B" M9 |$ |
  13.         }
    2 ?, s1 T' p) m+ K9 l3 v7 _: y
  14.         - }& Z9 k% m" s2 l" z
  15.         
    # \  ^7 W* s, G
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);/ P7 f8 c8 O! w- t6 s* Y
  17.         1 B+ h8 s0 B4 q% N, B4 j# D
  18.     }
    $ P+ y4 a- P& w9 @# e+ Y
  19.   }
复制代码
/ i* {( c8 ?2 B$ y9 x+ b/ p
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
$ l( w* q7 m3 ?4 }/ ?  v/ O9 V2 r
我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态
    ; O' b/ y( t2 N
  2. - HAL_DMA_STATE_READY:就绪状态
    : N( M: c, D6 Z+ P% }: [
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    - L7 G+ P/ U1 J. w2 G
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    2 i# F& _, ?: F# ~) M( [
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
6 D$ _9 ?, l, c1 G; A2 ^) u& [4 n+ R. e, Y6 @  \' x
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
) e" n8 I- a" S3 }/ Z1 t9 L
- o3 T8 i1 Z- |9 v/ a7 E: f8 Q8 `
微信图片_20240525133107.png ) u3 ]+ |( E/ h8 \# ]2 K
9 w3 Y1 _7 S! p) s
这是我们采集的方波信号
3 D2 N5 T* U- D5 B( V
) f$ n( u/ F, F) _7 q6 G
7 o7 m4 _) v, R, v! O* b# f1 L
转载自:电路小白
  G7 g4 q, P& _. l如有侵权请联系删除. M5 Q, z7 t1 C0 A! S/ B
/ Z6 [" P- K5 n# e' d" g0 ]
  F) N9 P- u3 v8 y7 K* F1 j) @
+ p9 _7 g) n% ~' Z3 M; f

5 L) A2 A( \  B  q, g/ h
收藏 评论0 发布时间:2024-5-25 13:31

举报

0个回答

所属标签

相似分享

官网相关资源

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