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

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

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。6 p+ F: u3 |6 l0 E

0 {7 ~2 r/ d: @$ a3 W( n# k0 i; `
板载运算放大器
. ?) b- C. l: ]& ^8 o板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。& h& J2 X  t: g7 z0 l9 E
& Y5 U+ W1 A& b/ V1 C" b2 p
微信图片_20240525133129.png / P/ P0 A0 V9 V% y6 ~# A+ G, N8 P. A
4 }. J& z( v; a* D* `! n3 f

( N: K+ g) F4 P" b 微信图片_20240525133126.png
# ?7 O0 O  r5 @; ?
1 v/ B5 Y  W  ^我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。- G& `' T' W/ ^1 u6 T: z
  i7 J: F4 f6 B# u
ADC配置
; R" K  ?2 `$ f
/ l4 C( y, ]; G: f 微信图片_20240525133123.png 8 r& O' X' D# l  z% U- ~% `

# f$ [% ~5 x( Z! u" D. F6 G8 X开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。( @0 P7 j# P: w: o# g
  |! p! O7 ?, d; |
微信图片_20240525133120.png & }  ]3 @+ {" F& K2 ^# _$ o

. T4 c: F% {$ `# A添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
$ [! v, V& ]0 v' d8 |8 z$ x0 Y( n
2 L% y( T9 K6 Z8 ^4 O6 ^7 K4 b: h9 s
微信图片_20240525133117.png , |8 W6 }% l4 T  a2 V
" d, t2 W* t# s
触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。
  K, p9 t0 t9 c
9 e* r2 P* @  O
定时器配置+ R. l! j% u4 b9 Z
这里解释一下Timer 8 Trigger Out event.( a9 ~& g7 P! \
( R- R0 x: M4 {9 r8 h9 M$ R/ A
定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
8 Z! Z& W+ ~5 z' s# G' L  t$ A% A+ r$ Z! T* ~) p
在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
% l- ~* ?# M: J  u" Z更新事件(Update Event)
* T; O7 D, M3 X5 v0 _# K- A当定时器的计数器溢出或达到设定的周期值时产生的事件。
2 _: {" H0 s( M  ?3 u捕获/比较事件(Capture/Compare Event)
$ w$ n6 f% d9 Z8 U  F! l6 K: I当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。9 y" D9 T, l0 Q
输出比较事件(Output Compare Event)
0 s+ _( k% {4 d" ~' W当定时器的输出比较单元产生一个输出信号时的事件。
4 G# c9 J9 N  h- j
3 M. H+ }, P. K, V" [0 d) ]9 P

7 A/ I: G9 p) D( N4 p5 w 微信图片_20240525133114.png " H& a, A  W! ]  W6 a

7 h; f! h( M  s这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。
0 G6 Y( f, v  O; ~% }3 |& |! d: s0 |, x5 K& U
我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。9 V  {2 k; e- d  y8 d4 D

# R. P9 Y4 c4 ?( }! m 微信图片_20240525133110.png
# P  }3 ?) P0 _! A* C* ^2 ?" `. O5 M. ~
7 e) N3 Y, R& r; |; A最后别忘记开启相对应中断源的中断。
9 N4 S% U2 N6 R) }, {) p2 L( G' h; ?2 T: m
接着就是创建工程。
: z4 @6 Z7 R, `1 \; R8 q4 \+ S- u" b
  1. #define ADC_Lenth 10243 X! W+ p" m/ T0 k5 i0 s+ g
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
1 d% L* L/ B5 e+ P. K& w0 c

( ]& @' c+ N! ~# g" K5 {- ]
定义一个数组用以充当DMA的缓存区。
, U5 V8 J8 U" w4 E6 r5 k$ R1 c
  1.   while (1): i& r" Q+ a5 l1 g# P- E
  2.   {
    % d- k6 g$ L5 x1 u6 v5 H
  3.     /* USER CODE END WHILE */
    : J8 T' e0 P9 V. b* A7 N: t! r4 I
  4. & ^# L& s2 {2 E
  5.     /* USER CODE BEGIN 3 */* o( L1 ^/ C% h
  6.     // 检查DMA传输是否完成
    $ [" |# ]2 E* p/ H( ?5 B
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
    4 w2 z. q) ?, Y, B, ^  \4 |3 \3 n
  8.     {
    5 F  C7 v4 \& [$ ~5 }; n# F0 S
  9.         // 处理 ADC 数据) t0 |% Z- o  O$ s( L
  10.         for (int i = 0; i < ADC_Lenth; i++)
    & P# y  k# U7 H: d3 S0 J; ^; F, K: Y) t
  11.         {
    ' ]. H3 e, N7 Z! L# s0 G
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);
    ! a0 H; H  Z  @1 X1 B5 A) n
  13.         }& d1 c9 k! d$ U# B
  14.         / f  \. v7 U' e# T
  15.         + a' t9 Z1 @5 y" |9 H
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);: M5 l& k3 v& x, V) _) K
  17.         
    * S1 m5 d5 y2 |
  18.     }+ w9 o( S- z8 m& G
  19.   }
复制代码
& b7 a/ z/ ?1 o$ Z) _
在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。" h9 G. ^& B+ [# ~
% ?: s4 W7 u3 T* C
我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态( i" L3 L3 i, e7 Q) `8 }# ?. f; @
  2. - HAL_DMA_STATE_READY:就绪状态
    2 v- r( g# o! ?* v
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    9 ]* m3 A0 C, e+ y3 y
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    ( e, k; a# V, n; c" l
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于4 `6 z: h. Q+ u$ T' v$ @

- N# r" V8 d9 s) i* |8 }
HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。6 {/ r; I0 d8 W* o3 q0 o% o
. N6 U) e* e: @- d2 b8 c
微信图片_20240525133107.png
- F2 z; g. r, h# e# M& E/ R3 `2 y. ~: s& N& A1 D
这是我们采集的方波信号
# z3 A, O/ e9 S% A0 x7 C& ~2 }
$ S+ W. N2 J: [
2 M( b  S) S' x! x$ Y$ l- F9 W% h
转载自:电路小白
  M) k8 m3 a: C; G5 P3 z如有侵权请联系删除
( }) a% K$ _+ H; A2 `: X

4 j7 R4 C" |! m' c
7 Z4 V' W- V( V* T+ d$ u" s: N

! H4 h( W) p6 G; W! z/ }( a! w) f6 s: p
收藏 评论0 发布时间:2024-5-25 13:31

举报

0个回答

所属标签

相似分享

官网相关资源

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