3.2 Servo steuern mit PWM
[L293D] [MezData: Servos][Arduino Servo Library][MezData: Modellbau-Servotester mit Pulsweiten-Anzeige]
Modellbauservo
Ein Modellbauservo wird durch die Breite eines Impulses gesteuert. Der Stellwinkel des Servos ist proportional zur Impulsbreite. Alle 20 ms sollte ein Steuerimpuls kommen. Die übliche Impulsbreite bewegt sich zwischen 1 ms und 2 ms. Servos können auch ausserhalb dieses Bereiches noch gesteuert werden, drehen weiter, allerdings besteht die Gefahr von Getriebeschäden wenn der Servo auf seinen mechanischen Anschlag gestellt wird.
Servotester
Fehler sind im Video, wer findet sie?
Auf dem Multifunction-Board sind bereits Ausgänge für 4 Servos vorgesehen. Allerdings sind diese Ausgänge auch für die Ansteuerung von Schrittmotoren und normalen Motoren gedacht. Die Signale von PC0..PC7 werden durch einen Leistungsverstärker L293D verstärkt und dann an den Ausgängen im Bild bereit gestellt. Die Stromversorgung des Verstärkers kann auch extern zugeführt werden um entweder höhere Spannungen oder Ströme an den Ausgängen zu ermöglichen. Der Leistungseingang des L296D kann mittels Jumper entweder mit Extern V+ und Intern 5V verbunden werden. Zum Testen eines Servos reichen die Internen 5V.
Jumper bei 5V einsetzten.
Info: Herr Sturm hat die PWM-Signale mit Timer-PWM gemacht und daher Drahtbrücken vorgesehen. Hier werden per Software die Signale mit der Arduino-Servo-Library erzeugt, daher ist dieser Aufwand nicht gegeben.
Ausgang | Gebrückt | PWM-Kanal |
---|---|---|
PC0 | PB9 | TIM4_CH4 |
PC3 | PB3 | TIM2_CH2 |
PC4 | PB4 | TIM3_CH1 |
PC7 | – | TIM3_CH2 |
Arduino-Sketch mit einem Servo
Die Arduino-Servo-Library verwendet Software zur Erzeugung der PWM Signale, daher kann praktisch jeder Ausgang verwendet werden. Damit die Servos Versorgungsspannung erhalten müssen die Ausgänge PC1,PC2,PC5 und PC6 bei Verwendung eine 1 ausgeben.
#include <Servo.h>
Servo myservo;
void setup() {
pinMode(PC1,OUTPUT); // PC1 braucht +5V
digitalWrite(PC1,HIGH);
myservo.attach(PC0); // Servosignal an PC0 anschliessen
}
void loop() {
for (int i =30;i<150;i++){ // zwischen 30 und 150 Grad laufen
myservo.write(i); // in Grad ausgeben
delay(50);
}
}
Servotester mit LCD-Anzeige
Hinweis: Brücke zwischen PB8-PA11 und PB9-PA12 für LCD-Anzeige notwendig.
#include <Servo.h>
#include <LiquidCrystal_PCF8574.h>
#define MSMIN 800 // kleinste Pulsweite
#define MSMAX 2500 // groesste Pulsweite
Servo myservo;
LiquidCrystal_PCF8574 lcd (0x27); // LCD-Adresse auf 0x27
void setup() {
pinMode(PC1,OUTPUT); // PC1 braucht +5V
digitalWrite(PC1,HIGH);
myservo.attach(PC0); // Servosignal an PC0 anschliessen
lcd.begin(16, 2); // LCD initialisieren
lcd.clear();
lcd.setBacklight(255);
}
void loop() {
int adWert = analogRead(PA0); // AD-Wandler einlesen 0..1023
int us = map(adWert,0,1023,MSMIN,MSMAX); // Arduino map-Funktion rechnet AD-Wert in ms-Wert um
lcd.clear();
lcd.setCursor(0,0); // erstes Zeichen, erste Zeile
lcd.print(F("PWeite: "));
lcd.print(us);
lcd.print(F("us"));
myservo.writeMicroseconds(us);
delay(50);
}
Wie funktioniert die Map-Funktion, erstellen Sie eine eigene Funktion (selber versuchen, nicht spicken).
Lösung
extern long map(long x, long in_min, long in_max, long out_min, long out_max){
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Aufgabe Servo mit Timer-PWM steuern
Der Servo soll nun an PC7 angeschlossen und mit TIM3_CH2 statt der Servo-Library gesteuert werden. Entwickeln Sie eine Lösung.
Aufgabe Servo zeigt Sekunden an
Ein Servo ist mit einem Zeiger verbunden und zeigt damit die Sekunden an.
Das Servo wird dazu an PC7 angeschlossen und wird mit TIM3_CH2 zwischen 1000 µs und 2000 µs Pulsweite alle 20 ms angesteuert.
Ein Timer TIM2 zählt über eine ISR im Sekundentakt von 0 bis 59 und gibt dabei die Pulsweite 1000 µs bis 2000 µs vor. Dieser Code ist gegeben, ergänzen Sie ihn..
Aufgabe Servo steuert Helligkeit
Die Helligkeit in einem Raum soll begrenzt werden, dazu steuert ein Servo eine Jalousie. An einem AD-Wandler-Eingang wird mittels Poti die Wunschhelligkeit eingestellt und mit einem Photowiderstand an einem anderen AD-Eingang die Helligkeit gemessen. Ergänzen Sie den Code..
Ein Kommentar
Kommentare sind geschlossen.