Forum: Mikrocontroller und Digitale Elektronik Tiny13 - Servoimpulse zittern


von W Herzog (Gast)


Angehängte Dateien:

Lesenswert?

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.

von W Herzog (Gast)


Lesenswert?

Keine Kommentare ???

von johuuu (Gast)


Lesenswert?

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.

von Tim (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von W Herzog (Gast)


Lesenswert?

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.

von Uboot- S. (uboot-stocki)


Lesenswert?

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
Noch kein Account? Hier anmelden.