单片机

STM32F0 ADC学习

2018-05-14 来源:eefocus

开始时候使用的是stdlib的库,最近发现cube库用的越来越广泛了,遂开始使用cube库来完成ADC的多通道采集实验。  

ADC 的driver 在STM32F0XX_HAL_DRIVER当中,有stm32f0xx_hal_adc.c文件中,我们可以在stm32f0xx_hal_conf.h中开启 宏定义 ADC 模块。


ADC有三种工作模式,polling\ interrupt\DMA



我这里使用了polling的方式来获取多通道的数据。



首先是要声明两个参数设置的结构体


ADC_HandleTypeDef             AdcHandle;

ADC_ChannelConfTypeDef        sConfig;


[cpp] view plain copy

AdcHandle.Instance = ADC1;  

  

AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4;  

AdcHandle.Init.LowPowerAutoWait      = DISABLE;  

AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;  

AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;  

AdcHandle.Init.ScanConvMode          = ADC_SCAN_ENABLE;  

AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;  

AdcHandle.Init.ContinuousConvMode    = ENABLE;  

AdcHandle.Init.DiscontinuousConvMode = DISABLE;  

AdcHandle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;  

AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;  

AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;  

AdcHandle.Init.DMAContinuousRequests = DISABLE;//  

AdcHandle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;  

  

/* Initialize ADC peripheral according to the passed parameters */  

if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)  

{  

  Error_Handler();  

}  

  

  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)  

{  

  Error_Handler();  

}  

  

/* ### - 2 - Start calibration ############################################ */  

if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)  

{  

  Error_Handler();  

}  


基本的参数设置


比较重要的参数有ADC clock设置,sample cycle,ADC分辨率,多通道 scan mode设置。


ADC clock 有两个时钟源可以选择,一个是内部的14MHZ的时钟,,另一个为APB的时钟 最大为14MHZ.


get_ADC_value 为读取AD值的模块,形参为通道,输入通道名称得到该通道对应的AD值。



float get_ADC_value(uint32_t channel)  

{  

 // uint32_t nResultDMA;  

  float  temp;  

  start_adc();  

  config_channel(channel);  

    

  HAL_ADC_Start(&AdcHandle);  

  HAL_ADC_PollForConversion(&AdcHandle,1);  

    

  temp=HAL_ADC_GetValue(&AdcHandle);  

  HAL_ADC_Stop(&AdcHandle);  

  //temp=temp*3/4096;  

  return temp;  

  

}  


相关文章