STM32ADC同步采样

Posted 四臂西瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32ADC同步采样相关的知识,希望对你有一定的参考价值。

STM32ADC同步采样

本文主要讲解如何实现STM32ADC同步采样。

所需工具:

  • 开发板:STM32F103RCT6
  • STM32CubeMX
  • IDE: Keil-MDK

模式简介

同步采样可以让两、三个ADC同时对各自的待测信号进行采样,这样就可以保留住两个信号之间的相位差。在相频分析中极具应用价值。

实现方式1

STM32的ADC自带同步模式,这种方式配置有些复杂,信号处理的也不直接。已有现成的教程了,写的不错,我就不重复造轮子了。

实现方式2

这种方式的核心思想非常简单,可是网上却没有发现有人写。以两个ADC的同步为例,就是ADC1、ADC3分别进行交流采样,触发源选择同一个定时器。这样在编程时,先开启两个ADC采样,再开启定时器触发,就可以实现同步采样了。

是不是非常简单?如果有思路了就不用往下看了。下面是具体的实现过程,能看这篇文章,说明你已经会基础的ADC采集交流、建立工程等操作了,一些细节我就不再赘述。(不会的话可以参考我的相关博客,写了我好久,非常非常详细)

STM32F103RCT6的ADC2不支持DMA,所以我只能演示ADC1、ADC3的同步。对于其他型号比如F4,H7就可以实现三个ADC同步了。不过电赛用不到3个同步,两个就够。

原理讲解

两个ADC选择同样的触发源,这样当触发源发出触发信号时,两个ADC同时接收到触发,同时开始采样。

工程建立

ADC1的配置

ADC2的配置

定时器配置

代码编写

#define SAMP_NUM 1024 //采样点数

uint16_t ADC1_BUFF_16[SAMP_NUM]; // ADC1的数据缓冲区
uint16_t ADC3_BUFF_16[SAMP_NUM]; // ADC1的数据缓冲区

__IO uint8_t ADC_con_flag = 0;//ADC采集完成标志

和单个ADC采集交流一样。


HAL_ADCEx_Calibration_Start(&hadc1); // AD校准,f4不支持
HAL_ADCEx_Calibration_Start(&hadc3); // AD校准,f4不支持

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_BUFF_16, SAMP_NUM);
HAL_ADC_Start_DMA(&hadc3, (uint32_t *)ADC3_BUFF_16, SAMP_NUM);

HAL_TIM_Base_Start(&htim8);//一定要在ADC开启后在开启触发

可以分为下面两步走,顺序不能乱

  1. ADC开启采样
  2. 开启定时器

一定要注意这样顺序,因为两个ADC是分别开启的,开启的时间有先后,先开启ADC采样,因为定时器没开,就没有触发信号来触发ADC采样,这样两个ADC都在等待定时器没有开采。

如果先开启定时器,也就是这样编写代码

因为ADC开启顺序不一样,当ADC1开启后,立马开始采样,这个时候ADC3正在开启,前面的个点就不在同步了。


extern uint8_t ADC_con_flag;

ADC_con_flag = 1;

因为ADC1和ADC3是同时采集完成的。所以只需要在其中任意一个ADC的DMA的采集完成中断位置把标志位置一表示采集完成即可。我这里选择的是ADC1的DMA中断。

同步采样的作用

萌新宝宝第一次听到同步采样会有些懵。下面我来介绍下这个模式有什么作用。

很多电路系统都有一套属于自己的幅频和相频曲线,这点在电分、模电等课本中都有提到,已经是常客了。

我们测量幅频的时候比较简单,测量不同频率下输入信号幅度,再测量输出信号的幅度,两个幅度一比就是幅频曲线。

相位呢则是对比输入输出信号的相位差来计算。输入信号的相位每一个时刻去测量都是不一样的。前1ms还是0°。后一1ms就是45°了。但是输入与输出信号的相位差是固定的。

我如果先去测量输入信号,测完后,再去测量输出信号,或者先后顺序反过来,上面不同时刻测量相位不同的问题。只有同时对信号进行测量才能“锁存”住两个信号的相位差。

无论上面时候采集,两个信号的相位差是固定的。

这样就把相位信息“锁存”到了单片机里面。下面就可以采用各种方式,比如FFT变换等分析信号之间的相位相位差了。如果不同步,相位信息就“丢失”了,无论有什么方法都不可能推算处来信号的相位差。

如果理解不了,好好做下练习1,实践感受一下,我相信你可以懂的。

练习

  1. 用信号发生器产生两个相差30°、45°、90°的信号,让单片机分别去采集,打印导VOFA上,观察波形的相位差。每一个信号都多测几次,好好体会下博客中讲解的同步采样的作用。
  2. 有F4、H7的可以尝试开启三个ADC的同步采样。

后记

配套工程:

电赛培训资料: 整理了电赛培训过程中的例程代码 - Gitee.com

以上是关于STM32ADC同步采样的主要内容,如果未能解决你的问题,请参考以下文章

STM32ADC同步采样

stm32 ad进行对数据采样,怎么获取五秒内的采样数据

stm32中如何通过定时器来设置ADC的采样率????

STM32中有关CAN总线CAN_SJW、CAN_BS1、CAN_Prescaler是啥?

STM32 同步 ADC 仅从 ADC 1 读取值

stm32f1adc同步模式没数据