FSST - Hardwarenahe Programmierung

Projekt Servo

Inhalt


RC Servo's bzw. Modellbauservos werden über eine Pulsweitenmodulation (PWM), also über den duty cycle oder die Pulsweite (pulse width) des PWM Signals, angesteuert. Über die Breite der Pulse wird der Winkel, auf den der Servoarm gestellt werden soll, gesteuert. Gängig ist ein 50-Hz-Signal (20 ms Periodenlänge), welches zwischen 500 Mikrosekunden (linker Anschlag, 0 Grad) und 2500 Mikrosekunden (rechter Anschlag, 180 Grad) auf High-Pegel und den Rest der Periodenlänge auf Low-Pegel ist. Viele Servos haben in diesem Wertebereich jedoch nicht ihre volle Bewegungsfreiheit ausgenutzt bzw. können sich zwischen anderen Gradzahlen bewegen. Siehe auch Servosteuersignal und RC-Servos

/media/uploads/fpucher/servo1.jpg /media/uploads/fpucher/servo2.jpg

/media/uploads/fpucher/servosignaling.jpg

This example code uses a period of 0.020s and increases the pulse width by 0.0001s on each pass. This will cause an increase of .5% of the servo's range every .25s. In effect the servo will move 2% of its range per second, meaning after 50 seconds the servo will have gone from 0% to 100% of its range.

#include "mbed.h"
 
PwmOut servo(p21);
 
int main() {
    servo.period(0.020);          // servo requires a 20ms period
    while (1) {
        for(float offset=0.0; offset<0.001; offset+=0.0001) {
            servo.pulsewidth(0.001 + offset); 
	// servo position determined by a pulsewidth between 1-2ms
            wait(0.25);
        }
    }
}

Untersuchen Sie folgende Mbed-Bibliothek.

Servo myservo(P0_8);

myservo.calibrate(range, 45.0); 
myservo = position;
wait_ms(500);

/media/uploads/fpucher/servomotorpwmtiming.jpg


All wikipages