3.2 Servo steuern mit PWM

[L293D] [MezData: Servos][Arduino Servo Library][MezData: Modellbau-Servotester mit Pulsweiten-Anzeige]

Modellbauservo

Modellbauservo
PWM-Signal

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.

Servoanschluss
Anschluss-Blockschaltbild

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.

AusgangGebrücktPWM-Kanal
PC0PB9TIM4_CH4
PC3PB3TIM2_CH2
PC4PB4TIM3_CH1
PC7TIM3_CH2
Brücken bei Timer-PWM

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 ms = 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(ms);
  lcd.print(F("ms"));
  myservo.writeMicroseconds(ms);
  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..