Hallo Thomas!
Erstmal ein kleiner allgemeiner Tipp: Wenn Du Deinen Code mit "CODE" in eckigen Klammern beginnst, und ihn mit "/CODE" in eckigen Klammern beendest, wird er in so einem Scroll-Fenster dargestellt:
Und das ist für alle viel besser zu lesen!Code:... ...
Aber ich habe auch einen potenziellen Fehler in Deinem Programm entdeckt:
Bei einer Taktfrequenz von 1 MHz und einem Prescaler von 8 taktet der Timer mit 125 kHz, eine Periode ist somit 8 µs lang. Bewegt sich der Timer-Vorladewert zwischen 63535 und 61535, braucht es also zwischen 2000 und 4000 Takten bis zum nächsten Überlauf. Multipliziert man das mit der Taktdauer von 8 µs kommt man auf eine Impulsbreite zwischen 16 und 32 ms - und das ist definitiv zu lang für Servos! Um den kompletten Stellweg auszunutzen, darf die Impulsbreite nur zwischen etwa (!) 0,8 und 2,2 ms variieren. Bei über 10 ms ist es logisch, dass die Rudermaschine an den Anschlag knallt!
Für eine Impulsbreite zwischen 1 und 2 ms müsste der Timer also schon nach 125 bis 250 Takten überlaufen, d.h. man müsste ihn in der ISR auf Werte zwischen 65410 und 65285 vorladen, was allerdings "nur" 125 Abstufungen des Stellweges ermöglicht (die allerdings vollkommen ausreichen müssen!!).
Alternatively lässt Du den Prescaler von 8 einfach weg - dann taktet der Timer mit genau 1 MHz, eine Periode dauert somit genau 1 µs, und damit rechnet es sich auch viel leichter: Für 1 ms müssen 1000 Takte bis zum Überlauf vergehen, d.h. Vorlade-Wert 64535, und für 2 ms 2000, d.h. Vorlade-Wert 63535.
Wo genau die Grenzen Deiner Servos sind (vermutlich etwas unter 1 ms und etwas über 2 ms), das könntest Du dann ja noch per Feintuning ausloten.
Lesezeichen