Hallo, wie kann ich mit dem AVR (8535) einen Servo ansteuern? Gibt es irgendwo Beispiele (vielleicht sogar für avr-gcc)? Danke für Eure Hilfe... Jens
ganz einfach: du musst dem motor einen 1-2ms langen puls geben, dann 18ms warten und wieder einen puls. ist der puls 1,5ms lang, steht der motor in mittelstellung, bei weniger steht er links, bei mehr rechts. die genauen zeiten hängen jedoch von deinem motor ab.
Hallo Jonas, sehe ich das richtig, muss ich diesen 1-2sec langen Impuls dauernd geben oder reicht das auch immer nur einmal? Oder was passiert, wenn ich keinen Impuls mehr gebe? Gruß Jens
Hi Jens hab' für code vision ein Programm geschrieben: #include <90s2313.h> #include <delay.h> #define Servo PORTB.0 #define SERVO_DDRD DDRB.0 void Servo_1(char Impuls) { char i; Servo = 0; //low legen delay_ms(20); Servo = 1; //high Impuls delay_ms(1); for(i=0;i<Impuls;i++) //solange die Highflanke machen bis i = Impuls { delay_us(4); } Servo = 0; } void main (void) { SERVO_DDRD = 1; //als Ausgang definieren while(1) { Servo_1(150); } } die zahl, die du der Routine Servo_1 übergibst bestimmt die Servoposition (256 Stellungen sind mgl.) Viel Erfolg Christian
Super, klasse, DANKE aber noch eine Frage: was passiert, wenn ich jetzt zwischendrin (im main) irgendwas rechne oder so, dann kann das ja vorkommen, dass sich die Zeiten dazwischen ändern, hat das Auswirkungen und wie kann ich das lösen? Denn irgendwie möchte ich ja den Servo in Abhängigkeit von irgendendetwas steuern. Gruß Jens
ich hab das mit nem timer gemacht, der alle 20ms (bei mir 18ms) aufgerufen wird. dort wird dann der puls gemacht. Die variable Impuls muss dann global sein, dann muss dein hauptprogramm nur diese variable ändern, und der servo geht in eine andere stellung. auf diese weise ist auch sichergestellt, dass der servo "kontinuierlich" seine pulse bekommt (wobei ich nicht weiß, was passiert, wenn er die nur bei änderung bekommt).
so genau ist das nicht - ob der Servo die Impulse alle 20 oder alle 18ms bekommt ist nicht so wichtig!! mfg Christian
stimmt. ich hatte seinerzeit gelesen, dass der servo insgesamt 20ms braucht, also die pulslänge plus den rest, damits auf 20ms kommt... vielleicht stimmt diese info aber auch nicht. klärt mich auf! :-)
Das mit den 20ms hängt damit zusammen, dass übliche Fernsteuerungen maximal 10 Kanäle bedienen. Und zwar nacheinander. Sprich: Jedes PWM-Signal wird nach dem anderen generiert. 10 * 2ms = 20ms Wiederholrate.
@Holger Wiederholrate, heißt das jetzt das der Servo immer nen Impuls braucht, oder müsste ich ihn nur bei einer Änderung "schicken"?? Bin noch nicht so weit mit meinen Tests...... muss erst mal meinen servo rauskramen! Jens
Servos reagieren unterschiedlich, wenn das Eingangssignal ausbleibt. Die Regel sollte aber sein, dass es ohne Signal gar nichts tut, also seine Stellung nicht verändert. So ganz hasenrein ist es aber nicht, darauf zu bauen. Ich würd' dem Prozessor ruhig beibiegen, alle 20ms nachzulegen. In den mindestens 18 ms dazwischen haste doch noch soooo viel Zeit zum Rechnen.
fast alle anständigen Servos machen nix, wenn sie nicht angesterut werdne - manche flattern dann munter drauf los - ohne ansteuerung ist der Servo aber mit der Hand oder mit kleinen Lasten zu verändern --> keine gute Lösung!! mfg
Hallo Ich will fuer meine autonome Ameise ein board bauen das mindestens 24 servos hat und von einem CYBIKO [http://www.cybiko.com] Teen PDA ueber die serielle RS232 gesteuert wird. Ich habe vor dazu 2 Mega8 als slaves zubenutzen. Weiss jemand ob das Probleme verursachen kann? Baut jemand an etwas aehnlichen? Oder hat Lust zu helfen. Ich bin ein Metal Designer und sitze in Hollywood [wollte Monster bauen, kam aber zuspaet, die Monster sind weg, nur noch Zombys] Ich habe eine schicke Ameise aus Alu die ich als Bausatz verkaufen moechte [Ich habe eine CNC Machine und kann ganz schnell viele bauen] und brauche nur noch ein board. Wuerde Ameise gegen Hilfe tauschen. Bis dann schoene Gruesse aus Hollywood Marcus
Nach meiner Erfahrung bleibt der Servo ohne Impulse an der aktuellen Position stehen. Die Regelung funktioniert dann allerdings nicht mehr (gibt ja kein Sollwert), daher läßt er sich per Hand verdrehen. Problem oder nicht, nachdem was man damit vor hat ! Da das Servo eine sehr starke Untersetzung (Getriebe) hat, gibt es bei kleineren Lasten kein Problem. Meines Wissen nach muß der Abstand zwischen den Pulsen 20ms lang sein, der genaue Wert ist allerdings nicht so kritisch. Kritisch ist der Wert für die Impulslänge. Bei unsauberer Programmierung fäng der Servo an zu Zittern. Man man die Abständen zwischen den Impulsen auf 40ms erhöhen. Das hab ich mal gemacht, weil ich sonst nicht mehr genug Rechenleistung hatte. Einfach mal ausprobieren ! Gruß Björn
Hallo Christian, du hast eine delay.h benutzt... leider kenn (und hab) ich die garnicht! Kannst du mir mal verraten woher ich sie kriege bzw. sie mal uploaden?
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.