STM32 ADC分时采集多个通道数据,非DMA

由于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,相当于覆盖了之前的配置。
在需要读取某一通道转换值的时候调用此函数即可。

发布了15 篇原创文章 · 获赞 0 · 访问量 287

猜你喜欢

转载自blog.csdn.net/qq_33552551/article/details/104536102