開始時候使用的是stdlib的庫,最近發(fā)現(xiàn)cube庫用的越來越廣泛了,遂開始使用cube庫來完成ADC的多通道采集實驗。
ADC 的driver 在STM32F0XX_HAL_DRIVER當中,有stm32f0xx_hal_adc.c文件中,我們可以在stm32f0xx_hal_conf.h中開啟 宏定義 ADC 模塊。
ADC有三種工作模式,polling\ interrupt\DMA
我這里使用了polling的方式來獲取多通道的數(shù)據(jù)。
首先是要聲明兩個參數(shù)設置的結(jié)構(gòu)體
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();
}
基本的參數(shù)設置
比較重要的參數(shù)有ADC clock設置,sample cycle,ADC分辨率,多通道 scan mode設置。
ADC clock 有兩個時鐘源可以選擇,一個是內(nèi)部的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;
}