es ist mein erstes Projekt mit dem STM32(WB5MMG) (sonst viel Atmega`s).
Ich brauchte zwar nur 6x grobe Temperaturmessungen und habe daher einen ntc10k und einen 10k als Spannungsteiler an den adc geschlossen.
Die Referenz ist absolut glatt bei 3,3V (zumindest laut Fluke Multimeter).
Die ausgelesenen Werte schwanken um ca.10 digits, das bin ich vom Atmega bei gleichem Messprinzip nicht gewohnt.
Ist dies ein typisches Bild oder vermutet ihr eher Einstellungsprobleme mit dem adc ?
Ich habe den ADC im Cubeide eigentlich nur aktiviert (single conversion), sonst keine Änderungen vorgenommen.
Die Referenz ist absolut glatt bei 3,3V (zumindest laut Fluke
Multimeter).
Keine HF Peaks von einem Schaltwandler drauf? Mit Oszi und AC Kopplung ansehen, oder Fluke AC Messung, falls das breitbandig genug ist.
100nF Folie am REF Input und am Messeingang probieren, ob es besser wird.
Liegt Ref- auf sauberer Masse?
NOTE: ADC accuracy vs. negative injection current: injecting a negative current on any analog input pins should be avoided as this significantly reduces the accuracy of the conversion being performed on another analog input.
Auf was steht denn die "Sampling Time" unter Rank bei den Channels. Das ist die Zeit für das Sample and Hold. Wenn die zu niedrig ist, tritt solches Verhalten gerne mal auf, vor allem bei hochohmigen Quellen.
Für mehrere Kanäle bietet sich der DMA Modus an, das ist praktisch Fire & Forget
Für Temperaturmessungen muss man den ADC nicht mit Endgeschwindigkeit (sprich ADC Clock) betreiben. Herabsetzen des Taktes ist entspannt möglich, vor allem im DMA Modus, da man dann nicht auf jedes Ergebnis warten muss.
Keine HF Peaks von einem Schaltwandler drauf? Mit Oszi und AC Kopplung
ansehen, oder Fluke AC Messung, falls das breitbandig genug ist.
Oszi muss ich am Dienstag aus der Firma mitnehmen, habe kein zuhause.
Es ist jedoch eine Batterieanwendung, in der der uC nur kurz Werte prüft und sonst schlafen soll, weshalb ein Linearwandler drauf ist.
Also aktuell keine PWM, kein Schaltregler und gespeist aus Batterie.
an allen Versorgungen liegen 100nF Kerkos.
Ref- ist auf gutem Platinen-GND
Für mehrere Kanäle bietet sich der DMA Modus an, das ist praktisch
Fire & Forget
Guter Hinweis, aber bezüglich der Genauigkeit macht das kein Unterschied, richtig ?
Hardware:
Ich habe jedoch evtl. folgenden HW-Fehler begangen:
Da ich nur grobe Messungen brauche (Übertemp-Schutz), habe ich dem ADC keine separate Präz-Referenzspannung gegönnt, sondern mit auf die uC Versorgung gelegt.
Weiterhin kommt die Versorgungsspannung der NTC`s aus einem Ausgang des uC.
Es soll halt alles möglichst wenig Strom verbrauchen, weshalb ich alles abschalte und nur zeitweise prüfe.
Ich hätte trotzdem nicht mit dieser Ungenauigkeit gerechnet, aber evtl. geht es durch den HW-Aufbau nicht anders.
Weiterhin kommt die Versorgungsspannung der NTC`s aus einem Ausgang des
uC.
Es soll halt alles möglichst wenig Strom verbrauchen, weshalb ich alles
abschalte und nur zeitweise prüfe.
Wieviel Leitung ist denn zw. NTC und µC?
Mache doch mal einen C an den ADC-Eingang direkt am ADC. Kann ruhig weit in den µF-Bereich gehen (zumindest für'n Test) ...
in den µF-Bereich gehen (zumindest für'n Test) ...
Ich habe 100nf direkt am Eingang.
Grad zum Test 10uF dazu, keine Veränderung.
Die NTC`s sind zwischen 5cm und 30cm entfernt, jedoch gut geschützt umgeben von Akkuzellen im Zwischenraum der Zellen.
Ich habe quasi eine Sonde mit NTC´s welche in einem der Zwischenräume auf ganzer Länge steckt.
Für mehrere Kanäle bietet sich der DMA Modus an, das ist praktisch
Fire & Forget
Guter Hinweis, aber bezüglich der Genauigkeit macht das kein
Unterschied, richtig ?
Insofern doch, als das du die Samplingrate (ADC Clock) deutlich reduzieren kannst, ohne auf ein ADC Ergebnis warten zu müssen. Du holst das Ergebnis ab, wenn du möchtest und nicht, wenn der ADC dann soweit wäre.
Da ich nur grobe Messungen brauche (Übertemp-Schutz), habe ich dem ADC
keine separate Präz-Referenzspannung gegönnt, sondern mit auf die uC
Versorgung gelegt.
Weiterhin kommt die Versorgungsspannung der NTC`s aus einem Ausgang des
uC.
Wird es besser wenn Ref+ nicht mit Vdd, sondern mit dem Ausgang verbunden wird, der die NTC Teiler versorgt? Auch da sollten 10-100nF Folie eingesetzt werden. Wenn das der Ausgang nicht verträgt notfalls mit Vorwiderstand und 10 Tau Delay. Da nur das Verhältnis gemessen wird, ist die Absolutspannung egal solange es während der A/D Messung konstant ist.
STM32 und stark wackelnder ADC, da kommt bei mir sofort das Stichwort „Calibration“ hoch. Es gibt doch bei jedem STM32 mit 12bit diese ADC Calibration Prozedur, der man beim ersten Kontakt nur wenig Beachtung schenkt. Bei Calibration denkt man an bessere Genauigkeit (die man oft nicht braucht), allerdings löst die Prozedur genau das Problem mit dem Wackeln.
Weiterhin kommt die Versorgungsspannung der NTC`s aus einem Ausgang des
uC.
Es soll halt alles möglichst wenig Strom verbrauchen, weshalb ich alles
abschalte und nur zeitweise prüfe.
Wieviel Leitung ist denn zw. NTC und µC?
Mache doch mal einen C an den ADC-Eingang direkt am ADC. Kann ruhig weit
in den µF-Bereich gehen (zumindest für'n Test) ...
Bei solchen Experimenten kommen mir sofort die "setteling time" und vor allem "input impedance" in den Sinn. Die ist bei den S&H-ADC erschreckend gering. Mit dem üblichen 10k NTC am Spannungsteiler wird es schon nur schätzen...
Also entweder langsamer im Batch 10..20 Werte holen und mitteln, oder einen µP-OPV davor klemmen, der genug Bums in den ADC drückt, wenn Einzelmessungen gemacht werden.
Bei dem SigmaDelta ADC vom STM32 haben wir vor Jahren mal ganz böse Erfahrungen gemacht, dass sich zB das Oversampling nicht abschalten ließ.
Eine Messung eines per Relais erzeigten Signalsprungs sah in den ADC-Werten aus wie eine Forierrekonstruktion des Signals. Inklusive voreilendem Ausholen des Signals vor dem Spung.
Von daher würde ich auch bei den S&H-Brüdern erst mal mit einer Referenzquelle messen und einstelln...
Und dann die Calibration wieder rausgenommen? Warum?
Wenn es um 10 digits wackelt würde ich vlt. auf Dauer auch mitteln, vorher aber mit allen Mitteln versuchen, der Ursache auf den Grund zu gehen. Da machst Du aus Deinem 12bit Wandler ein 9..10bit Wandler.