STM32F4实现ADC同步采样的方法
STM32F4实现ADC同步采样的方法
方法一:双ADC+DMA采样
基础配置
此方法是基于双ADC+DMA同时搬运实现,配置时先打开TIM定时器
将TIM配置为你需要的采样频率,并且开启Update Event,详细原因请参考往期博客:
[https://www.cnblogs.com/LuvRene-blog/articles/18289670/LuvRene-blog-ADC_DMA_TIM-01]
之后打开两个ADC通道,关闭扫描模式、连续转换,并使能DMA请求连续搬运
之后分别为两个ADC配置为独立模式,触发方式改为TIM触发
开启DMA采样,将DMA模式设置为Normal(Normal和Circle的采样值会有不同)
代码逻辑
分别分配两个ADC采样的储存空间,分别打开ADC的DMA,之后启动TIM,此时双ADC同时开始工作,实现同步采样;
方法二:使用HAL库自带的双ADC同步采样模式配置
基础配置
还是同上配置时钟,将ADC1的模式从Imdependent Mode更改为Dual regular simultaneous Mode only
之后配置同上,关闭扫描模式、连续转换,并使能DMA请求连续搬运,触发方式改为TIM触发
之后你会发现,当你配置了自带的双ADC模式时,ADC2对应的选项会变灰且无法选中
重点是,配置DMA时一定要配置Memory大小为Word,原因是该模式下的采样是存储到同一个数组
代码逻辑
在所有的外设模块初始化后,将ADC2直接打开 HAL_ADC_Staert(&hadc2)
之后调用 HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADC_Raw_Data, FFT_LENGTH);
传递的参数分别是ADC的权柄、32位数据的储存数组、数组的长度;
之后在你提供的存储数据的Buffer里面,因为是Word-32位的数据大小,而ADC设置的数据大小为12位
那么在Buffer里面是将ADC采样的值在高四位填上0
然后将ADC1的值放在低16位,ADC2的值相同处理后放在高16位(谁低谁高可能取决于ADC的通道优先级)
需要使用数据时需要用到与运算**&和移位运算右移:>>**
点击查看代码
// 双ADC同步采样结果提取
for (int i = 0; i < FFT_LENGTH; i++)
{
ch1.adc_buf[i] = ADC_Raw_Data[i] & 0xffff;\\ 提取低16位的数据
ADC_Raw_Data[i] >>= 16;\\ 将高16位的数据移到低16位
ch2.adc_buf[i] = ADC_Raw_Data[i] & 0xffff;
}
以上就是针对ADC同步采样的两种处理方式,方法一主要是在于代码的顺序
一定要先将两个ADC的DMA搬运打开,再打开TIM定时器
而方法二则是在于对于数据的处理,存储的数组大小一定要设置为Word和uint32_t
才能保证一个数据存放为可以保存两个ADC的采样值
作者:LuvRene