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
P.S. Bitte nicht an den auskommentierten Sachen stören, das Programm ist nur ein Ausschnitt; die Grundfunktion ist so gegeben. Paul
hänge mal deinen Schaltplan an. ich vermute den fehler in der schaltung.
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
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.