wenbo2005.online

学习记录 / STM32

ADC+DMA

STM322024-05-19

(一),单通道ADC

1,使能DMA Continuous Requests与Continuous Conversion Mode

2,选择Circular   ,World,    height  

3,中断等级为1

4,工程代码:

uint32_t ADC_Value[30];//即将采集30次
float adc;

HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);//电压校准3.3V
HAL_ADC_Start_DMA(&hadc2,ADC_Value,30);//采集次数为30次,放置在数组中///////////////////////////需要大点,可能减缓CPU速度

if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))
     {  
         for(int i = 1; i < 30; i++)//数据处理 与 DMA存值 不同步  
         {
               adc+= ADC_Value[i];//把三十次的采集值依次累加
               HAL_Delay(2);  
         }  
        adc= adc/30.0f;
     }

5,打印adc即可。

(二),多通道ADC

1,STM32cubemx 配置与单通道一致,注意Number Of Conversion 为开启的通道数,Rank中注意各自的采集通道编号,并且将周期调大!!!

如双通道:5与11

uint32_t ADC_Value[20];//即将采集20次
float adc1;
float adc2;

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);//电压校准3.3V
HAL_ADC_Start_DMA(&hadc1,ADC_Value,20);//采集次数为30次,放置在数组中

    for(int i=0;i<10;i+=2)//=================0,2,4,6,8;//=========================每个通道交替采集五次,需要错开相加
    {
        adc1+=adc_val[i];
    }
    adc1=adc1/5.0f/4095.0f*3.3f
    for(int i=1;i<10;i+=2)//================1,3,5,7,9;//=========================每个通道交替采集五次,需要错开相加
    {
         adc2+=adc_val[i];
    }
   adc2=adc2/5.0f/4095.0f*3.3f;