How to use STM32 three-way AD

Publisher:Qingliu2022Latest update time:2019-03-04 Source: eefocusKeywords:STM32 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere


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;

}



Keywords:STM32 Reference address:How to use STM32 three-way AD

Previous article:CRC calculation for STM32
Next article:Query of STM32 DMA sending completion flag

Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号