Hallo
Aha, dann schau mal wie schnell er ist:
Mit diesem Code steuere ich mit dem RP6 die Servos bei meinem Einbein. Es werden Impulse von 0,5-1,5ms erzeugt, das entspricht -90 bis +90 Grad (die Servos streuen etwas). Dafür verwende ich Zählschleifen bei gesperrten Interrupts. Die jeweiligen Zählerwerte setzen sich aus dem Wert für -90 Grad (bei dieser Verzögerung durch die dummy-Zuweisung ca. 470-490 ~ 0,5ms) und dem Wert für die gewünschte Servostellung zusammen. Der Faktor 7 bewirkt dabei, das bei einem Wertebereich von 0-255 das Servo 180 Grad dreht. Daraus kann man dann ableiten, dass die Schleife für 255*7=1785 Durchgänge ca. 1ms braucht (und für 255*7+480=2265 ca. 1,5ms benötigt).Code:void servo(void) { delay=(x+y+z)/10; pos_x=x*7+470; pos_y=y*7+480; pos_z=z*7+490; cli(); PORTA |= E_INT1; // E_INT1 (Pin8) while (pos_x--) dummy ^= pos_x; PORTA &= ~E_INT1; PORTC |= 1; // SCL (Pin10) while (pos_y--) dummy ^= pos_y; PORTC &= ~1; PORTC |= 2; // SDA (Pin12) while (pos_z--) dummy ^= pos_z; PORTC &= ~2; sei(); sleep(100-delay); }
Gruß
mic







Zitieren

Lesezeichen