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.
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?
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?
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.
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).
> 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
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.
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)!
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.
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.
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!