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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。1 u/ }* j( F" p3 _( w5 G: X! o
7 p; [4 c* M; V9 u4 c0 Q( M
板载运算放大器' R/ m2 B5 W* W9 C9 l) M* j. O4 z6 z" K
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。4 O7 Y6 r: N6 y

1 i/ N* f8 I" s" e) Z) \' b
微信图片_20240615133357.png 4 U0 w- J: Z" |( a) I
# M/ `% m0 s6 ~& s, u; ~
微信图片_20240615133353.png
" U% P& z9 V* f. i) r  d
( }0 h- u2 p( u我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。2 K' h% f3 j8 k3 v) \, J! V% D

: u6 q2 ^% d+ x' t2 ?ADC配置

' q" l! U1 b9 ]
" _  M) t6 A- B2 Z 微信图片_20240615133349.png
; [/ U2 z1 W% l% W
$ K6 P& q7 z: t& r- D% _开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。8 _6 N4 ]. ]( X% B, A3 a9 ?

: f7 F% y- t! Y: q8 ]; W+ S 微信图片_20240615133346.png : d$ g  {1 F# L) L
7 Z% A! _. w+ `' a
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
! R0 x" u. J" z  I9 `4 O4 q/ R% \% u( s. L" ?0 O: p& y% F
微信图片_20240615133343.png
  B2 q% j1 L% \/ n. l# W
) [7 e8 d+ v  A触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。1 b4 y5 e, l6 U# k0 {
- V% ?9 A' S8 l1 z4 I4 u) }
定时器配置

8 N/ L& ]$ }+ M这里解释一下Timer 8 Trigger Out event.$ |1 v3 w9 s/ t! _6 l% ]

% T) k' R: }: ]2 y9 U定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
! `+ u5 Q& e5 C0 W

3 {: ]+ k- Z3 G& N在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:

6 m' \: ~. a1 |. X, _+ T更新事件(Update Event)' B' W& t0 R  p* _3 z/ }: N
当定时器的计数器溢出或达到设定的周期值时产生的事件。
8 P$ H: |, a$ }4 c7 e捕获/比较事件(Capture/Compare Event)$ f$ K* k/ u0 J- ~6 m
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
$ i9 Z& D# |# r' ]3 W% |/ L输出比较事件(Output Compare Event)
( N" ~: Z2 {: i, O( Z. P4 B6 p7 t当定时器的输出比较单元产生一个输出信号时的事件。
$ [+ Z( l% i% @  A8 t8 q$ r
- m2 n) [' U& T& o 微信图片_20240615133339.png 6 n# v3 u9 w4 P: v

. @8 z" I  p( _5 o1 c这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
9 `  p# d  d4 G  |
) M- W. e2 _; p' J/ G- W( Z我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

( F% F. g3 s3 t  K6 @* e. T! z/ U9 C# T# W8 q9 h
微信图片_20240615133333.png 2 x' W8 z' D/ W0 s$ u* W
. g, B2 [% j2 j% {& o
最后别忘记开启相对应中断源的中断。
: y' S" e6 Q2 E; X! g6 N, z* U/ l3 i  y& _' N- D2 M" p4 Y
接着就是创建工程。

& y# s1 p- V0 C' x+ F% [! m+ s
  1. #define ADC_Lenth 10243 \. g1 k0 f- ^
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
+ s6 R0 J8 c, A7 @3 d
定义一个数组用以充当DMA的缓存区。
4 Z+ p) f5 N- o1 f& @
  1. while (1)
    / Q0 \4 N2 g9 H! A
  2.   {
    $ t$ P& S3 a3 Y( _- L# i
  3.     /* USER CODE END WHILE */3 U& m4 ^' N3 F5 W9 j4 b) v  s

  4. + w8 e8 w) b8 s* K  s
  5.     /* USER CODE BEGIN 3 */
    6 s: A! X) d- U7 i2 f0 E3 m
  6.     // 检查DMA传输是否完成
    2 N; j: ~! c5 {
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)  h; A6 h6 G; j- R
  8.     {" H) n8 L) |: L) q7 z) Q/ M
  9.         // 处理 ADC 数据: p7 z& R9 o( Y2 y0 ]
  10.         for (int i = 0; i < ADC_Lenth; i++)
    " S. Z; r5 B8 C- q# {
  11.         {
    * C% i- X& i& _% S4 |
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);7 P' u/ i, C" ~: Y2 u# M) s# B2 |
  13.         }
    0 g+ g7 `' O6 B- o

  14. : B7 c* R8 e8 F, m' G! n
  15. 3 J4 p, y: {+ G
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
      y4 Y1 U4 J9 y7 x6 M: j$ f" x

  17. 8 D' k! `& w) [% T
  18.     }; @: B3 L! n" a- R
  19.   }
复制代码
8 O9 Y3 [. S' y+ z
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
9 Z1 p% m: F6 j+ @2 D! \8 \2 M4 y' S% [9 ~  A" A
我们使用HAL_DMA_GetState函数来获取状态。
- e2 F6 X, c2 R$ _8 W8 ?
  1. - HAL_DMA_STATE_RESET:复位状态; ]2 F) ~* ^1 G! X! a, H4 {; |0 J
  2. - HAL_DMA_STATE_READY:就绪状态
    + i& Y) s+ s: r: N$ o+ X
  3. - HAL_DMA_STATE_BUSY:忙碌状态1 ~% ^) l) x' A2 I# }; c+ d
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    0 r. N( I, n& @5 D6 w4 [
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码

- T: B3 @) b$ m当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
$ g' Z2 D2 W1 _" SHAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。
6 G8 o1 ]" y( d# R' m2 ]' i0 u0 P0 Q' T+ G
微信图片_20240615133330.png ' u$ w+ @+ j: W1 K, i  ~

' l3 _: ?* m( t这是我们采集的方波信号。

/ S2 z6 n. z& A+ ^8 u5 l5 l6 D6 D- U) u8 o  s0 |! t
' K$ A/ p! w9 f# W8 O: Y7 o
转载自:电路小白' T. D  m2 ^4 B# \  ^
如有侵权请联系删除6 ]* e. c: P$ W
& x4 c4 Q" n& C' s# p1 Y& w
; b) v$ M) L: g7 }
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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