
本文主要讲解如何实现STM32ADC同步采样。1 n4 O8 e* X5 F $ {' K" s/ u# h) @$ C/ d 所需工具: 开发板:STM32F103RCT6 STM32CubeMX IDE: Keil-MDK 模式简介 同步采样可以让两、三个ADC同时对各自的待测信号进行采样,这样就可以保留住两个信号之间的相位差。在相频分析中极具应用价值。7 j( K7 _4 ]* I4 u4 F! ~/ {! @ 实现方式16 z9 k5 M6 {8 O! Y0 o, d STM32的ADC自带同步模式,这种方式配置有些复杂,信号处理的也不直接。已有现成的教程了,写的不错,我就不重复造轮子了。6 R- [4 C4 d: v l4 ?/ g* W$ E / m9 X$ Y0 y$ ` 实现方式25 I8 |! @4 ]: |# _ 这种方式的核心思想非常简单,可是网上却没有发现有人写。以两个ADC的同步为例,就是ADC1、ADC3分别进行交流采样,触发源选择同一个定时器。这样在编程时,先开启两个ADC采样,再开启定时器触发,就可以实现同步采样了。/ z x1 z; _8 K9 D- R( K 1 V+ h0 e2 q( Q; \- I# d" u 是不是非常简单?如果有思路了就不用往下看了。下面是具体的实现过程,能看这篇文章,说明你已经会基础的ADC采集交流、建立工程等操作了,一些细节我就不再赘述。(不会的话可以参考我的相关博客,写了我好久,非常非常详细)" E5 U5 U" T) ` 0 x+ g" \4 E; h3 `% ]& J STM32F103RCT6的ADC2不支持DMA,所以我只能演示ADC1、ADC3的同步。对于其他型号比如F4,H7就可以实现三个ADC同步了。不过电赛用不到3个同步,两个就够。4 \: y0 |$ D$ F# _4 s# [ % v7 _1 r6 p0 O, m3 T; \) M 原理讲解 m5 U2 m# A: I- u 两个ADC选择同样的触发源,这样当触发源发出触发信号时,两个ADC同时接收到触发,同时开始采样。 - r& o$ A# G! d2 V5 { ![]() 工程建立 ADC1的配置 8 F' c0 R" @ e- j' h. L1 k ![]() - T, @6 R6 F' j+ E1 |' B ![]() # _! w- P* H2 j ADC2的配置 ' k% \& ~7 G: v; h- C- p ![]() * L% K6 o, }0 Z7 C + t8 z' h4 ^# F4 ^4 R1 n3 V 3 L5 J. m: A4 q4 Q6 d2 a 定时器配置 ![]() 代码编写 ![]() . D: j1 f* N$ H0 Z' v4 @
和单个ADC采集交流一样。 - H4 _/ a. g K* F ![]() % a$ b$ F, @) m9 @) V2 c
可以分为下面两步走,顺序不能乱。1 k/ w& t3 n, d/ l! z2 D9 u1 [ ADC开启采样 开启定时器' D5 ~0 h. M0 d2 ]" U! L " j- `$ E8 {1 T2 l3 ]1 V' c X 一定要注意这样顺序,因为两个ADC是分别开启的,开启的时间有先后,先开启ADC采样,因为定时器没开,就没有触发信号来触发ADC采样,这样两个ADC都在等待定时器没有开采。+ x' a" Y8 c1 u/ P 如果先开启定时器,也就是这样编写代码: o9 A4 q) w( U! X1 e1 S ![]() / `7 Q3 ]# u3 ~ P9 [0 C 因为ADC开启顺序不一样,当ADC1开启后,立马开始采样,这个时候ADC3正在开启,前面的个点就不在同步了。 ![]() 4 H8 V4 e% Q. {" O ![]()
因为ADC1和ADC3是同时采集完成的。所以只需要在其中任意一个ADC的DMA的采集完成中断位置把标志位置一表示采集完成即可。我这里选择的是ADC1的DMA中断。" S, }+ V/ J; r4 T/ y- i4 N 同步采样的作用 萌新宝宝第一次听到同步采样会有些懵。下面我来介绍下这个模式有什么作用。 3 M6 G% h. ?6 f8 s7 B( ?8 Y 很多电路系统都有一套属于自己的幅频和相频曲线,这点在电分、模电等课本中都有提到,已经是常客了。! m8 \( O# I" Y& O0 j 1 W) K4 s( R3 W, B8 ?- G3 f3 s% { 我们测量幅频的时候比较简单,测量不同频率下输入信号幅度,再测量输出信号的幅度,两个幅度一比就是幅频曲线。3 C' c7 G6 }; k1 w1 q# C 相位呢则是对比输入输出信号的相位差来计算。输入信号的相位每一个时刻去测量都是不一样的。前1ms还是0°。后一1ms就是45°了。但是输入与输出信号的相位差是固定的。6 Y) i- k0 B. s/ R* n$ K 5 \0 e* n5 g5 n9 q* q7 _. Q ![]() 我如果先去测量输入信号,测完后,再去测量输出信号,或者先后顺序反过来,上面不同时刻测量相位不同的问题。只有同时对信号进行测量才能“锁存”住两个信号的相位差。% ?# | a7 e6 q4 i - h) G2 g+ J, Y- W J! F3 x7 y* P ![]() 0 M: }) s6 V6 f0 u ` 无论上面时候采集,两个信号的相位差是固定的。 ![]() 6 ^" i5 f/ p6 e2 {& P 这样就把相位信息“锁存”到了单片机里面。下面就可以采用各种方式,比如FFT变换等分析信号之间的相位相位差了。如果不同步,相位信息就“丢失”了,无论有什么方法都不可能推算处来信号的相位差。8 u. | X' t& d 4 W( F5 f- p) J6 \2 c; d: s 如果理解不了,好好做下练习1,实践感受一下,我相信你可以懂的。! Y! _! W! T: A% ~ 8 t2 n* c; L# z' o _6 F P 练习 用信号发生器产生两个相差30°、45°、90°的信号,让单片机分别去采集,打印导VOFA上,观察波形的相位差。每一个信号都多测几次,好好体会下博客中讲解的同步采样的作用。 有F4、H7的可以尝试开启三个ADC的同步采样。 ————————————————! W: @/ d9 o& N6 K+ A l 版权声明:四臂西瓜 . N+ d% D; [& b! Y1 J, r |
基于STM32使用ADC的多通道采样经验分享
基于STM32利用ADC+DMA采样显示经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形
基于STM32的ADC片内信号经验分享
基于STM32U5 ADC+DMA配置经验分享