文章
博客 网店

 STM32G0 LL库示例-ADC


查询方式使用ADC

//adc初始化
void AdcInit(void)
{
  LL_ADC_InitTypeDef ADC_InitStruct = {0};
  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  //打开adc时钟
  LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSOURCE_SYSCLK);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC);

  //PA1 NTC
  GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  
  
  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;                //ADC定时转化触发条件来源,可以为软件触发或硬件(外部中断、定时器)触发。
  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;     //ADC顺序采集通道的个数,根据自己需要的通道个数设置
  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;       //
  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;                 //采集方式,单次采集还是连续采集
  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;         //禁用DMA
  ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_PRESERVED;               //采集的数据循环覆盖模式
  LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
  
  
  LL_ADC_SetOverSamplingScope(ADC1, LL_ADC_OVS_DISABLE);                      //禁用能过采样
  LL_ADC_SetTriggerFrequencyMode(ADC1, LL_ADC_CLOCK_FREQ_MODE_HIGH);          //采样时钟使用高频模式
  
  LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_TEMPSENSOR);

  LL_ADC_REG_SetSequencerConfigurable(ADC1, LL_ADC_REG_SEQ_FIXED);     //adc通道和硬件adc in制对应
  LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_COMMON_1,     LL_ADC_SAMPLINGTIME_160CYCLES_5);    //设置通道共用取样时间
  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_COMMON_1); //设置通道采样时间
  
  LL_ADC_DisableIT_EOC(ADC1);        //禁用通道采样结束中断
  LL_ADC_DisableIT_EOS(ADC1);        //禁用序列采样结束中断,因为使用的是单次软件触发所以这里关闭这些中断
  
  ADC_InitStruct.Clock = LL_ADC_CLOCK_SYNC_PCLK_DIV2;        //选择采样时钟来源
  ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;         //采样分辨率
  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;    //采样数据对齐方式,右对齐高位补0.
  ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;        //低功耗模式,关闭
  LL_ADC_Init(ADC1, &ADC_InitStruct);
  

  //采样数据转换时需要参考电压,参考电压可能是变化的,所以也有可能需要采集
  //LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_4, LL_ADC_CHANNEL_VREFINT);
  //LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_VREFINT, LL_ADC_SAMPLINGTIME_COMMON_1);
  // LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_TEMPSENSOR, LL_ADC_SAMPLINGTIME_COMMON_1);
  
  LL_ADC_EnableInternalRegulator(ADC1);
  drv_delay_us(100);
  LL_ADC_StartCalibration(ADC1); 
  while( LL_ADC_IsCalibrationOnGoing(ADC1)); 
  LL_ADC_Enable(ADC1);
  
 }

//转换操作
uint16_t AdcGetValue(uint32_t ch)
{
  uint32_t i,sum=0;
  uint16_t ad;
  
  if(ch != IO_AI1) return 0;
  
  LL_ADC_REG_StopConversion(ADC1);
  while(LL_ADC_REG_IsConversionOngoing(ADC1) != 0);
  
        //选择通道,此处可根据参数ch选择通道
  LL_ADC_REG_SetSequencerChannels(ADC1,LL_ADC_CHANNEL_1);

  for(i=0;i<9;i++)
  {
    LL_ADC_REG_StartConversion(ADC1);
    while(LL_ADC_IsActiveFlag_EOC(ADC1)==0);
    ad=LL_ADC_REG_ReadConversionData12(ADC1);
    if(i>0) sum+=ad;
  }
  sum/=8;
  return (uint16_t)sum;
}


芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved