STM32F4实现ADC同步采样的方法

STM32F4实现ADC同步采样的方法

  • 方法一:双ADC+DMA采样
  • 方法二:使用HAL库自带的双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

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32F4实现ADC同步采样的方法

    发表回复