Hallo,
ich hab ein Problem mit meinem ADC auf dem Xmega 16A4U.
Bei der Nachkontrolle meier AD-Wandlerroutine ist mir eine enorme
Unstetigkeit bei meinem Wandler aufgefallen.
Gemessen wird eine Spannung über einen Spannungsteiler (2k/127k).
Soll Signed und 12Bit sein, was dann ja 2047 entsprechen soll.
Bis ziemlich genau 512 Digit passen die Werte relativ genau, knapp über
512 Digit fangen die Ausgangswerte extrem zu schwanken an(ca. zw. 490
und 690), was sich dann bei wieder höherer Messspannung wieder ruhig
wird, aber dann einen enormen Offset zu den theoretisch "richtigen"
Werten aufzeigt.
Sowohl eine Änderung von interner (Bandgap) zu externe Ref.Spannung
helfen nicht und zeigen gleiches Problem.
Hat von euch jemand ne Ahnung woran das liegen könnte.
Schon mal Danke für Eure Ideen... mir gehen se langsam aus;(
1
ADCA.CTRLA=0x01;ADCA.CTRLB=ADC_CONMODE_bm|ADC_RESOLUTION_12BIT_gc;// signed 12 Bit
Sepp schrieb:> Gemessen wird eine Spannung über einen Spannungsteiler (2k/127k).
Es kann gut sein, das das zu hochohmig für den ADC Eingang ist. Als
schnellen Test kannst du mal 1 nF parallel zum 2k (ich nehme an, der ist
das untere Ende des Spannungsteilers) schalten und sehen, ob sich die
Werte verbessern. Wenn ja, lässt du den C entweder drin, wenn dir das
aber die Abtastung zu sehr verschleift, füge einen OpAmp als
Spannungsfolger ein.
Du kannst auch mal die Abtastrate verringern und schauen, ob das was
ändert.
Servus,
vielleicht ein Ansatz.
Hatte das Problem bei einem LM3S, das an anderen Pin's (Digital) die
3,3V überschritten wurden. Anscheinend hatte sich das auf irgend einen
internen Weg auf den ADC ausgewirkt. Und hat dann falsche Werte
geliefert.
Die Werte begrenzt und schon gings.
Aber ob das natürlich bei dir so ist ...... kann ich dir nicht sagen.
Aber halt vielleicht ein Ansatz.
Gruß
Stumpf
Also Spannungsteiler wurde testweise schon verringert, und Controller
getauscht mit gleichem Ergebnis.
Interessant ist aber dass beim Austausch gegen einen Xmega 16D4 alles
funktioniert wie es soll... Wenn auch ein größeres Grundrauschen dabei
ist.
Bisher gabs nur wildes Rätselraten.
Beschreibe doch mal dein DRUMHERUM etwas genauer.
Erst mal fällt auf, dass du 12 Bit mit 2047 in
Verbindung bringst: Mit 12 Bit lassen sich 4096
Zustände von 0...4095 darstellen!
Software:
- Werden die 12 Bit richtig vom ADC ausgelesen?
(ADLAR & Co) ???
- Werden die 12 Bit richtig verarbeitet?
Da könnte eine Software-Simulation mit
Werten von 0...4095 in "krummen" Steps von
z.B. 0, 37, 74, ... helfen.
Schaltungstechnik:
- Wie veränderst du die zu messende Spannung?
Kratzendes Poti?
- Hast du ein Messgerät parallel?
Achso: Signed und +/- 2047 haut bei 12 Bit etwa hin.
Bist du sicher, dass du das Vorzeichen auch passend
anwendest? Also erst mal das Vorzeichen des ADC-Werts
auf 16 Bit ausdehnen, DANN im 16-Bit-Mode weiter-rechnen!
Zur Hardware:
Der Controller hängt an ner 24V Versorgung und ich messe "Highside" an
dem 2k Widerstand. Controllermasse macht n lm337 auf ca. -3,3V von den
24v runter.
Daher auch der Differenzielle Mode mit positivem Adc-Pin 7 auf den 24v.
Adc-register wurden auch schon manuell ausgelesen und verarbeitet... Da
entsteht der Fehler nicht.
Messgerät bzw. Oszi hingen auch schon mal dran aber ohne große
Erkenntnis... Messspannung sieht sauber aus.
Messspannung ändert sich abhängig von der Eingangsspannung 24v +-
....aber Poti auch mit selben Ergebnis getestet.
Der Eingangswiderstand vom ADC ist bei 2msps ist schon recht klein.
für n-Bit Genauigkeit:
mit R_channel+R_switch ~4,5k, Csample = 4,4pF und 3 Bit Genauigkeit
kommt man da also auf: 47kOhm, wenn ich mich nicht verrechnet habe.
Zudem sind 2 msps schon recht sportlich.
Achja die Kalibrierungsregister scheinst du auch nicht beschrieben zu
haben:
1
uint8_tReadCalibrationByte(uint8_tindex){
2
uint8_tresult;
3
4
/* Load the NVM Command register to read the calibration row. */
Tom schrieb:> muss der Widerstand für eine höhere Genauigkeit höher sein?!?
Der Widerstand der zu messenden Quelle? Nein
> ICh dachte, je niedriger, desto besser?!
ja R_source <= 47k für >=3 bit genauigkeit
Zeichne dir mal den Innenwidestand des ADC an deinen Spannungsteiler
ran, und überleg/rechne mal wie sich dein Spannungsteiler dann verhält.
k.a worauf Du hinaus willst, ich frage ja für ne schnelle Antwort. egal
muss jetzt sowieso los.
Die Quelle ist neiderohmig natürlich immer bessser.
Wenn ich mit nem Opaamp messe kann ich das notfalls mit nem
Spannungsfolger verbessern..logisch abre wenn ich dann direkt mit dem
OPAmp Ausgang auf den ADC Eingang gehe ist das schelcht?
Sepp schrieb:> Hat von euch jemand ne Ahnung woran das liegen könnte.
Am ATXmega. Ich hatte mit den Sch...teilen auch riesige Schwierigkeiten.
Tom schrieb:> muss der Widerstand für eine höhere Genauigkeit höher sein?!?> ICh dachte, je niedriger, desto besser?!
Je höher der Widerstand, desto höher das Rauschen.
Bin auch gerade am erproben des Xmegas und ebenfalls auf das Problem
gestoßen.
Bei mir ist es nicht ganz so auffällig. Ist mir nur durch einen relativ
großen Offset im Endberreich aufgefallen.
Ich nutze den Free-running-mode, differenziell und hab auch nen Sprung
in meiner Wertelinie.
Liegt auch etwa bei 500 ( ab ca. 530 Sprung auf ca 590) und hab dann
auch n offset von ca 60-70 digits für den Rest der Kennlinie.
Gibts da schon ne Lösung für das Problem?
Ich habe auch einen ADC Pin auf Vcc liegen und messe nur negativ.
Hallo
Ein Schuss ins Blaue, aber laut Datenblatt empfiehlt Atmel bei
Verwendung des ADC die "Input/Sense Configuration" für den jewaligen PIN
auf "Digital input buffer disabled" zu stellen.
Siehe XMegaAU Manual Abschnitt 13.13.15
da1l6
Zwar schon wieder länger her als ich mit denen zu kämpfen hatte, aber
müssen die Eingänge nicht weiter von der Versorgung weg. Also nicht
direkt auf Vcc legen!
Danke erstmal für die Tips, aber das Richtige war noch nicht dabei.
Hab schon einige Konfigurationen durch und auch die Tips überprüft...
aber immer zwischen 500 und 600 taucht der Fehler auf und er
"überspringt" ein paar Bits. Mal nur 50 mal gleich 150.... einfach zum
ko.....
@alex:
Laut Spezifikation ist diese Betriebsart erlaubt... wenn auch die
falsche Wahl.
Wenn ich einen Eingang auf Masse leg funktioniert er wie er soll ohne
große Abweichungen.
Noch kurze Anmerkung zu meiner Lösung:
Nachdem ich schon interne Bandgap, Ucc/2 und eine externe
Referenzspannung (1,225V/ 0,1%) ohne großen Erfolg getestet habe, bin
ich nun doch noch auf die glorreiche Idee einer weiteren externen
Spannungsreferenz gekommen.
Und sieh da: Mit ner 2,048V (1%)externen Referenz ist der Fehler weg!
Vieleicht hilfts ja irgendwann mal jemanden auch weiter.