Hallo, anbei eine Assembler Datei eines kleinen Programmes bei dem eine Interrupt-Routine Impulse für ein RC Servo erzeugt. Das Programm funktioniert soweit ganz gut, allerdings habe ich das Problem daß die Impulslänge nicht richtig stabil ist, d.h. die Impulse schwanken. In Mittelstellung messe ich zwischen 1505 und 1521 us - ab und zu gibt es auch noch einen Ausreißer und dann kann es auch mal ein oder zwei Impulse mit so um die 2000 us geben, danach geht es wieder normal weiter. Hat jemand eine Idee woran das liegen kann ? Hardware oder Softwareproblem ? Ich tippe ja mal auf Software, hab aber gerade keine gute Idee. Zur Schaltung. Das ganze läuft auf einem TINY13 mit 9.8MHZ interner Takt - ohne Teiler. Servo ist an PB4 direkt angeschlossen, die Taster haben externe Pullups von 10K Weil der TINY13 keinen 16bit Timer hat, wird das Timing manuell in der Interrupt-Routine gemacht. Danke für die Kommentare im Voraus.
Hast Du Deinen Code mal simuliert und überprüft, ob die Impulsbreite auch wirklich konstant ist und nicht durch den Programmfluss variiert. Ansonsten ist der interne RC-Osci auch nicht besonders stabil. Am Oszi kann man den Jitter sehr gut sehen - in welcher Größenordnung die Schwankungen sind kann ich aber keine Angaben machen, da meine letzten Messungen schon etwas zurückliegen.
Die AVRs schalten das I-bit automatisch beim starten eines IRQs aus. Den CLI kannst du dir also sparen. SEI innerhalb von einem IRQ ist böse(tm) und kann tolle Effekt haben (Stacküberlauf, ...). Dafür gibt es retI.
@ W Herzog (Gast) >anbei eine Assembler Datei eines kleinen Programmes bei dem eine >Interrupt-Routine Impulse für ein RC Servo erzeugt. >Zur Schaltung. Das ganze läuft auf einem TINY13 mit 9.8MHZ interner Takt Der ist nur mässig stabil, das könnte eine Ursache für die instabile Pulsbreite sein. 15 Takte von 1500 sind nur 1%. >- ohne Teiler. Servo ist an PB4 direkt angeschlossen, die Taster haben >externe Pullups von 10K Kann man sich sparen, es gibt interne. >Weil der TINY13 keinen 16bit Timer hat, wird das Timing manuell in der >Interrupt-Routine gemacht. Die sieht reichlich komisch aus. >;-- Interrupt-Routine ------------------- >comp_matchA: > cli ; Interrupts sperren Das in einem Interrupt ist Unsinn, die Interupts sind hier automatisch gesperrt. >comp_end: > sei DAS kann ins Auge gehen und ist noch viel mehr Unsinn. reti setzt das I-Bit wieder automatisch. AVR-Tutorial Interrupts Wenn ich das richtig sehe erzeugst du per Timer einen Interrupt alle 10us. Das sind gerade mal 96 Takte pro Interrupt. Naja. Dann kann deine Schrittweite bei der Pulserzeugung aber nur 10us sein. Letztendlich ist das ja auch nix weiter als eine Soft-PWM, allerdings wie ich meine reichlich kompilziert gestaltet. Versuchs mal lieber so wie hier, das ist einfacher und solider. http://www.mikrocontroller.net/articles/AVR-Tutorial:_SRAM#Beispiel MFG Falk
Danke für das Feedback... Das SEI innerhalb der Interupt-Routine war nur ein Versuch, ob das den Jitter verbessert. Ja, der Code ist ein wenig verbastelt, aber das liegt an der dauernden rumprobiererei. Werde ich mal ein wenig aufräumen.. ;-) Mir scheint aber daß der TINY13 mit internem Oszillator für diese Anwendung einfach zu instabil ist. Werde das ganze jetzt mal auf einem MEGA8 mit 16MHZ Quarz testen.
Hi, ich habe vor ein paar Jahren (solltest Du hier im Forum finden) ebenfalls einen Code auf Assembler-Basis zur Servoansteuerung geschrieben. Ich habe damals einen Tiny26 mit internem Takt verwendet - das lief problemlos! Damit habe ich dann ein Mini-Modell-Uboot problemlos gesteuert (http://www.mikrocontroller.net/attachment/4732/uboot2.jpg) . Ich kann mir nicht vorstellen, dass der interne Oszillator so schnell die Frequenzen ändert, dass Dein Servo zittert. Ich bin eher überzeugt davon, dass Du einen Programmfehler hast! Nimm mal einen Minimalcode und lass ohne Interrupts einen IO-PIN-Togglen - Wenn dann die Frequenzen konstant sind, liegts nicht an der Hardware .... Wenn ich mich recht entsinne spielte bei manchen Servos auch die Impulswiederholrate eine Rolle - Du musst ja alle 19ms einen Servo-Impuls mit einer Dauer von 1-2ms senden. Wie exakt sind denn die 19ms ? Und wie misst Du das ? Gruß Andreas
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.