开始时候使用的是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; }
|