STM32 DMA模式ADC多通道采集

ADC采样基准电压3.3V    3个通道采集数据

采集数据存放位置

ADC_ConvertedValue[0]

ADC_ConvertedValue[1]

ADC_ConvertedValue[2]

三个值对应ADC三个通道采集出来的值

实际使用过程中如果电压过大 可以分压 之后传给ADC 这时计算实际电压时也要乘以分压时的倍数   基准电压要稳定 不稳定的时候会出现计算误差。

ADC通道17内部基准值会更稳 ADC_CHANNEL_17,基准电压使用通道17会更准确,这个就是用来做ADC的基准值的,不然用稳压芯片稳定外部电压,来做参考。

ADC多通道采集时,采集转换之后数据会自动赋给我们传进去的参数ADC_ConvertedValue,然后进行下一个通道或者下一次的数据采集转换。

 

采集周期太快会出现采集数据失败的情况,所以在不影响使用的情况下ADC采样周期加长一点(ADC_SAMPLETIME_160CYCLES_5)

 

采集数据尽量多一点 做一下数据处理  比如:平均值求法

 

 

STM32L051c8T6ADC配置如下:

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)

{

  GPIO_InitTypeDef                 GPIO_InitStruct;

  static DMA_HandleTypeDef         DmaHandle;

  

  /*##-1- 打开时钟#################################*/

  /* Enable GPIO clock ****************************************/

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

  /* ADC1 Periph clock enable */

  __HAL_RCC_ADC1_CLK_ENABLE();

  /* Enable DMA1 clock */

  __HAL_RCC_DMA1_CLK_ENABLE();

 

  

  /*##- 2-配置GPIO引脚 #########################################*/

  /* ADC3 Channel8 GPIO pin configuration */

  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2;

  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

 

  GPIO_InitStruct.Pin = GPIO_PIN_1;

   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*##- 3- Configure DMA #####################################################*/

 

  /*********************** 配置DMA参数***************************/

  DmaHandle.Instance                = DMA1_Channel1;   DMA通道1

  DmaHandle.Init.Direction           = DMA_PERIPH_TO_MEMORY;

  DmaHandle.Init.PeriphInc           = DMA_PINC_DISABLE;

  DmaHandle.Init.MemInc              = DMA_MINC_ENABLE;

  DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

  DmaHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;

  DmaHandle.Init.Mode                = DMA_CIRCULAR;

  DmaHandle.Init.Priority            = DMA_PRIORITY_MEDIUM;

  DmaHandle.Init.Request             = DMA_REQUEST_0;

  

  /* 初始化新的DMA传输工具 */

  HAL_DMA_DeInit(&DmaHandle);  

  HAL_DMA_Init(&DmaHandle);

  

  /* 关联DMA句柄 */

  __HAL_LINKDMA(hadc, DMA_Handle, DmaHandle);

  

  /* NVIC配置DMA输入数据中断 */

  HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0);

  HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

}

 

 

void ADC_init(void)

{

 

/* ### - 1 -ADC外部初始化 #################################### */

AdcHandle.Instance = ADC1;           

AdcHandle.Init.OversamplingMode    = DISABLE; //过采样特性失能

AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4;//ADC时钟源选择

AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;

AdcHandle.Init.LowPowerFrequencyMode = ENABLE;

AdcHandle.Init.LowPowerAutoWait      = DISABLE;

 

AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;   //12位ADC采样值

AdcHandle.Init.SamplingTime     = ADC_SAMPLETIME_160CYCLES_5;  //ADC采样时间

AdcHandle.Init.ScanConvMode          = ADC_SCAN_ENABLE;//

AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;

AdcHandle.Init.ContinuousConvMode    = ENABLE;

AdcHandle.Init.DiscontinuousConvMode = DISABLE;

AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;

AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;

AdcHandle.Init.DMAContinuousRequests = ENABLE;    //连续转换使能

 

HAL_ADC_Init(&AdcHandle) ;

 

//2ADC 校准 使用之前尽量校准

HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED);

 

  /* ### - 3 - ADC通道初始化 ######################################## *

sConfig.Channel = ADC_CHANNEL_0;  //ADC通道

sConfig.Rank = 1;   //转换次序编号

HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);

 

 

sConfig.Channel = ADC_CHANNEL_2;

sConfig.Rank = 2;   

HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);

 

sConfig.Channel = ADC_CHANNEL_9;

sConfig.Rank = 3;   

HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);  

 

 

HAL_ADC_Start_DMA(&AdcHandle,ADC_ConvertedValue, 3) ; //ADC采样开启

//ADC_ConvertedValue存放ADC采样的值

 

}

 

使用是什么时候用到采样值就直接获取ADC_ConvertedValue数组里面的值。

你可能感兴趣的:(STM32HAL库学习)