Problem mit bipolarem ADC im ATtiny44A Hallo Leute, ich habe ein Problem mit dem bipolaren differenziellen Modus des Analog-Digital-Wandlers des ATtiny44A Ich habe einen Aufbau bei dem die Pins ADC7 als auch ADC6 jeweils an einem Poti (10k) hängen mit dem das Potential der Pins zwischen 0V und VCC (5V) verändert werden kann. Ferner habe ich den ADC so konfiguriert, dass er die beiden Kanäle differnziell auswertet (ADC7 ist positiv) und zwar im bipolaren Modus. Gain = 1x, Referenz ist Vcc, und Prescaler ist 128 (bei 20 MHz macht das 156,25kHz ADC-Clock). Die Werte gebe ich zum Test auf einem HD44780-Display aus. Der Ausgabewert soll also die Differenz der beiden Pegel sein. Wenn ADC7=5V und ADC6=0V erwarte ich einen Wert von 511 (0x01FF) Wenn ADC7=0V und ADC6=5V erwarte ich einen Wert von -512 (0x0200 beachte 2er-Komplement und das die obersten 6 Bit immer 0 sind) Sind die Werte gleich erwarte ich einen Wert um die 0 (Bei Null sollte die HEX-Darstellung einen Spung von 0x03FF nach 0x0000 machen) Nun Zeigt der AD-wandler ein sehr seltsames verhalten: Im Breich positiver Werte funktioniert es zunächt einwandfrei und auch der Anfang des negativen Bereichs geht. Sobald ich aber den ADC6 Kanal deutlich höher lege als den ADC7, also ein relativ großer negativer Wert ausgegben wird, scheint irgend etwas fundamental schief zu laufen. Der Ausgabewert macht unterhab von ca. -345 (0x02A6 ind ADC Register)einen plötzlichen Sprung nach -490 (0x0215 im ADC Register) Von da an scheint sich irgendwas komplett verstellt zu haben. Wenn man nun an den maximalen Positiven Anschlag fährt (ADC7=5V, ADC6=0V) wird nur noch maximal der Wert -80 (0x03B0) ausgegeben. Dazwischen scheint es einen linearen zusammenhang zu geben nur jetzt eben mit diesem neuen Wert -80 als Maximalwert und nicht mehr +511. Jetzt kommt das Erstaunlichste: Bringt man den Differnzpegel wieder auf einen Wert etwas über diser Sprungstelle und wechselt dann die Refernzspannung zur internen 1.1V-Refernz und wieder zurück zu Vcc hat man wider das alte Verhalten (max. wert bei ca. +511), bis ein erneutes unterschreiten der schwelle erneut alles dureinander wirft. Nimmt man stets die 1.1V-Refernz tritt das Problem übrigens nicht auf, egal wie man die beiden Signalpegel wählt. Nur hat man so eben leider nicht die volle Dynamik von +/- 5V Differenz. Hat jemand eine Erklärung dafür? Ich habe das Verhalten an zwei verschiedenen ATtiny44A beobachten können. Stelle ich mich nur dumm an und habe etwas über sehen, oder bin ich tatsächlich auf einen Bug gestoßen. Gruß Spannungsabfall
Hallo, da das Datenblatt von der Rev H als neustes spricht und keine bekannten Fehler angibt und es nur ein kleiner µC ohne ewig viele Funktionen ist hätte ich den Fehler eher in der Software gesucht. Es klingt fast so, als würdest du irgendwo was ungewollt überschreiben (ich hätte bei dem Sprungwert von 0x0215 eher auf 0x0200 getippt, da dabei im höheren Byte für die Darstellung ein weiteres Bit auf 1 springt). Da ich den Code nicht kenne, kann ich dir natürlich auch nicht sagen, an welcher stelle vielleicht was schief läuft. Gruß Kai
Ich habe mir alle Register des ADC anzeigen lassen. ADMUX, ADCSRA, ADCSRB, DIDR0. Alle bleiben unverändert. Die genauen Werte sind nicht exakt zu bestimmen, da sie stets schwanken. Ich habe nochmal genauer geschaut und glaube nun der Sprung passiert eher bei -360 (0x0298). Jedoch mache ich mir immernoch keinen Reim daraus. Hatte noch die Vermutung ob es am Display liegen könnte, dass mit am Aref Pin hängt (PA0-PA5 ist das Display). Also habe ich Das Display abgeklemmt und mir den Messwert des ADCs über eine 10-Bit PWM am Pin PA5 aufs Oszi ausgegeben. Das Problem bestand immernoch. Auch ein Kondensator an Aref oder das anlegen von Vcc über einen Widerstand hat nicht geändet. Wenn ich allerdings den ADC so konfiguriert habe, dass er Aref als Refernz nimmt und dann VCC mit Aref verbunden habe dann tritt ein anderes aber ähnlich komisches Verhalten auf. Wenn der Chip neu Programmiert wurde ist er von Anfang an in dem kleinen Dynamikbereich gefangen (also das verhalten was er bei VCC als Refernz erst nch dem Sprung hatte). Wenn man ihn jedoch dann auf einen niedrigen Ausgangswert fährt (etwa da wo vorher der Sprung war). Dann scheint sich wieder was zu verändern und plötzlich funktioniert er wie er soll und bleibt auch so. Also: Refernz ist Vcc: Anfangs gut - nach fahren in tiefen Bereich schlecht. Referenz ist Aref (verbunden mit Vcc) - anfangs schlecht dann dauerhaft gut. Auch bei Aref hilft das kurzzeitige Wechseln zur 1.1V Referenz. Danach läuft es dauerhaft gut. Dies wäre ein möglicher - wenn auch sehr unschöner - Workaraound. Mein Code ist angehängt.
Hallo, der Quellcode sieht soweit in Ordnung aus (mir ist jedenfalls kein Fehler aufgefallen). Was du trotzdem mal versuchen könntest: - Bei der Initialisierung des ADCs das Setzen des ADEN Bits einzeln ans Ende der Initialisierung setzen (also erst komplett konfigurieren und dann aktivieren). - Die Registerbits, die 0 sein sollen explizit auf 0 zu setzen, obwohl das der Ausgangszustand sein sollte. - Die Compileroptimierung für den C-Code deaktivieren, falls aktiv. - Testen, ob sich der ADC Wert (im kleinen Dynamikbereich nach dem Sprung) ändert, wenn du an einen anderen ADC Pin Spannung anlegst. (Nach Bauchgefühl würde ich behauten, das im ADMUX Register was schief läuft) Wenn davon nix hilft könntest du mal noch die Assamblerdatei hochladen, damit man sehen kann, was dem µC als Arbeitsanweisung gegeben wird (ist die *.lss Datei im Debug Ordner von AVR Studio). Am besten dann einmal mit deaktivierter und einmal mit aktivierter Compileroptimierung. Eine Alternaividee wäre sonst, die beiden ADC Eingänge einzeln auszuwerten und die Ergebnisse zu subtrahieren. Gruß Kai
Habe das jetzt alles mal Probiert. Leider ohne Erfolg. Die Dateien habe ich angehängt. Ich werde nun dazu übergehen die Eingänge einzeln auszuwerten. Das funktioniert auch mit AVCC als Referenz. Das ganze ist mir immernoch ein Rätsel. Aber vielleicht klärt es sich irgendwann mal auf.
Ich hab mir das Datenblatt nicht ganz durchgelesen. Aber +/-5V Differenz am Eingang erscheint mir irgendwie seltsam. Der Differenzverstärker müßte dann ja bei Gain=1 einen Hub von 10V an seinem Ausgang machen! Wie soll das gehen bei VCC=5V? Ich denke mal im Bipolarmode darf die Referenz maximal 2,5V (VCC/2) sein. Peter
Hi In AVR120: Characterization and Calibration of the ADC on an AVR http://www.atmel.com/Images/doc2559.pdf findet sich folgender Satz: Voltage differences from -VREF to +VREF therefore results in discrete output values from –512 to +511. MfG Spess
So hatte ich das auch verstanden. Differenz von -Vref hieße ja negativer Kanal auf Vref und positiver auf 0. Bei +Vref wäre es umgekeht. Aber selbst wenn ich eine falsche Vref hätte, die Tatsache, dass das Anlegen eines Signals innerhalb der Grenze 0V - Vcc irgendwelche Einstellungen verändert ist für mich untragbar.
Hallo, ich hab mir die Assamblerdatein mal angesehen und konnte auch da keinen Fehler erkennen. Ich werde sobald ich Zeit habe die Schaltung mal aufbauen und sehen, ob ich den Fehler reproduzieren kann. Weder allerdings diese Woche nicht mehr dazu kommen. Hast du das Problem auch, wenn du die Pins vertauschst, bzw. andere Pins verwendest? Im Zweifelsfall könntest du auch mal ne Mail an Atmel schreiben, vielleicht hat ja tatsächlich noch keiner den Fehler gehabt und ihn auch gemeldet. Gruß Kai
Erstmal vielen Dank für euren Einsatz. Ich habe es auch mit dem Pinpaar ADC7/ADC4 versucht mit dem selben Ergebnis. Ich habe jedoch festgestellt, dass ich meine Messaufgabe (geht um die Auswertung eines Piezos) auch sehr gut mit einem unipolaren Kanal lösen kann. Da ich bei meine Masterarbeit ziemlich unter Zeitdruck stehe, kann ich zur Zeit leider nicht viel Energie in die Analyse des möglichen Bugs stecken. Gruß Philipp
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.