Forum: Mikrocontroller und Digitale Elektronik STM32G474. STM32CubeIde, Optimierung ADC-Genauigkeit


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Uli N. (uln)


Lesenswert?

Nachdem ich den STM32G474 vom NUCLEO Board runter und ihn auf
unserer eigenes Board gelötet habe, bin ich wieder mal an der
ADC-Programmierung.

Obwohl ich diesmal von Anfang an die Kalibrierungsequenz
in meiner ADC1-Initialisierung vorgesehen habe, weichen
die angelegten und mit dem ADCC1 ermittelten Werte doch
erheblich voneinander ab.

Am Spannungsteiler plus Impedanzwandler liegt es nicht,
da die am ADC12_IN8 gemessene Spannung doch sehr gut
mit der berechneten übereinstimmt (Spalte 2 und 3) -
die mit dem ADC ermittelten Werte und damit mithin
vom ADC1 gemessenen Werte weichen dann jedoch erheblich
von den Vorgaben ab, sobald die Eingangsspannungen etwas
größer werden.
1
       |       |calculated|        |measured|measured
2
  Vin  |  Vin8 |   Vin8   |AD-value|  Vin8  |   Vin
3
-------|-------|----------|--------|--------|---------
4
 40.0V | 103mV |  104mV   |  125   | 101mV  |  38.6V
5
 60.0V | 155mV |  157mV   |  198   | 160mV  |  61.1V
6
 80.0V | 207mV |  209mV   |  269   | 216mV  |  83.0V
7
100.0V | 260mV |  261mV   |  339   | 273mV  | 104.0V
8
120.0V | 312mV |  313mV   |  413   | 333mV  | 127.4V 
9
140.0V | 364mV |  366mV   |  484   | 390mV  | 149.3V

ADC1 arbeitet mit 42.5MHz, die Samplezeit wurde
auf 24.5 Zyklen gesetzt.

Ich habe in der Dokumentation jetzt keinen Hinweis gefunden,
dass eine Gain Kompensation für ein sinnvolles Arbeiten des
ADCs ebenso notwendig wäre, wie die oben erwähnte
Kalibrierungssequenz!?

Auch konnte ich bislang keine detailierte Beschreibung der
Kalibrierungswerte in der System Memory Area finden, um
zu sehen, ob u.U. auch für das ADC_GCOMP Register ein
"Factory Trimming Value" vorhanden ist!?

Hat jemand dazu oder zu weiteren Fehlerquellen Hinweise?

von Bikini Zupfer (Gast)


Lesenswert?

Uli N. schrieb:
> zu weiteren Fehlerquellen Hinweise?

PCB-Design, schlecht entkoppeltes analog GND,

von M. Н. (Gast)


Angehängte Dateien:

Lesenswert?

Uli N. schrieb:
> ADC1 arbeitet mit 42.5MHz, die Samplezeit wurde
> auf 24.5 Zyklen gesetzt.
>
> Ich habe in der Dokumentation jetzt keinen Hinweis gefunden,
> dass eine Gain Kompensation für ein sinnvolles Arbeiten des
> ADCs ebenso notwendig wäre, wie die oben erwähnte
> Kalibrierungssequenz!?

Jein. Der ADC hat natürlich einen Rest-Offset + Sensitivitätsfehler. 
Angehängt der entsprechende Ausschnitt aus dem Datebnblatt.

Wenn man jetzt also worst-case von 7LSB Fehlern ausgeht, dann sind das 
bei 3V3 Referenz: 5.6 mV. Das ist aber Worst case und mit allen Fehlern, 
soweit ich das sehe. Dein Fehler ist nochmal ne Nummer größer. Ist deine 
Refernz stabil?

Alternativ um es zu debuggen:

Rauscht dein Wert? Was passiert, wenn du einen Mittelwert über mehrere 
Messungen rechnest?

Ich nutze einen STM32F407 (leider etwas anders) und komme mit folgendem 
Verfahren auf sehr sehr gute Ergebnisse: "8 Samples messen. Die zwei 
extremsten Werte verwerfen. Mittelwert über die restlichen 6 Werte". 
Mittels externer Referenz ließ sich dann auch das Rauschen auf +-2 LSB 
verringern, trotz suboptimaler Leiterplatte und externen Störungen.

Misst du parallel mit diesem ADC noch andere Kanäle? Eventuell ist die 
S&H-Zeit zu kurz, wenn du die Kanäle um-muxt. Das hatte ich mal. Siehe: 
Beitrag "STM32F407 ADC Übersprechen zwischen Kanälen"

Alternativ kannst du auch mal auf die interne Referenzmessung 
umschalten. Was misst du dann?

von Uli (Gast)


Lesenswert?

Da die 3.3V-Version des LM5166 nicht lieferbar war, wird der der 
STM32G474
nun von der 5V-Version gefolgt von einem genauen Längstregler versorgt,
die VREF+ nochmal gefiltert und mit Stützkondensatoren (100nF/1uF) nahe
am Pin geblockt - steht wie 'ne eins bei 3,300V.

Egal ob ich einen Einzelsample, einen mittels vierfach-Oversampling oder
einen zusätzlich gefilterten Wert lese, ich lese immer den selben Wert,
also z.B. die 484.

Ich lese 10 Kanäle, vier davon momentan als Platzhalter für weitere
Eingangssignale in einer aufgebohrten Applikation doppelt - von daher
macht es Sinn die Samplezeit mal versuchsweise zu erhöhen, auch wenn
ich wenig Hoffnung habe, dass das hilft, da sich die Werte der doppelt
erfassten Kanäle immer exakt gleichen.

