Forum: Mikrocontroller und Digitale Elektronik Problem mit AD-Wandler im Atmega8


von Paul Baumann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
Ich habe hier ein Problem mit einem Atmega8 und dem A/D Wandler.
Ich lese über ADC 1 ein Poti ein und über den eingelesenen Wert
wird die PWM angesteuert. Über ADC 0 lese ich den über einem
widerstand im Lastkreis abfallende Spannung ein, damit ich eine Maß
für die Stromregelung habe.

Problem: Der eingelesene Spannungswert von ADC 1 schwankt in alle
Richtungen und damit auch die PWM. Aber warum ist das so?
Ich sehe meinen Fehler nicht.

MfG Paul

von Paul Baumann (Gast)


Lesenswert?

P.S.
Bitte nicht an den auskommentierten Sachen stören, das Programm ist nur 
ein
Ausschnitt; die Grundfunktion ist so gegeben.

Paul

von Marco S. (masterof)


Lesenswert?

hänge mal deinen Schaltplan an.
ich vermute den fehler in der schaltung.

von Paul Baumann (Gast)


Lesenswert?

Der Schaltplan ist von der Seite:
http://www.opend.co.za/hardware/nimh1/nimh1.htm
Die Schaltung ist in Ordnung, da sie mit dem Originalprogramm 
funktioniert.
Da ich aber etwas anderes damit tun möchte, habe ich selbst ein Programm 
geschrieben, was auch funktioniert. Nur dieser Teil tut nicht ganz das, 
was ich mir vorstelle.

von Michael U. (Gast)


Lesenswert?

Hallo,

mein BasCom-Lesen ist nicht das Beste, aber irgendwie finde ich die 
Stellen nicht, wo Du nach dem Start auf das Ende der Wandlung wartest?

Gruß aus Berlin
Michael

von Michael U. (Gast)


Lesenswert?

Hallo,

gerade erst gesehen, Du benutzt FreeRunning.

Müßte ich das Verhalten nachlesen, ich glaube aber kaum, daß da nach dem 
Start der Wandlung sofort ein gültiger Wert anliegt...

Ich mache das meist so, daß ich den Wandler einschalte ohne FreeRunning.
Dann Mux setzen, auf Ergebnis warten, Wert holen.

Dann Mux umschalten, Starten, Warten und 2. Wert holen.

Nach dem Start braucht der Wandler sowieso etliche Takte länger für die 
erste Wandlung, nach einem Wechsel der Refernz ist die erste Wandlung 
ungültig und was es da noch so für Anmerkungen im Datenbaltt gibt.

Gruß aus Berlin
Michael

von Paul Baumann (Gast)


Lesenswert?

Hallo Michael
Danke für die Tips. Ich will mal sehen, wie ich Deinen Rat umsetze. Eben 
kam mir noch die Idee, daß ich den AD-Wandler vielleicht zu schnell 
takte.
In der Simulation  sieht immer alles so gut aus, in Natura dann nicht. 
;-)

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Free-Running macht doch eigentlich nur dann Sinn, wenn die Abfrage im 
Timer-Interrupt passiert und sichergestellt ist, dass zwischen den 
Abfragen auch wirklich eine (oder mehrere) Wandlung erfolgt ist.
Bei mehreren Messquellen (im Free-Run mit Abfrage im Timer-Int) lese ich 
den Wert aus und schalte sofort danach auf die zunächst fällige Quelle 
um. Wenn sichergestellt ist, dass bis zur nächsten Abfrage zwei 
Wandlungen erfolgt sind, gibt es keine Probleme.

Bei Strommessung des PWM-Verbrauchers müsste die Wandlung ja während der 
Einschaltphase der PWM erfolgen. Reicht diese Zeit dazu überhaupt? Da 
müsste der Start des ADC schon mit der PWM synchronisiert werden, oder?

...

von Paul Baumann (Gast)


Lesenswert?

@Hannes
Ich danke Dir für Deine Anregungen. Wie stellt man fest, ob eine 
Wandlung
erfolgt ist? Ich finde im Datenblatt nichts darüber evtl. übersehe ich 
es, weil es am Englischen hapert. (Als ich in die Schule ging, gab´s 
noch gar keine Engländer;-)
Ich habe schon probeweise Wartezeiten von 1 Sekunde drin, um Zeit dafür 
zu geben, aber das scheint nichts zu bringen. Gehen muß es irgendwie, 
denn das
Programm aus der Originalveröffentlichung (siehe oben) muß es ja auch 
machen.
Ich will aber nicht aus lauter Prast 2 externe A/D-Wandler dranmachen.

MfG Paul

von Carsten P. (papa_of_t)


Lesenswert?

