Skip to main content
Visitor II
December 21, 2023
Question

STM32F0 ADC error

  • December 21, 2023
  • 2 replies
  • 2703 views
I have an ADC issue with the STM32F0. Looked all through the HAL docs and not sure what the error is. I can't get the ADC to complete a conversion or if it does only the first call. When I debug with the ADC calibration call, it goes to a fault. When I try sampling it with polling it doesn't update (I'm guessing because the conversion never completes). If I start it with the interrupt call, it never services the interrupt because I'm guessing the conversion never completes.
 
Everything was setup in CubeMX as below
briano_0-1703132087156.png

 

My attempt to get the ADC value (also not sure if I should be calling to handle &hadc3, but result is the same with no ADC value)

[code]

HAL_Delay(1);

HAL_ADC_Start(&hadc1);

// Poll ADC1 Perihperal & TimeOut = 1mSec

HAL_ADC_PollForConversion(&hadc1, 10);

// Read The ADC Conversion Result & Map It To PWM DutyCycle

AD_RES = HAL_ADC_GetValue(&hadc1);

HAL_ADC_Stop(&hadc1);

[/code]

    This topic has been closed for replies.

    2 replies

    ST Employee
    December 21, 2023

    Hello @brian-o,

    Thanks for your question !

    Here some remark and guidance :

    • "I can't get the ADC to complete a conversion or if it does only the first call" -> Can you please share your handler ? How many channel do you use ? 
    • For the execution, you respected well the sequence below for the execution of ADC conversion by polling :
      • 1/ Activate the ADC peripheral and start conversions using function HAL_ADC_Start()
        2/ Wait for ADC conversion completion using function HAL_ADC_PollForConversion()
        3/ Retrieve conversion results using function HAL_ADC_GetValue()
        4/ Stop conversion and disable the ADC peripheral using function HAL_ADC_Stop()
    • But you need to configure the ADC first by respecting :
      • 1/ Configure the ADC parameters (resolution, data alignment, ...) and regular group parameters (conversion trigger, sequencer, ...) using function HAL_ADC_Init().

        2/ Configure the channels for regular group parameters (channel number, channel rank into sequencer, ..., into regular group) using function HAL_ADC_ConfigChannel().

        3/ Also, I advise you to use HAL_ADCEx_Calibration_Start() to perform an automatic ADC calibration.
    • Have you thought implemented callback functions ?

    Best Regards,

    Pierre

    brian-oAuthor
    Visitor II
    December 22, 2023

    Thank you Pierre,

    the ADC calibration call (when used) enters some failure leading to a WHILE(1) loop in the HAL library, so there is likely a related issue.

    ADC initialization code is below from the cube generated content, &hadc1 or 3 handle is declared in my globals:

    ADC_HandleTypeDef hadc1;

     

    Initialization code:

    static void MX_ADC_Init(void)

    {

     

    /* USER CODE BEGIN ADC_Init 0 */

     

    /* USER CODE END ADC_Init 0 */

     

    ADC_ChannelConfTypeDef sConfig = {0};

     

    /* USER CODE BEGIN ADC_Init 1 */

     

    /* USER CODE END ADC_Init 1 */

     

    /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)

    */

    hadc.Instance = ADC1;

    hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;

    hadc.Init.Resolution = ADC_RESOLUTION_10B;

    hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;

    hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;

    hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

    hadc.Init.LowPowerAutoWait = DISABLE;

    hadc.Init.LowPowerAutoPowerOff = DISABLE;

    hadc.Init.ContinuousConvMode = DISABLE;

    hadc.Init.DiscontinuousConvMode = DISABLE;

    hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;

    hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

    hadc.Init.DMAContinuousRequests = DISABLE;

    hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;

    if (HAL_ADC_Init(&hadc) != HAL_OK)

    {

    Error_Handler();

    }

     

    /** Configure for the selected ADC regular channel to be converted.

    */

    sConfig.Channel = ADC_CHANNEL_3;

    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;

    sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;

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

    {

    Error_Handler();

    }

    /* USER CODE BEGIN ADC_Init 2 */

     

    /* USER CODE END ADC_Init 2 */

     

    }

    ST Employee
    December 22, 2023

    Hello @brian-o ,

    Thank you for sharing your code ! For your information, there's a button for a better code display, don't hesitate to use it next time (you can check the picture below) :)

    Pierre_P_0-1703236089193.png

    Regarding the issue :

    • You should enable Continuous mode by changing "hadc.Init.ContinuousConvMode = ENABLE;" to automatically restart conversion after each one.
    • Can you specified which failure ? Have you configure the ADC before calibration ?

    Best Regards,

    Pierre