Skip to main content
Associate III
May 13, 2025
Solved

Problem with ADC on custom board

  • May 13, 2025
  • 2 replies
  • 1392 views

Hello.
I have a problem with the ADC on the custom board with the STM32WB55 chip. I am using a divider and should get something around 2V, but I always get the maximum value - 4095.
I am using this code that I saw in the ST examples.

 HAL_GPIO_WritePin(ADC_OUT_GPIO_Port, ADC_OUT_Pin, GPIO_PIN_SET);
 HAL_Delay(50);

 if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK)
 {
	 Error_Handler();
 }

 if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)aADCxConvertedData, BATTERY_ARRAY_SIZE) != HAL_OK) {

	 HAL_GPIO_WritePin(ADC_OUT_GPIO_Port, ADC_OUT_Pin, GPIO_PIN_RESET);
	 Error_Handler();
 }

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
 if(hadc->Instance == ADC1) {

 if (HAL_ADC_Stop_DMA(&hadc1) != HAL_OK) {
 	Error_Handler();
 }
 HAL_GPIO_WritePin(ADC_OUT_GPIO_Port, ADC_OUT_Pin, GPIO_PIN_RESET);
 uint32_t sum_mv = 0;
 for (uint32_t i = 0; i < BATTERY_ARRAY_SIZE; i++) {
 aADCxConvertedData_Voltage_mVolt[i] = __ADC_CALC_DATA_VOLTAGE(VDDA_APPLI, aADCxConvertedData[i]);
 sum_mv += aADCxConvertedData_Voltage_mVolt[i];
 }

 uint16_t avg_mv = sum_mv / BATTERY_ARRAY_SIZE;

 ubDmaTransferStatus = 1;
 }
}

I put a breakpoint on ubDmaTransferStatus and see what it measures.

I use this same code on the nucleo board by shorting PC1 and PC0 with a wire and seeing normal results, around 3294-3296 mV.

This is not a hardware problem, I measured the output of the divider on the pin with an oscilloscope and saw around 2V. I also tested it on two devices.

I attach a project that works with nucleo, maybe this will help somehow.
Please help me.
Regards.

Best answer by TDK

> It's internally connected to the VDDA.

It is not internally connected to VDDA, it is a distinct pin and must be powered.

That is the root of your issues.

 

Your options are:

  • Modify the hardware to connect VDDA to VREF+.
  • Use VREFBUF to supply a 2.5 V reference. This is the highest voltage it can supply.

2 replies

raptorhal2
Lead
May 13, 2025

Step through the program in debug mode and see where it goes wrong.

IlliaGxAuthor
Associate III
May 13, 2025

Hello. Thank you for your answer.
Could you please tell me what I should be looking at? I am already looking at the result in the HAL_ADC_ConvCpltCallback completion callback

Andrew Neil
Super User
May 13, 2025

@IlliaGx wrote:

 custom board with the STM32WB55 chip..


It's a custom board - so you need to show the schematic.

How to write your question to maximize your chances to find a solution

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
IlliaGxAuthor
Associate III
May 13, 2025

IlliaGx_0-1747148211647.png

 

Andrew Neil
Super User
May 13, 2025

You need to show the full schematic!

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.