×
单片机 > 单片机程序设计 > 详情

STM32 三路AD的使用方法

发布时间:2020-06-16 发布时间:
|


void ADC_ChannelSelect(uint32_t ADChannel)

{

    //  ADC_ChannelConfTypeDef sConfig;

 

    sConfig.Channel = ADChannel;

    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;//ADC_RANK_CHANNEL_NUMBER;//1;//ADC_RANK_CHANNEL_NUMBER;

    sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;

    if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

}

 

 

HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)

{

  HAL_StatusTypeDef tmp_hal_status = HAL_OK;

  __IO uint32_t wait_loop_index = 0U;

 

  /* Check the parameters */

  assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));

  assert_param(IS_ADC_CHANNEL(sConfig->Channel));

  assert_param(IS_ADC_RANK(sConfig->Rank));

  

  if (! IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))

  {

    assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime));

  }

  

  /* Process locked */

  __HAL_LOCK(hadc);

  

  /* Parameters update conditioned to ADC state:                              */

  /* Parameters that can be updated when ADC is disabled or enabled without   */

  /* conversion on going on regular group:                                    */

  /*  - Channel number                                                        */

  /*  - Channel sampling time                                                 */

  /*  - Management of internal measurement channels: VrefInt/TempSensor/Vbat  */

  if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)

  {

    /* Configure channel: depending on rank setting, add it or remove it from */

    /* ADC conversion sequencer.                                              */

    if (sConfig->Rank != ADC_RANK_NONE)

    {

      /* Regular sequence configuration */

      /* Set the channel selection register from the selected channel */

      if (sConfig->Channel == 0)

      {

            hadc->Instance->CHSELR = 0x01;

      }

       else if (sConfig->Channel == 4)

       {

            hadc->Instance->CHSELR = 0x10;

       }

        else if (sConfig->Channel == 6)

        {

            hadc->Instance->CHSELR = 0x40;

        }    

    //  hadc->Instance->CHSELR |= ADC_CHSELR_CHANNEL(sConfig->Channel);

      

      /* Channel sampling time configuration */

      /* Management of parameters "SamplingTimeCommon" and "SamplingTime"     */

      /* (obsolete): sampling time set in this function with                  */

      /* parameter "SamplingTime" (obsolete) only if not already set into     */

      /* ADC initialization structure with parameter "SamplingTimeCommon".    */

      if (! IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))

      {

        /* Modify sampling time if needed (not needed in case of reoccurrence */

        /* for several channels programmed consecutively into the sequencer)  */

        if (sConfig->SamplingTime != ADC_GET_SAMPLINGTIME(hadc))

        {

          /* Channel sampling time configuration */

          /* Clear the old sample time */

          hadc->Instance->SMPR &= ~(ADC_SMPR_SMP);

          

          /* Set the new sample time */

          hadc->Instance->SMPR |= ADC_SMPR_SET(sConfig->SamplingTime);

        }

      }

      

      /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */

      /* internal measurement paths enable: If internal channel selected,     */

      /* enable dedicated internal buffers and path.                          */

      /* Note: these internal measurement paths can be disabled using         */

      /*       HAL_ADC_DeInit() or removing the channel from sequencer with   */

      /*       channel configuration parameter "Rank".                        */

      if(ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))

      {

        /* If Channel_16 is selected, enable Temp. sensor measurement path. */

        /* If Channel_17 is selected, enable VREFINT measurement path. */

        /* If Channel_18 is selected, enable VBAT measurement path. */

        ADC->CCR |= ADC_CHANNEL_INTERNAL_PATH(sConfig->Channel);

        

        /* If Temp. sensor is selected, wait for stabilization delay */

        if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)

        {

          /* Delay for temperature sensor stabilization time */

          /* Compute number of CPU cycles to wait for */

          wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000U));

          while(wait_loop_index != 0U)

          {

            wait_loop_index--;

          }

        }

      }

    }

    else

    {

      /* Regular sequence configuration */

      /* Reset the channel selection register from the selected channel */

      hadc->Instance->CHSELR &= ~ADC_CHSELR_CHANNEL(sConfig->Channel);

      

      /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */

      /* internal measurement paths disable: If internal channel selected,    */

      /* disable dedicated internal buffers and path.                         */

      if(ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))

      {

        /* If Channel_16 is selected, disable Temp. sensor measurement path. */

        /* If Channel_17 is selected, disable VREFINT measurement path. */

        /* If Channel_18 is selected, disable VBAT measurement path. */

        ADC->CCR &= ~ADC_CHANNEL_INTERNAL_PATH(sConfig->Channel);

      }

    }

    

  }

   

  /* If a conversion is on going on regular group, no update on regular       */

  /* channel could be done on neither of the channel configuration structure  */

  /* parameters.                                                              */

  else

  {

    /* Update ADC state machine to error */

    SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);

    

    tmp_hal_status = HAL_ERROR;

  }

  

  /* Process unlocked */

  __HAL_UNLOCK(hadc);

  

  /* Return function status */

  return tmp_hal_status;

}



关键字:STM32  三路AD  使用方法 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八