mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny13 - Servoimpulse zittern


Autor: W Herzog (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: W Herzog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Kommentare ???

Autor: johuuu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...

MFG
Falk

Autor: W Herzog (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uboot- Stocki (uboot-stocki)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.