Forum: Mikrocontroller und Digitale Elektronik Problem bei bipolarer differnzieller AD-Wandlung mit ATtiny44


von Philipp M. (spannungsabfall)


Lesenswert?

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

von Kai S. (kai1986)


Lesenswert?

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

von Philipp M. (spannungsabfall)


Angehängte Dateien:

Lesenswert?

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.

von Kai S. (kai1986)


Lesenswert?

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

von Philipp M. (spannungsabfall)


Angehängte Dateien:

Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Philipp M. (spannungsabfall)


Lesenswert?

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.

von Kai S. (kai1986)


Lesenswert?

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

von Philipp M. (spannungsabfall)


Lesenswert?

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
Noch kein Account? Hier anmelden.