Ein Servo braucht die Lage-Position nicht nur einmal, sondern alle ~20 mS
Ein Servo braucht die Lage-Position nicht nur einmal, sondern alle ~20 mS
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Danke für deine Antwort!
Ich hab das ganze jetzt einfach mal wiederholt, also innerhalb der Methoden eine for-Schleife eingebaut die das Signal 10 mal wiederholt. Reicht das für eine komplette Servo-Stellung? Oder soll ich lieber mehr Wiederholungen versuchen? 50? 100?
Bis jetzt leider noch immer ergebnislos, also der Servo stellt sich ein kleines Stück in die gewünschte Richtung, verharrt dort und beginnt zu zucken...
etwa so ?
Schau mal, ob dein Servo eh' positive Pulse braucht.Code:for (int iX = 0; iX < 10;iX++) { PORTB |= (1<<PB2); _delay_us( 1000 ); // in den 1000 steckt die Lageinformation PORTB &= ~(1<<PB2); _delay_ms( 18 ); // ist nicht kritisch }
Btw:
PORTB |= (0<<PB2);
ist für die Jetti-Tant'. "0" kann man nicht shiften.
Wenn du auf Null setzen willst, dann:
PORTB &= ~(1<<PB2);
(wie in deiner Schleife)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Wo man sich noch verkühlen kann: Irgendwo ganz vorn muss die CPU-Taktgeschwindigkeit definiert werden, hängt von deinem Compiler ab.
Ein Beispiel dazu:
http://www.rn-wissen.de/index.php/LE...Timer#Makefile
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ja, genau, meine Änderung schaut genau so aus wie die von dir gepostete.
Sind die 10 Wiederholungen hier überhaupt ausreichend?
Richtiges Datenblatt zum Servo find ich jetzt keines im Internet, es wird nur überall geschribenen das der Robbe FS100 ein Standart Modellbau-Servo ist den man überall einsetzen kann.
Weiß auch garnicht mehr wo ich den eig. her habe.
Was ich aber gelesen habe ist, das es digitale und analoge Servos gibt. Funktioniert meine Ansteurung jetzt für beide Arten, oder nur für Digitale? Sonst könnte es ja eventuell daran liegen?
Und Danke für den Hinweis mit dem shiften der 0-en, das wusste ich garnicht, erklärt aber einiges.![]()
Das mit dem Servo wird schon stimmen. Du könntest ja zur Sicherheit eine Gegenprobe machen, indem du die Polarität umdrehst:
Nutz's nix, schad's nixCode:PORTB &= ~(1<<PB2); _delay_us( 1000 ); // in den 1000 steckt die Lageinformation PORTB |= (1<<PB2);
10 ist vielleicht wirklich etwas wenig, das sind ~0.2 Sek., da kommt das Servo nicht weit. schreib einfach mal 100, was soll's.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Vielleicht reicht Dir dies (klick mal) zur Information ? Da gibts auch einige Tips zu (den typischen) Fehlermöglichkeiten.... Richtiges Datenblatt zum Servo find ich jetzt keines im Internet ... digitale und analoge Servos ...
Ciao sagt der JoeamBerg
Also, habe jetzt noch etwas herumgespielt, den Servo ausgetauscht (gegen einen anderen der gleichen Art, also auch ein Robbe FS100).
Habe die Durchlaufzahl der Schleife jetzt mal zu Testzwecken auf 500 gesetzt (500 * 20ms = 10k ms = 10 sek), damit bin ich garantiert auf der sicheren Seite in Sachen "Stell-Zeit" habe ich mir gedacht.
Testablauf jetzt:
Habe den Servo per Hand in die Mittel-Lage gedreht als Ausgangsposition.
Ablauf sollte wie gehabt sein: links, mitte, rechts, mitte, links, ...
Ablauf IST:
SEKUNDE 0: Servo dreht ca 2 mm nach links
SEKUNDE 10: nichts passiert
SEKUNDE 20: nichts passiert
SEKUNDE 30: Servo dreht nach links bis zum Anschlag und zittert dort
SEKUNDE 40 - ca 180: Servo hört bei Sekunde 40 wieder auf zu zittern, dreht sich aber nicht weiter in irgend eine Richtung. Nachdem hier 150 Sekunden lang nichts passierte, habe ich den Test an dieser Stelle wieder abgebrochen.
Ich tippe mal auf einen Software-Fehler, daher hier der "komplette" Code:
(Codeteile die nur LEDs blinken lassen hab ich hier mal der Übersichtlichkeit wegen entfernt, diese Spielen aber lediglich auf Port D, berühren den Servo an Port B also garnicht.)
Code:#include <avr/io.h> #include <util/delay.h> #define SERVO_2 PB1 #define SERVO_3 PB2 #define LEDRED PD6 #define LEDGREEN PD7 void init_portB(void) { //PORT B enthält: ISP-Anschluss + Servos //PB0 = //PB1 = //PB2 = SERVO 2 //PB3 = SERVO 3 //PB4 //PB5 = MOSI für ISP (kann zusätzlich belegt werden) //PB6 = MISO für ISP (kann zusätzlich belegt werden) //PB7 = SCK für ISP (kann zusätzlich belegt werden) DDRB |= (1<<SERVO_2) | (1<<SERVO_3); //setzt die LED-Pins auf Ausgang PORTB |= (0<<SERVO_2) | (0<<SERVO_3); //setzt die LEDs auf OFF (low) } void init_AllPorts(void) { //init_portA(); init_portB(); //init_portC(); //init_portD(); } void servo2mitte() { for(int i=0; i<500; i++) { PORTB |= (1<<PB2); _delay_us( 1500 ); // in den 1500 steckt die Lageinformation PORTB &= ~(1<<PB2); _delay_ms( 18 ); // ist nicht kritisch } } void servo2left() { for(int i=0; i<500; i++) { PORTB |= (1<<PB2); _delay_us( 2000 ); // in den 1500 steckt die Lageinformation PORTB &= ~(1<<PB2); _delay_ms( 18 ); // ist nicht kritisch } } void servo2right() { for(int i=0; i<500; i++) { PORTB |= (1<<PB2); _delay_us( 1000 ); // in den 1500 steckt die Lageinformation PORTB &= ~(1<<PB2); _delay_ms( 19 ); // ist nicht kritisch } } int main(void) { init_AllPorts(); while(1) { servo2left(); servo2mitte(); servo2right(); servo2mitte(); } }
Lesezeichen