ADC STM32L476RG: Warum habe ich einen Offset, wenn ich an 0 V angeschlossen bin?

Ich arbeite an einer Softwarelösung, die den Pin PC2 auf "Zurücksetzen" setzt, wenn mein Eingangssignal (an ADC angeschlossen) über 2 V liegt.

Ich teste meinen Code mit STM32 Studio, um die digitale Ausgabe meines ADC in Echtzeit zu sehen.

So habe ich den ADC1 konfiguriert:

  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;

Ich kann die Ausgabenummer meines ADC mit DMA richtig abrufen, aber ich habe ein elektronisches Problem, denke ich:

In Nucleo STM32L476-RG sind die ADC1-Kanäle 1 und 2 mit den Pins PC0 und PC1 verbunden.

Wenn ich den Pin PC1 mit dem STM32L4 GND und den Pin PC0 mit 3,3 V verbinde, kann ich den 4095- Wert vom ADC abrufen , das ist gut.

Aber wenn ich den Pin PC0 mit GND oder einer 0-V- Quelle verbinde, sollte der ADC mir den Wert 0 zurückgeben , aber er gibt den Wert 1981 zurück .

Zum Lebenslauf:

Eingang von ADC1: 3,3 V | Ausgang von ADC1: 4095 | Konfig: PC1 auf GND; PC0 auf 3,3 V
Eingang von ADC1: 0 V | Ausgabe von ADC1: 1981 | Konfig: PC1 auf GND; PC0 auf 0V/GND

Ich weiß nicht, warum ich diesen Offset habe. Ich habe das Datenblatt tausendmal gelesen, STMicroElectronics erwähnt eine 0-V-Referenz namens VSSA oder VREF , aber ich verstehe nicht, wie ich meine Pins verbinden soll.

Die einzigen Pins, die ich verwende, sind PC0 und PC1. Sollte ich eine andere PIN mit Masse oder irgendetwas verbinden? Hatte jemand dieses Problem schon mal?

Ist es Ihr individuelles Board oder etwas im Handel erhältliches? Kannst du einen Schaltplan posten?
Ja ist es ! Es ist ein Nucleo 64 STM32L476RG, der von STMicroElectronics vertrieben wird. Datenblatt hier verfügbar: st.com/content/ccc/resource/technical/document/datasheet/c5/ed/…

Antworten (1)

Eigentlich funktioniert alles einwandfrei. Sie haben gerade den ADC im Differentialmodus konfiguriert, sodass er die Differenz zwischen PC0 und PC1 misst. Diese Differenz kann positiv oder negativ sein, je nachdem, ob PC0 größer als PC1 oder PC1 größer als PC0 ist. Wenn sie gleich sind, liegt der ADC-Wert in der Mitte, was Sie mit dem Wert von 1981 beobachten (ungefähr die Hälfte der vollen Skala von 4096).

Ändern Sie die Konstante ADC_DIFFERENTIAL_ENDED, um den ADC in den Single-Ended-Modus zu versetzen (Messungen relativ zu VREF), wenn Sie dieses Verhalten nicht wünschen.

Du hast meinen Tag gerettet ! Vielen Dank, das war die richtige Antwort