Das mit der internen Referenz schaue ich mir auch an - bringt
vielleicht sogar Vorteile, wenn mal wirklich die 3.3V-Version des LM5166
zum Einsatz kommt.

von Uli N. (uln)


Lesenswert?

Erhöhung der Samplezeit ändert nichts - Spannung eingeschaltet, wie 
gestern ausgeschaltet und ich lese eine AD-Wert von 485 (gestern 484, 
aber das Mulitmeter wechselt heute seine Anzeige auch zwischen 140.0V 
und 140.1V).

: Bearbeitet durch User
von Olaf (Gast)


Lesenswert?

> Ich lese 10 Kanäle, vier davon momentan als Platzhalter für weitere
> Eingangssignale in einer aufgebohrten Applikation doppelt - von daher

Wenn du die Kanaele umschaltest, wartest du dann auch etwas oder 
verwirfst die erste Messung? Sonst arbeitet der ADC nicht richtig weil 
die Spannung am Ausgang des Multiplexer erst auf den richtigen Wert 
steigen muessen.

Olaf

von Franz (Gast)


Lesenswert?

Noch eine Möglichkeit:
Für jedes Sample wird dem Eingangssignal eine Ladungsmenge entzogen bzw. 
hinzugefügt, je nachdem ob die Eingangsspannung größer oder kleiner 
VCC/2 ist. Das verschiebt den Spannungspegel in Abhängigkeit vom 
Eingangswiderstand, Eingangskapazität, Sample&Hold-Kapazität und der 
Sample-Frequenz mehr oder weniger. Der Effekt lässt sich gut berechnen.
Welche Rolle das hier spielt kann auf zig Arten praktisch geprüft 
werden. Z.B. könnte man testweise einen 10nF parallel zum ADC-Pin legen 
und bestimmen um wieviel die Multimeterspannung (am ADC-Pin!) dann 
besser zum gleichzeitig gemessenen ADC-Wert passt.

von Uli N. (uln)


Lesenswert?

Wie oben schon erwähnt, ändert das Verdoppeln der Samplezeit von
ca. 550ns auf 1100ns die ausgelesenen Werte in keiner Weise,
so dass mein Problem eigentlich nichts mit der Multiplexerei zu tun 
haben kann.

Ich hab jetzt ein zweites Board provisorisch mit einer CAN-Schnittstelle 
versehen und lese mit dem Board für 140.0V praktisch den gleichen Wert 
(485) ein (allerdings bei einer etwas kleineren Referenzspannung - 
3.264V).

Dann eröffnete mir der Layouter, dass er vergessen hat, auf dem Board
AGND mit GND an einer Stelle zu verbinden - dachte schon, das war's - 
aber leider nicht - mit einer Brücke zwischen AGND und GND erhöht sich
die Abweichung ein wenig - ich lese jetzt mit Board1 496 und mit Board2 
497 (bisher 484 und 485)!

: Bearbeitet durch User
von user934300 (Gast)


Lesenswert?

Viele STM32 haben einen Fehler im ADC. Wenn zuviel Zeit zwischen der 
letzten Messung (oder der Kalibrierung) liegt, dann ist die neue Messung 
falsch. Man muss mehrmals hintereinander mussen und den ersten Wert 
verwerfen.
Schau mal ins Erratasheet deines Controllers.

von Franz (Gast)


Lesenswert?

Uli N. schrieb:
> Wie oben schon erwähnt, ändert das Verdoppeln der Samplezeit von
> ca. 550ns auf 1100ns die ausgelesenen Werte in keiner Weise,
> so dass mein Problem eigentlich nichts mit der Multiplexerei zu tun
> haben kann.

Beim Umschalten auf einen anderen ADC-Eingang ändert sich der Pegel vom 
Sample&Hold. Es entsteht ein Meßfehler der von der Differenzspannung 
beider Eingänge abhängt. Das Verdoppeln der Samplezeit ändert daran im 
Prinzip nichts. Wie groß der Effekt ist hängt unter anderem von deiner 
(mir unbekannten) Beschaltung ab. Falls das das Problem ist, kann man 
sich dadurch helfen, dass man einen Dummy-Sample auf einem Kanal mit 
fester Spannung hinzufügt. Die Trennung wird dadurch fast perfekt.

von Uli N. (uln)


Angehängte Dateien:

Lesenswert?

Hier mal noch die ADC1-SFRs nach der Initialisierung.
Beim Board1 hat CALFACT den Wert 0x39.

von Uli N. (uln)


Lesenswert?

user934300 schrieb:
> Viele STM32 haben einen Fehler im ADC. Wenn zuviel Zeit zwischen der
> letzten Messung (oder der Kalibrierung) liegt, dann ist die neue Messung
> falsch. Man muss mehrmals hintereinander mussen und den ersten Wert
> verwerfen.
> Schau mal ins Erratasheet deines Controllers.

Zuviel Zeit zwischen der letzten Messung und der aktuellen liegt bei mir 
nicht, da ich alle 125us eine Datensatz erhebe.

Allerdings errata 2.7.2 "ADC input channel switching disturbs ongoing 
conversions" schlägt bei mir zu, da ich den single conversion mode 
benutze.

Verdammt ärgerlich, diese Tendenz, sau komplizierte Modi in den 
"Peripherals" zu unterstützen und dabei dann Fehler in die gängigen 
Verfahren einzubauen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.