由于STM32的HAL_ADC_GetValue函数并未直接指定读取哪个通道的转换值,考虑能否像51里一样,至于要配置寄存器的某一位就更改了ADC的采集通道,因为有时会用同一个ADC先采集电源电压,过一段时间再采集模块电压;这种同一个ADC分时采集不同通道的值,使用网上的DMA多通道采集就显得麻烦了。
下面就是具体的实现步骤了:
1.初始化ADC
/* ADC2 init function */
void MX_ADC2_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
/**Common config
*/
hadc2.Instance = ADC2;
hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV8;
hadc2.Init.Resolution = ADC_RESOLUTION_12B;
hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;//扫描(多通道)模式=ENABLE、单次(单通道)模式=DISABLE 因为同时只采集一个通道 所以设置为DISABLE
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc2.Init.LowPowerAutoWait = DISABLE;
hadc2.Init.ContinuousConvMode = DISABLE; //连续=ENABLE、单次=DISABLE
hadc2.Init.NbrOfConversion = 1;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.NbrOfDiscConversion = 1;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc2.Init.BoostMode = DISABLE;
hadc2.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
这里只配置一个通道即可。
2.添加读取任意通道转换值的函数
uint16_t Board_Get_ADCChannelValue(ADC_HandleTypeDef* hadc,uint32_t channel)
{
ADC_ChannelConfTypeDef ADC_ChanConf;
ADC_ChanConf.Channel = channel;
ADC_ChanConf.Rank = ADC_REGULAR_RANK_1;
ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
ADC_ChanConf.SingleDiff = ADC_SINGLE_ENDED;
ADC_ChanConf.OffsetNumber = ADC_OFFSET_NONE;
ADC_ChanConf.Offset = 0;
HAL_ADC_ConfigChannel(hadc, &ADC_ChanConf);
HAL_ADC_Start(hadc);
HAL_ADC_PollForConversion(hadc,10); //轮询转换
return (uint16_t)HAL_ADC_GetValue(hadc);
}
其中Rank全部设为ADC_REGULAR_RANK_1,相当于覆盖了之前的配置。
在需要读取某一通道转换值的时候调用此函数即可。