cancel
Showing results for 
Search instead for 
Did you mean: 

Problem with ADC on custom board

IlliaGx
Associate III

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.

13 REPLIES 13

@IlliaGx wrote:

It's internally connected to the VDDA.


Only on packages which do not have a VREF+ pin.

Your schematic shows that you do have the pin - so you do need to connect it.

This is why it's always important to show the full schematic!

Similarly only last week: https://community.st.com/t5/stm32-mcus-embedded-software/adc-just-giving-raw-value-of-4095-on-all-channels/m-p/800046/highlight/true#M63103

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.
IlliaGx
Associate III

Yes, you were right. Thank you very much! Can you please tell me how to configure VREFBUF? I don't have this parameter in the cube.

The settings for VREFBUF are under SYS.

TDK_0-1747160733728.png

 

If you feel a post has answered your question, please click "Accept as Solution".
IlliaGx
Associate III

I think I did it. Thank you very much!

Now it shows something more realistic. If instead of the real 1.72 V the ADC reads 1.1 V (at VDDA_APPLI 2500), is this a problem, or is it normal and I just need to adjust the correction factor?