STM32F0 ADC error
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2023-12-20 08:17 PM
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]
- Labels:
-
ADC
-
STM32F0 Series
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2023-12-21 09:24 AM
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()
- 1/ Activate the ADC peripheral and start conversions using function HAL_ADC_Start()
- 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
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2023-12-21 04:29 PM
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 */
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2023-12-22 01:19 AM - edited ‎2023-12-22 01:20 AM
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) :)
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
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.