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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 13:34
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。
2 d5 _* c" T. t$ h' Y9 [: N) ~( ?7 a/ N* `5 t9 ~' S4 b" u
板载运算放大器
2 N& [2 D5 N7 A: a7 X& M板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。2 b1 v: P" a: z( U2 }: a
0 Y( W9 }( x; R9 B  K
微信图片_20240615133357.png
% p0 M4 c$ N  g% G& |5 H
6 }1 x- l+ F1 c5 ` 微信图片_20240615133353.png / v# ]: C# ?9 _) M
9 ?0 S, Y, W% v2 ^+ j. X
我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。
+ G4 l+ ]2 n% v! e/ i
( r* x( q0 I9 |  t6 ^ADC配置

% c/ ^$ W, s- Z9 V5 u* {* P, `$ j7 O( n0 W
微信图片_20240615133349.png
0 {1 T8 `6 k% `% f1 U2 E6 R: r! B+ J* X! n% ?: O
开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。2 \+ ^! y0 u$ X, S8 F: j
- M! ?4 u2 r; n3 f1 u; t
微信图片_20240615133346.png
. Q: W5 s/ O6 b, i+ t- g$ P0 X3 e
添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。
/ u) f) T1 e% J3 `& |5 G
6 m# h5 p# S" _' z 微信图片_20240615133343.png
/ {' n$ Y8 a. m0 x) k
2 v+ W  j9 C9 f* i触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。- t  v* L& V: L# B0 j
. c5 ]8 h) }/ n/ d
定时器配置

# z4 c4 `- G# e" R4 n- f) d这里解释一下Timer 8 Trigger Out event.* u9 {& B2 Q: R" Q9 |

' Q. x; S& V8 n3 h( S定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。
" K7 f! t% ^4 N4 c

8 m+ T1 j- b$ {) d& ^在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
; }* `7 i% c! D  P, b/ ?% B
更新事件(Update Event)8 d% B) y2 _- s3 u$ i! `
当定时器的计数器溢出或达到设定的周期值时产生的事件。" f. j1 f& M% W9 d& h8 @) k' N
捕获/比较事件(Capture/Compare Event)5 u# g3 R* m$ ^0 X% q
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
- S/ X( n$ I* u& x2 {; O! H输出比较事件(Output Compare Event)* j% C+ [( t5 l8 ^: m. j
当定时器的输出比较单元产生一个输出信号时的事件。
2 S6 Y3 ]4 m% l! ?7 m+ a! {" a" n: b* z( i. u
微信图片_20240615133339.png
1 r  J# G4 ~# `# P' i2 r: S, [2 z$ j& X/ K6 W, H8 t. t
这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。/ |5 o5 Y5 r9 y: P- L/ L3 U' _

* d) u* V' a/ B7 R; W8 w0 U; j我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。
9 k2 o5 _6 }0 U

3 O) {& v: }3 x- I 微信图片_20240615133333.png ' X: u7 n8 I" a1 c' Y+ s
. ]1 z% _; ]" G. X, v, L/ G
最后别忘记开启相对应中断源的中断。
) n% m0 P( Y2 e: l# _9 S) w# Z/ x% h8 }2 G7 b
接着就是创建工程。
# R- \# I# Q, {1 B3 I/ r
  1. #define ADC_Lenth 1024, ^8 D9 U8 l3 M! t( s
  2. int32_t ADC_Value[ADC_Lenth];
复制代码
! D' ]1 s. l0 \0 h1 \3 w- q9 P
定义一个数组用以充当DMA的缓存区。
/ r1 p3 \4 V) C7 j5 j/ U' p
  1. while (1)
    ( g$ p6 f, f9 W& i
  2.   {
    ; r$ |8 I, C, m4 h' `7 l; [0 U+ A
  3.     /* USER CODE END WHILE */  O, K( j8 r$ J  E# g/ D' @1 m/ h

  4. " Z* k2 ~0 S, q4 ^6 a: D
  5.     /* USER CODE BEGIN 3 */0 f. D/ m2 f1 [+ x* [8 n( n
  6.     // 检查DMA传输是否完成0 b0 H7 Y8 P- H
  7.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)  p8 g; O% `! u+ o- F3 [7 x% g
  8.     {  i' G( F/ @+ f  N
  9.         // 处理 ADC 数据
    ( h: N, J  H# z
  10.         for (int i = 0; i < ADC_Lenth; i++)/ }; }$ S2 g3 E# `+ c3 M
  11.         {
    / N( m. B8 N1 j+ R
  12.            printf("A:%d\r\n", (uint16_t)ADC_Value);
    / R& {$ z- J/ {( U
  13.         }
    * @1 J1 A! b0 e8 B6 W
  14. - A* u4 ]& W/ z' i& m$ F

  15. 1 x2 c) g: S; h2 V9 C! s" B5 J
  16.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
    * C, H: S7 w- n4 u4 Y+ t
  17. 3 I- u5 {% v  ]
  18.     }
    / Z7 w, |9 x& x7 y
  19.   }
复制代码

! _: f9 T; H8 {" F" m0 Y在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。
5 N- Q% m5 a$ u0 W$ B5 B
# `  U( `; Q% d  o7 s我们使用HAL_DMA_GetState函数来获取状态。
) V& q& ?+ o2 l" I
  1. - HAL_DMA_STATE_RESET:复位状态# w9 Q1 v$ q3 u
  2. - HAL_DMA_STATE_READY:就绪状态
    ) W) _1 E8 ?- T! e$ o
  3. - HAL_DMA_STATE_BUSY:忙碌状态
    ' j, R2 f: H) F/ S2 ^
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
    0 k* _. }) z. j4 }/ m" M
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
$ d9 w9 ^* r' S( h& e6 R7 s' r  o+ T$ A
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于
1 z5 T/ Z6 {" l9 x( ]! w0 LHAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。7 s' r4 i( V/ S# `' E7 D

( l$ ?4 {7 v  p4 i
微信图片_20240615133330.png 2 X; X! j% I: a! |
3 j( F" G# ]. ^) m
这是我们采集的方波信号。

& W( w2 e' t6 o$ e& ~$ g- x- q/ G6 t2 P# z
3 B3 Z* k9 U2 R5 P. T6 m  S
转载自:电路小白
9 V# L* f. F) L  _* F如有侵权请联系删除
: v" M& V$ p2 l( E" h9 F9 S. P% _% l6 y6 m
$ t8 M) ~: x% m
收藏 评论0 发布时间:2024-6-15 13:34

举报

0个回答

所属标签

相似分享

官网相关资源

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