Wahrscheinlich hilft Dir dieser Thread, zumindest um zu sehen, wie man 
das Ende der Wandlung abfragt.. Wenn Du die fehlende Pause einbaust, 
funktioniert es auch super mit alles 6 Kanälen.. :-)

Beitrag "Mega8 ADC Meßproblem"

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote u.a.:
> @Hannes
> Ich danke Dir für Deine Anregungen. Wie stellt man fest, ob eine
> Wandlung
> erfolgt ist?

Als ich noch "Angst vor Interrupts" hatte, nutzte ich den ADC auch im 
FreeRun-Mode. Die Abfrage erfolgte im Timer-Interrupt (vor dem ich nie 
Angst hatte). ADC-Vorteiler und Abfragetakt wurden so gewählt, dass der 
ADC schneller war, also dass bei jeder Abfrage mehrere Wandlungen 
erfolgten. Dabei wurde natürlich nur die letzte Wandlung genutzt.

Inzwischen nutze ich den ADC meist mit eigenem Interrupt. Der wird 
ausgelöst, wenn der ADC mit einer Wandlung fertig ist.

Wenn Du ohne Interrupt (die ja in BASCOM zuviel Ressourcen verschwenden) 
arbeiten willst, dann setzt Du (im single-Conversions-Mode, also 
Einzelmessung) ADEN und ADSC in ADCSRA und fragst ADSC ab, bis ADSC 
wieder auf 0 fällt, dann ist die Wandlung fertig und kann ausgelesen 
werden.

> Ich finde im Datenblatt nichts darüber evtl. übersehe ich
> es, weil es am Englischen hapert. (Als ich in die Schule ging, gab´s
> noch gar keine Engländer;-)

Seite 204 unter Bit 6 ADSC, zweiter Absatz:
ADSC will read as one as long as a conversion is in progress. When the 
conversion is
complete, it returns to zero. Writing zero to this bit has no effect.

Aber tröste Dich, zu meiner Schulzeit wurde auch kein Englisch 
unterrichtet. Und vom Russisch weiß ich auch nix mehr... ;-)

...

von Paul Baumann (Gast)


Lesenswert?

Danke für die Antworten.
@Carsten
Ich freue mich, daß ich nicht der Erste mit diesem Problem bin ;-)
Dein Link hat mir geholfen.

@Hannes
Ich habe die übrigen Timer 2 und 3 im Interrupt laufen, um verschiedene
Ladezeiten zu erzeugen. Das geht auch alles richtig, meine 
"Interruptangst"
habe ich schon vor einer Weile überwunden. Grins
Wenn ich das jetzt richtig verstanden habe, muß ich im Register ADSC das 
Bit 6 auswerten; wenn das wieder auf 0 geht, ist er fertig mit wandeln?
Das probiere ich heute Abend mal aus; ich bin jetzt nicht an meinem 
Rechner.
Die Ergebnisse sind aber schon besser geworden, indem ich den Taktfaktor
für den Wandler auf 128 gesetzt habe. Da gibt er nicht mehr so viele 
Meßwerte pro Sekunde ab.

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann wrote u.a.:
> meine "Interruptangst"
> habe ich schon vor einer Weile überwunden. *Grins*

Das freut mich...

> Wenn ich das jetzt richtig verstanden habe, muß ich im Register ADSC das
> Bit 6 auswerten;

Nein, das Bit heißt ADSC.
Ich bin es gewöhnt, die Bits beim Namen zu nennen, nicht bei ihrer 
Nummer oder ihrem Bitwert.
Das (I/O-)Register heißt (beim Mega8) ADCSRA.
Wenn ADSC das Bit 6 ist (müsste ich jetzt nachschaun), dann musst Du das 
Bit 6 in ADCSRA auswerten.

> wenn das wieder auf 0 geht, ist er fertig mit wandeln?

Genau, völlig richtig.

> Das probiere ich heute Abend mal aus; ich bin jetzt nicht an meinem
> Rechner.

Jou, mach das...

> Die Ergebnisse sind aber schon besser geworden, indem ich den Taktfaktor
> für den Wandler auf 128 gesetzt habe. Da gibt er nicht mehr so viele
> Meßwerte pro Sekunde ab.

Der Vorteiler für den ADC-Takt sollte so eingestellt werden, dass der 
ADC mit einem Takt von 50..200 kHz klappert. Die Einstellung des 
Vorteilers ist also vorrangig vom Controllertakt abhängig.

...

von Paul Baumann (Gast)


Lesenswert?

Der ADC macht jetzt mit 125Khz "einen hin". Es geht jetzt, wie ich 
wollte, das ADSC-Bit habe ich zur Auswertung genommen und konnte so die 
WAIT-Befehle aus dem Programm nehmen. Prima. Man sollte sich nicht auf 
die Simulation in Bascom verlassen, denn dort sah vorher schon alles gut 
aus.

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Na das sieht doch gut aus.

...

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.