Forum: Mikrocontroller und Digitale Elektronik ADC vom ATMega32 ungenau?


von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte ein Ladegerät bauen und habe Probleme mit dem ADC meines
Mega32. Zum testen lade ich über einen 10k Widerstand einen 1000µF Elko
und messe die SPannung am Elko.

Die Werte, die mir der ADC liefert sind allerdings für die Verwendung
in einem Ladegerät nicht so toll, weil sie eben doch ein gewisses
"Rauschen" oder "Zittern" zeigen.
Selbst wenn ich den ADC0 direkt an VCC anschließe bekomme ich das
"Zittern" nicht raus. Ich habe schon alle möglichen Methoden zum
Runden der Ergebnisse ausprobiert die mir eingefallen sind.

Der AVR hat alle benötigten Kondensatoren, ich verwende ein geschrimtes
Messkabel und auch die interne Refernzspannung bringt keine Besserung.

Er misst 6x hintereinander, addiert die Ergebnisse, prüft ob die Werte
auf- oder abgerundet werden müssen, multipliziert sie mit 10 und teilt
sie dann durch 6.
Mit 10 multipliziere ich damit bei der Dividion durch 6 nicht so viel
"verloren" geht... dachte ich jedenfalls weil z.B (11+12)/2 11,5 sind
und der AVR dann einfach nur eine 12 draus machen würde. Rechnet er aber
(11+12)*10/2 bekommt er 115 raus, hat die 5 also noch mitgenommen.

Den entscheidenden Codeschnippsel habe ich begefüft falls ihr es euch
mal ansehen möchtet.

Grüße,
Marco

von Marco (Gast)


Lesenswert?

Hier einmal ein Excel Digramm dass in blau die Spannung zeigt (in mV)
und in grün die Differenz (dU/dt) zum vorherigen Wert. Da die zeitliche
Differenz immer 1 (weil gleich) ist die Rechnung sehr simpel.

Sowohl die Umrechnung vom ADC Wert (*10) in mV als auch die Berechnung
der Differenz (z.B. (A2-A1)/1) macht Excel.

An der grünen Kurve kann man gut sehen dass die Messfehler nach unten
und nach oben ausschlagen.
Da das Ladegerät abschalten würde wenn die Steigung 0 ist (sich also
innerhalb der letzten beiden Messungen nichts getan hat) kann man sich
vorstellen dass es so wie es im Moment läuft nicht klappen kann. Die
Steigung von 0 würde durch die "Messfehler" schon viel früher
erreicht. Eventuell ist die Steigung sogar schon als negativ gemessen
bevor sie real überhaut 0 erreicht.

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Anhang vergessen

von Barti (Gast)


Lesenswert?

Mal eine kleine Idee in Richtung Hardware: Hast Du an alles gedacht?
Stromversorgnung am Controller mit 100nF abpuffern. AGND von GND
trennen und möglichst bei der Einspeisung zusammenführen. Im Datenblatt
ist meist eine Beschaltung von AREF über eine kleine Induktivität zu
finden, falls extern angeschlossen. Falls interne Referenz benutzt
wird, dann an AREF einen Kondensator gegen Masse schalten. Bei einem
Mega32 im TQFP unter den ADC-Pins eine Massefläche auf der anderen
Seite der Platine anbringen. Das hilft meist alles um Störungen zu
vermeiden. Hab keine schlechten Erfahrungen mit dem AVR ADC gemacht.
Sind glaub ich lt. Datenblatt auf 1 LSB genau. Bin aber jetzt zu faul
nachzusehen.

Ist die ADC-Taktfrequenz auch nicht über 200kHz? Das macht ihn auf die
letzten Stellen auch ungenau!

von A.K. (Gast)


Lesenswert?

Verstehe ich das richtig: Du wunderst dich ernsthaft darüber, dass der
ADC um +-1 bis +-2 Einheiten schwankt???

von Roland P. (pram)


Lesenswert?

Ich gleich sowas immer mit einem Software-Lowpassfilter aus, in dem ich
auf den/die vorherigen Messwerte zurück greife.

