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

STM32ADC同步采样

[复制链接]
STMCU小助手 发布时间:2022-11-1 17:19
本文主要讲解如何实现STM32ADC同步采样。* J2 a+ F: ?) x% |' V
7 T; E* C5 U! s8 ^6 z
所需工具:+ u% R# K5 \+ l( t; I: c1 @0 m
开发板:STM32F103RCT6# Q- P2 ~: H" b8 o
STM32CubeMX
% o  Z2 Z8 }2 oIDE: Keil-MDK
. F5 H% K6 O* q' x+ L# E7 Z5 v& P: Z模式简介6 [- v. l: g! Q
同步采样可以让两、三个ADC同时对各自的待测信号进行采样,这样就可以保留住两个信号之间的相位差。在相频分析中极具应用价值。, Y& M- H) q5 Q" h( }
/ U* |) W/ i' y" b
实现方式1; e" o' R: r/ M. H+ g
STM32的ADC自带同步模式,这种方式配置有些复杂,信号处理的也不直接。已有现成的教程了,写的不错,我就不重复造轮子了。1 ?; g1 A0 E5 ?% P! [5 ?
% d2 ^$ w, F, u! l! O( n
实现方式2
& a* V4 R4 s+ b& u# ?- q这种方式的核心思想非常简单,可是网上却没有发现有人写。以两个ADC的同步为例,就是ADC1、ADC3分别进行交流采样,触发源选择同一个定时器。这样在编程时,先开启两个ADC采样,再开启定时器触发,就可以实现同步采样了。
* [- k. h4 S- g( C% _
" T  {4 e8 c7 T5 }- B是不是非常简单?如果有思路了就不用往下看了。下面是具体的实现过程,能看这篇文章,说明你已经会基础的ADC采集交流、建立工程等操作了,一些细节我就不再赘述。(不会的话可以参考我的相关博客,写了我好久,非常非常详细)
9 _- [& V2 A( \4 @
1 H/ u+ }! `& E8 T5 YSTM32F103RCT6的ADC2不支持DMA,所以我只能演示ADC1、ADC3的同步。对于其他型号比如F4,H7就可以实现三个ADC同步了。不过电赛用不到3个同步,两个就够。
/ \4 Y8 B: W$ s3 k  ^5 \
& B& [3 h0 y7 ]6 A8 l原理讲解

6 l: g, A/ `4 Q0 m' l, u两个ADC选择同样的触发源,这样当触发源发出触发信号时,两个ADC同时接收到触发,同时开始采样。. \2 \2 U, O, f+ U. X% i: ]  S
( F* {# s/ F9 d7 a2 k
e436aaa71abb155999ee8a38802f5a73.png . l$ P& e0 [7 }

; A: e, i6 _4 ?% V* P' i0 S7 p( w9 k6 _8 I: T3 g" _
工程建立
9 j' r, e* p- R/ Y1 Z) n4 WADC1的配置

0 h% j9 ^4 S8 j! b3 }+ J7 s2 o% ^/ F5 k# D  B; K
22d95a7fb52d996bcb1dd0c02929ac1c.png 3 ?* v! ~4 o" o4 j

6 w9 I2 f- z7 ~, j1 H) e! R% z ffcde181d695839859ee704084af47f2.png
7 b- U, q! y* G" Z( t6 f6 j7 ^+ v+ l5 O  `% l2 R& g7 b7 B6 }7 S3 D
ADC2的配置0 J' {- V+ o" R0 d
, }% D4 m5 h! D
196088b1ff44a026af9069de90487782.png
% t9 R) A8 q" z( [* Y
! B3 E; J2 S/ R6 H
3 z: g: d+ ~0 ~
; h; _% A1 g' _0 d  K定时器配置6 W) R& U' ~9 j' i" i

- i  N8 x6 E# q2 \& q7 d6 |, E8 D
d260d8ce7b35f27e8f377ba9d8290399.png
$ w, ]& e4 x! J1 d7 e/ C( j; O8 a* F4 L. D, y  |; Q/ E8 D
代码编写

0 p3 N4 t# E* Z3 `8 y/ b/ d& G& j& E& ]: @% D- q; X
69406e153dd4d32f312e07e6fa180fca.png
3 n% C. J! O/ D7 P8 X
  o0 q$ U1 d' @5 Q! Y
  1. #define SAMP_NUM 1024 //采样点数
    ' a6 J# e  i; H9 n) Z& I
  2. & e& G' ~- p6 c2 F# D
  3. uint16_t ADC1_BUFF_16[SAMP_NUM]; // ADC1的数据缓冲区
    / b6 x* n# p' Z7 A
  4. uint16_t ADC3_BUFF_16[SAMP_NUM]; // ADC1的数据缓冲区2 l; K7 k* `1 h' d3 n1 \) e+ x

  5.   J1 B/ R6 w, Y$ I: W! F. g
  6. __IO uint8_t ADC_con_flag = 0;//ADC采集完成标志
复制代码

% Z  m7 b( n# u& T+ n$ a0 ~和单个ADC采集交流一样。1 B% O8 j( {  v# g$ U7 u  ]

$ e( A. n  S# S; @2 b% K5 C! b 75904bd1bd618208df1313d57a990706.png
1 D4 `: _$ E' ?7 R2 x6 n+ z0 _8 n
  1. HAL_ADCEx_Calibration_Start(&hadc1); // AD校准,f4不支持2 I; j) W$ ~) |9 ^6 f9 g
  2. HAL_ADCEx_Calibration_Start(&hadc3); // AD校准,f4不支持
    / J. ~* H4 ?9 F+ g! W, C+ K

  3. 9 C, U9 M4 D* l
  4. HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_BUFF_16, SAMP_NUM);/ A4 W% C8 b0 J7 }" T
  5. HAL_ADC_Start_DMA(&hadc3, (uint32_t *)ADC3_BUFF_16, SAMP_NUM);
    & Y" R( B3 r# k
  6. / v! n7 ~  \0 Y" Y: ^+ }& s: D: u
  7. HAL_TIM_Base_Start(&htim8);//一定要在ADC开启后在开启触发
复制代码

0 _% D/ d0 \7 b+ u# j! ]8 o+ H可以分为下面两步走,顺序不能乱。
3 ~$ \) }" X1 }( l4 c# D, cADC开启采样$ r+ \. x+ T7 u  p
开启定时器1 c7 I& ^# ~: \7 B# ~, O2 B- F6 N
6 Y" @) r; T: s% P4 i' N0 k
一定要注意这样顺序,因为两个ADC是分别开启的,开启的时间有先后,先开启ADC采样,因为定时器没开,就没有触发信号来触发ADC采样,这样两个ADC都在等待定时器没有开采。
# ]# E6 `; X7 w4 ~$ n
! O1 z2 i  c/ Q5 k  @5 G. {* V7 W如果先开启定时器,也就是这样编写代码
! d) ~) U; J7 `
( c4 a' S9 p; w, r f65cb2f14063941386a3e87f89a604cf.png
. c- E8 \3 h9 F9 d  W# Z/ u, j6 y, @0 u: H* D
因为ADC开启顺序不一样,当ADC1开启后,立马开始采样,这个时候ADC3正在开启,前面的个点就不在同步了。
2 r& z5 N. f6 Z: y8 u7 K$ u
, s* B: l2 f6 h0 N+ u" o; i; ? 8c32efe6862b6e5f1383c17a2d894aa3.png - Z" N. B, ?; ~* L+ Y, O1 |. r
+ S1 `' p! V* W0 E
88f00e7b4d6719fab7658afd698ff487.png
7 I% p' R, l) v7 v
3 W! g# Q4 v4 m$ i. G
  1. extern uint8_t ADC_con_flag;
    5 K( B, Y5 X6 w7 x: |
  2. - _& n: z' ?6 _1 l6 q! |) Q9 O
  3. ADC_con_flag = 1;
复制代码

, D6 r) R0 [5 h! m$ Q( L( [因为ADC1和ADC3是同时采集完成的。所以只需要在其中任意一个ADC的DMA的采集完成中断位置把标志位置一表示采集完成即可。我这里选择的是ADC1的DMA中断。
, P' Y4 ?& R  E0 i0 ^0 Y
. s% d: [7 e* J, k3 B+ b3 v% h& Y同步采样的作用2 M' T, }" ?3 s4 k( D+ O4 \- x8 D
萌新宝宝第一次听到同步采样会有些懵。下面我来介绍下这个模式有什么作用。
& ~4 j- ?) ^. I% P/ f- e1 e. H! O; Z7 m2 m& U1 c3 L0 ]+ X
很多电路系统都有一套属于自己的幅频和相频曲线,这点在电分、模电等课本中都有提到,已经是常客了。
, f& L; |" ~6 ~* v
3 d# ~% a$ p' ?4 }我们测量幅频的时候比较简单,测量不同频率下输入信号幅度,再测量输出信号的幅度,两个幅度一比就是幅频曲线。" I8 e, D( u  S3 h! h5 k, [

  F1 e: B+ f1 ~; p- T$ H相位呢则是对比输入输出信号的相位差来计算。输入信号的相位每一个时刻去测量都是不一样的。前1ms还是0°。后一1ms就是45°了。但是输入与输出信号的相位差是固定的。
$ ~9 C# m9 g3 s  E! y0 V8 `1 Z* b' {2 p; ~& r- B( V; W) a
79174b869120f4f4f0a8ae1ec7a159be.png
( o, A8 k* r& z- R/ w" [+ N# Z  ^$ `% ]) h, P: B; b; i
我如果先去测量输入信号,测完后,再去测量输出信号,或者先后顺序反过来,上面不同时刻测量相位不同的问题。只有同时对信号进行测量才能“锁存”住两个信号的相位差。* Z% J5 ?/ k2 V$ a
& ?) N$ Y7 B: J7 k
35ac7a06dc8c4275a82f213d3e049510.png
/ X3 z8 K$ Z+ g( Y) `6 c1 e2 M% _
无论上面时候采集,两个信号的相位差是固定的。" n6 {$ e0 U" X% x
5 z; e5 }; X9 [0 ?" g6 f$ U
10c1a5f952b816331392c2a116bca443.png
8 I& f: ?& t" s1 y
$ O2 r- @  M- p0 u' W; W6 L这样就把相位信息“锁存”到了单片机里面。下面就可以采用各种方式,比如FFT变换等分析信号之间的相位相位差了。如果不同步,相位信息就“丢失”了,无论有什么方法都不可能推算处来信号的相位差。7 [  w5 ^- F6 Z, O4 \7 r) x
! A- U& i3 f( ?* W3 V* X
如果理解不了,好好做下练习1,实践感受一下,我相信你可以懂的。; d8 S, C5 ]% D$ h+ Y

* ]0 P4 Y/ H" V  u5 e2 w练习
% S, X$ _1 m$ U" i1 [# w$ i用信号发生器产生两个相差30°、45°、90°的信号,让单片机分别去采集,打印导VOFA上,观察波形的相位差。每一个信号都多测几次,好好体会下博客中讲解的同步采样的作用。
- G& E7 ?' F1 W2 Y6 s有F4、H7的可以尝试开启三个ADC的同步采样。
$ b0 s! ?* q( s/ q$ J5 r6 y% A0 L————————————————# H3 w" w; N$ F" d3 _, {- F0 s( |2 T
版权声明:四臂西瓜* H  E. s+ p8 I' J; j' u+ _
9 a9 b8 }$ [8 u8 t6 \5 t

' U0 `2 ?/ Q+ X* M6 N0 ~+ I
48d1f4629b6a61fbf9559a514333c882.png
赞 收藏 评论0 发布时间:2022-11-1 17:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版