Nutzt du die komische Servo Funktion von Bascom? Die ist alles andere als optimal.
Bau dir einfach selbst ein Servosignal mit einem Timer, ist viel besser
Hallo allerseits,
ich muss einen Servo innerhalb von 5Sek. um etwa 60° drehen.
Bis jetzt hab ich's nicht hingekriegt, dass diese Bewegung flüssig
und nicht so "stotternd" abläuft - bin ich da an einer baulichen Hürde
eines Servos angelangt oder gibt es eine möglichkeit, den Servo
geschmeidig gleiten zu lassen?
Bis jetzt habe ich (mangels besseren Wissens) einfach versucht, in
Bascom die Bewegung in so viele Schritte wie möglich zu unterteilen,
was wenigstens eine geringfügige Besserung gebracht hat.
LG
Tobias
Nutzt du die komische Servo Funktion von Bascom? Die ist alles andere als optimal.
Bau dir einfach selbst ein Servosignal mit einem Timer, ist viel besser
So viele Schritte wie möglich. Genau, das ist - mal ganz grob ausgedrückt - der erste Punkt der Lösung.
Richtig, im Prinzip, aber nur, WENN der werte Programmierer den ersten Satzteil streng beachtet. Im Detail mal ausführlich : Der Servo hat ja - standardmässig (analog, digital geht das z.T. deutlich schneller) und theoretisch eine Periodenlänge von 20 ms (siehe hier - klick mal). Das heißt - wenn ich in einer Schleife den Servopuls pro Schleifendurchlauf nur einen Tick weiterschalte, dann könnte es sein, dass pro Servoperiode schon mal fünfzig oder hundert Schleifendurchläufe, vielleicht sogar mehr, ablaufen. Damit ist die MÜhe mit den wenigen Ticks garnix mehr wert.Der Servo wird immer versuchen die Teilschritte so schnell wie moeglich zu machen,
von daher bleibt dir eigentlich nur die Abstufung zwischen den Schritten so fein wie moeglich zu machen.
Man muss dafür sorgen, dass der Servo >>pro Servoperiode<< genau den richtigen, fein unterteilten Pulsfortschritt beigebracht bekommt. Man muss also dafür sorgen, dass der Servo grad nur 50 mal pro Sekunde einen neuen Wert bekommt (ich mache das so und es geht recht gut).
Im vorliegenden Fall rechnen wir mal:
5 sec für 60°, das sind 5 * 50 - also 250 - Servoperioden für 60°. Anders ausgedrückt muss ich dafür sorgen, dass pro Servoperiode die Ansteuerung für 0,24° ausgegeben wird. Weiter: die übliche Servorampe mit 8 Bit hat das schon mal verloren weil ich ja für den unteren Ausschlag schon etwa 150 von den 255 möglichen Pulswerten habe - sechzig Grad weiter werden es dann rund 220 sein - oder so. Also sind rund 70 mögliche Schritte - und diesen 1°-(Fort-)Schritt sieht man bei den meisten Servos (sogar bei meinen billigen) - insbesondere deswegen, weil ja nur - rechne mal selbst - nur jeder dritte Puls einen neuen Wert haben darf. Sonst schaffts Du die fünf Sekunden nicht . . . .
Ich betreibe meine Servos mit dem 16bittigen Timer. Da habe ich dann ziemlich genau 300 Ticks (OCR1A) für 90 Grad, sprich: 200 Ticks für sechzig Grad. Grundlage: megaxx/20MHz/Timer1=16-Bit/prescaler=clk/8.
Wenn man jetzt keinen Prescaler nähme, sprich: clk/1, dann sind das acht mal so viel Ticks für sechzig Grad. Bei mir geht das nicht mehr, weil mein Controller mit 20 MHz läuft und ich so Mühe mit der gesamten Servoperiode habe. Wenn man den langsamer takten lässt, dann dürfte man hier aber ne ausreichende Anzahl Ticks für die VORGABE bekommen können. Ob das der Servo mitmacht, ist ne andere Frage. Und wie das in Bas com geht weiß ich auch nicht, weil ich das in C mache (sorry). Ich weiß nicht mal, ob das überhaupt in Bas com geht.
Fazit: mal GENAU aufmalen was geschieht - und das ins Programm umsetzen.
Ciao sagt der JoeamBerg
Lesezeichen