Messwert = (Messwert * 15 + ADC) / 16

Gruß
Roland

von A.K. (Gast)


Lesenswert?

Datasheet, Stichwort "ADC Noise Canceller".

Wie sieht die AVCC/AGND-Beschaltung exakt aus (bis hin zur
Leitungsführung)?

von Axel R. (Gast)


Lesenswert?

Ineressant:
in welchem Abstand finden deine Messungen statt?
Nimm 12 Messungen innerhalb einer Sekunde und addiere sie auf.
Den grössten und den kleinsten Messwert subtrahierst Du von deinem
Gesamtergebnis. und dann NICHT durch 10 Teilen.
(Hatten wir hier schon mal die Diskussion ->Oversampling)
Die Messungen alle Minute wiederholen, damit auch tatsächlich sicher
sein kannst, dass eine Änderung eintritt/eintrat.

von Marco (Gast)


Lesenswert?

@Barti:
Wie meinst du das mit dem Trennen? Ich habe GND und VGND direkt unter
dem DIP Gehäuse verbunden.
AREF und AVCC sind je über einen SMD Kondensator mit AGND verbunden.
Ist das so nicht richtig? Ich merke gerade dass ich mit darüber noch
garkeine Gedanken gemacht habe und dass vielleicht da auch der Fehler
liegen könnte... das ist immerhin mein allererstes Projekt in dem
halbwegs "genau" gemessen werden muss und dementsprechend kleine ist
meine Erfahung :)

Und noch eine Frage: Bei meinem "Messkabel" (hatte gerade nur 15cm
RG174 zur Hand) führe ich GND und nicht VGND an die Schirmung weil ich
GND und VGND verbunden habe... also auch nicht richtig?
Als Vorteiler habe ich mit 128 den größt möglichen gewählt.


@A.K.:
Dass der ADC um etwa +- 1 oder 2 LSB ungenau ist muss ich wohl wirklich
erst einsehen, ja :)
Und ich hoffe das durch Hard- und Softwarebasteleien so gut wie möglich
zu kompensieren.

Ich brauche die Spannung nicht auf's µV genau. Ich brauche nur einen
"butterweichen" Spannungsverlauf damit die Berechnung der
Ladeschlusserkennung nichts fehlinterpretiert.

Die Sache mit der "ADC Noise Reduction" im Sleepmode habe ich noch
nicht ans Laufen gebracht, bin mir um seine Existenz aber im klaren.
Das werde ich sobald ich Zeit habe auch nochmal testen.


@Roland Praml  und Axel Rühl:
Klingt interessant und ich werde es auf jeden Fall mal ausprobieren.
Sollte ja schnell mal getestet sein. Danke auf jeden Fall!

von A.K. (Gast)


Lesenswert?

"Ich merke gerade dass ich mit darüber noch garkeine Gedanken gemacht
habe"

Atmel hat darüber im Datasheet einige Seiten verbrochen, und evtl. auch
die eine oder andere Application Note (z.B. #40).

von A.K. (Gast)


Lesenswert?

"Als Vorteiler habe ich mit 128 den größt möglichen gewählt."

Was kommt dabei als ADC-Takt raus? Atmel schreibt ja 50-200KHz vor,
tiefer zu gehen macht's auch nicht genauer.

von Marco (Gast)


Lesenswert?

"Was kommt dabei als ADC-Takt raus? Atmel schreibt ja 50-200KHz vor,
tiefer zu gehen macht's auch nicht genauer."

7,3728MHz/128=57,6 (gerundet) also ziemlich am unteren Ende dessen was
Atmel vorschreibt.

von Marco (Gast)


Lesenswert?

So, ich habe jetzt GND von AGND getrennt, AGND an die Schrimung vom
Messkabel gelötet, habe mich vom Oversampling getrennt und messe jetzt
nur etwa 1x pro Sekunde 64x mal und teile dann durch 64.

Es ist jetzt schon besser geworden aber ich denke da ist noch etwas
mehr drin.

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.