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
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.
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
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
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
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?
...
@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
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"
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... ;-)
...
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
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.
...
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