ADC STM32L476RG: ¿Por qué tengo un desplazamiento cuando estoy conectado a 0V?

Estoy trabajando en una solución de software que configura el Pin PC2 en "estado de reinicio" si mi señal de entrada (conectada a ADC) está por encima de 2V.

Probé mi código con STM32 Studio para ver en tiempo real la salida digital de mi ADC.

Así es como configuré el ADC1:

  hadc3.Instance = ADC1;
  hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV6;
  hadc3.Init.Resolution = ADC_RESOLUTION_12B;
  hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc3.Init.EOCSelection = DISABLE;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = ENABLE;
  hadc3.Init.NbrOfConversion = 1;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.NbrOfDiscConversion = 0;
  hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc3.Init.DMAContinuousRequests = DISABLE;
  hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc3.Init.OversamplingMode = DISABLE;

sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;

Puedo recuperar correctamente el número de salida de mi ADC con DMA pero creo que tengo un problema electrónico:

En Nucleo STM32L476-RG, los canales 1 y 2 del ADC1 están conectados al pin PC0 y PC1.

Cuando conecto el pin PC1 al STM32L4 GND y el pin PC0 al 3.3V , puedo recuperar el valor 4095 del ADC, eso es bueno.

Pero, cuando conecto el pin PC0 a GND o una fuente de 0V , el ADC debería devolverme el valor 0 pero no lo hace, devuelve el valor 1981 .

Para currículum:

Entrada de ADC1: 3,3 V | Salida de ADC1: 4095 | Configuración: PC1 en GND; PC0 en
entrada de 3,3 V de ADC1: 0 V | Salida de ADC1: 1981 | Configuración: PC1 en GND; PC0 en 0V/GND

No sé por qué tengo este Offset. He leído la hoja de datos miles de veces, STMicroElectronics menciona una referencia de 0 V que se llama VSSA o VREF, pero no entiendo cómo conectar mis pines.

Los únicos pines que uso son el PC0 y el PC1. ¿Debo conectar otro PIN a tierra o algo así? Alguien tuvo este problema antes?

¿Es su tablero personalizado o algo disponible comercialmente? ¿Puedes publicar un diagrama de circuito?
Sí, lo es ! Es un Nucleo 64 STM32L476RG comercializado por STMicroElectronics. Hoja de datos disponible aquí: st.com/content/ccc/resource/technical/document/datasheet/c5/ed/…

Respuestas (1)

La verdad es que todo funciona perfectamente. Acaba de configurar el ADC en modo diferencial para que mida la diferencia entre PC0 y PC1. Esta diferencia puede ser positiva o negativa dependiendo de si PC0 es mayor que PC1 o PC1 es mayor que PC0. Cuando son iguales entre sí, la lectura de ADC está en el medio, que es lo que está observando con el valor de 1981 (aproximadamente la mitad de la escala completa de 4096).

Cambie la constante ADC_DIFFERENTIAL_ENDED para poner el ADC en modo de terminación única (medidas relativas a VREF) si no desea este comportamiento.

Me has alegrado el día ! muchas gracias era la respuesta correcta