Medición de STM32 ADC 3V3

1

Estoy usando la placa Nucleo-32 con STM32F031K6 MCU. Tengo un problema extraño con la medición de ADC. Cuando el pin ADC (PA4 en mi caso) está conectado directamente a VREF o 3V3, el valor siempre está en el rango de 4031-4032 en lugar de 4095 ... Para medir voltajes bajos, el valor de ADC tiene un desplazamiento mayor del correcto (20%). más bajo entonces debería ser para una medición de 0.5V).

¿Podría alguien explicar este comportamiento?

configuración de ADC:

  ADC_ChannelConfTypeDef sConfig;

    /**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_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = DISABLE;
  hadc.Init.EOCSelection = ADC_EOC_SEQ_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();
  }

    HAL_NVIC_EnableIRQ(ADC1_IRQn);

  /**Configure for the selected ADC regular channel to be converted. 
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

Configuración de pin:

__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
pregunta maff91

2 respuestas

1

Gracias a todos por la ayuda. Finalmente encontré la solución yo mismo

Esta llamada a la función después de la inicialización de ADC hace toda la magia para resolver el problema

HAL_ADCEx_Calibration_Start(&hadc)
    
respondido por el maff91
0

Un par de pensamientos:

  1. Me pregunto si su voltaje VDDA o VREF tiene una compensación. Eché un vistazo al esquema de la placa Nucleo-32 aquí y vi estos pines conectados a una perla que podría tener cierta resistencia de CC que es importante si está extrayendo mucha corriente. desde ese nodo que a veces se usa en ADCs para referencia de medición.

¿Quizás intente medir la tensión en el pin 5 de la MCU (VDDA / VREF +)?

  1. ¿Cuánto tiempo le está permitiendo a la solución? Parece que los ADCs son 5Msps? Debería ser bastante rápido, pero es posible que tenga algo de capacidad que reduzca la velocidad de su señal más de lo que cree.

  2. ¿Ves el mismo problema en otra entrada analógica (por ejemplo, PA1)? De ser así, esto también puede indicar un problema de VREF.

respondido por el Daniel V

Lea otras preguntas en las etiquetas