STM32 ADC — DMA采样

文章目录

  • STM32 ADC — DMA采样
  • cubeMX配置
  • ==重要== :cubeMX配置使用DMA时的一个问题
  • 代码编写
  • 一维数组接收数据
  • 二维数组接收数据
  • 使用cubeMX生成HAL工程
  • cubeMX配置


    上面红框中选择配置为连续转换模式,即通过HAL_ADC_Start_DMA()函数启动,便可以以一直进行转换,只需要从指定的数组中读取数据即可。如果配置为DISABLE则需要在每次需要转换的时候通过HAL_ADC_Start_DMA()函数启动。另外需要注意的一点时当使用连续转换模式时,下面的DMA配置中必须配置为循环模式,否则可能无法正确获取到数据。

    重要 :cubeMX配置使用DMA时的一个问题

    如果先配置过不使用DMA的ADC工程,再重新配置使用DMA时,生成代码中ADC初始化在DMA初始化之前,这样可能导致ADC+DMA无法正常工作,因而无法正确获取到数据。

    正确的初始化顺序应该是MX_DMA_Init()初始化应该放在MX_ADC1_Init()初始化的前面。这样ADC+DMA才能正常工作。


    cubeMX配置工具中可以根据上图所示调整每个初始化函数的顺序。

    代码编写

    基于上面ADC配置为连续转换模式和DMA配置为循环模式

    一维数组接收数据

    #define CHANNEL_NUM 2
    uint16_t adc_converted_value[CHANNEL_NUM]; //元素0表示1通道数据,元素1表示2通道数据
    
    //启动ADC采样
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, CHANNEL_NUM);
    
    //TODO:数据处理
    // voltage = adc_converted_value[0] / 4096.0f * 3.3 * factor1;
    // voltage = adc_converted_value[1] / 4096.0f * 3.3 * factor2;
    

    二维数组接收数据

    #define SAMPLE_NUM 10
    #define CHANNEL_NUM 2
    // 行表示数据组,0列的10个数据表示通道1数据,1列的10个数据表示通道2的数据
    /*
    | 00 | 01 |
    | 10 | 11 |
    | 20 | 21 |
        ...
    | 90 | 91 |
      ch1  ch2
    */
    uint16_t adc_converted_value[SAMPLE_NUM][CHANNEL_NUM]; 
    
    //启动ADC采样
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM * CHANNEL_NUM);
    
    //TODO:数据处理
    	uint16_t sum1 = 0, sum2 = 0;
        for(uint16_t i = 0; i < SAMPLE_NUM; ++i) {
          sum1+= adc_converted_value[i][0];
          sum2+= adc_converted_value[i][1];
        }
        sum1 /= SAMPLE_NUM;
        sum2 /= SAMPLE_NUM;
        voltage = bsp_adcGetChargerVoltage(sum1);
        current = bsp_adcGetChargeCurrent(sum2);
    

    作者:顶点元

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 ADC — DMA采样

    发表回复