Do. Apr 25th, 2024

Elektromotoren können relativ einfach gesteuert werden. Motorsteuerung bedeutet im einfachsten Fall, den Motor in Bewegung zu versetzen. Dies geschieht in dem die Wicklungen des Motors mit Spannung versorgt werden. Dabei gibt es nur zwei Zustände: der Motor ist mit Spannung versorgt und dreht sich oder im anderen Fall eben nicht.

Um die Richtung des Motors zu wechseln, muss der Stromfluss in der Spule umgekehrt werden. Um dies ohne manuelles umpolen der Spannungsquelle zu erreichen, ist eine spezielle Schaltung erforderlich, die auf geschickte Art das automatische Umpolen ermöglicht. Die Schaltung hat ihren Namen von der Form wie die Schalter angeordnet sind. Da sie wie ein „H“ aus sieht wird sie als H-Schaltung oder H-Brücke bezeichnet. Eine solche H-Brücke sieht schematisch so aus:

Die rote Linie zeigt den Stromweg für die jeweilige Drehrichtung. Sind die Schalter 1 und 4 geschlossen, so dreht sich der Motor rechts herum. Schliesst man die Schalter 2 und 3 dreht sich der Motor in die andere Richtung. Wobei zu beachten ist, dass nicht alle theoretisch möglichen Schalterstellung zugelassen werden, um beispielsweise Kurzschlüsse zu vermeiden. Die Betriebsspannung U ist die Spannung für den Motor, die meist unabhängig von der Logik ist und auch höher gewählt werden kann als 12 V.

Steuerung der Motor-Geschwindigkeit

Die Geschwindigkeit eines Motors ist direkt proportional zur angelegten Spannung. Dies ermöglicht eine Geschwindigkeitsregulierung, indem eine Puls-Weiten-Modulation (PWM) verwendet wird.

Pulsweitenmodulation oder PWM ist eine Technik, die digitale Methoden verwendet, um analoge Ergebnisse zu erhalten. Bei der Pulsweitenmodulation nimmt man ein Rechtecksignal mit einer festen Frequenz und variiert die Breite der jeweiligen Pulse. Den Abstand zweier aufeinander folgender Pulse bezeichnet man als Periodendauer, die Breite des aktiven Pulses als Pulsweite. Das Verhältnis von Pulsweite zu Periodendauer bezeichnet man auch als „Duty Cycle“(also die Zeit, in der der Pin im Dienst ist).

Programmtechnisch kann ein PWM-Signal wie in der Graphik gezeigt erzeugt werden, und beispielsweise zur Geschwindigkeitsregelung an einem Gleichstrommotor verwendet werden. Dies ist möglich, weil die Geschwindigkeit eines Motors direkt proportional zur angelegten Spannung ist. Somit ermöglicht die Veränderung der Spannung über das erzeugte Verhältnis T1 zu T1+T2 die Geschwindigkeitsregulierung am Motor.

Standardmäßig bietet der Arduino mit dem Befehl AnalogWrite(…) die Möglichkeit, PWM-Signale mit einer Auflösung von 8 Bit und einer PWM-Frequenz von 490 Hz (Pin D3, D9, D10 und D11) bzw. 980 Hz (Pin D5 und D6) auszugeben. Die Funktion AnalogWrite sendet pseudo-analoge Werte mittels einer hardwarebasierten Pulsweiten Modulation (PWM) an den adressierten Ausgangspin. Diese arbeitet nach folgendem Prinzip: Ein Wert 0 generiert eine gleichmäßige Spannung von 0 Volt; Ein Wert von 255 generiert eine gleichmäßige Spannung von 5 Volt an einem festgelegten PIN. Für Werte zwischen 0 und 255 wechselt der PIN sehr schnell zwischen 0 und 5 Volt – je höher der Wert, desto länger ist der PIN auf HIGH (5 Volt).

In der nachfolgenden Tabelle werden einige markante Tastwerte den entsprechenden PWM Werten gegenüber gestellt. Würde man beispielsweise analogWrite(5, 64); eingeben, so würde am Pin 5 ein Signal mit einem Tastgrad von 25% ausgegeben werden.

Tastgrad0 %25%50%75%100%
PWM-Wert064128191255

Ansteuerung eines DC Motors

In der Praxis verwendet man keine einzelnen Transistoren sondern hochintegrierte Schaltkreise, die sämtliche Bauteile für eine Motorsteuerung enthalten. Ein Beispiel wäre der Baustein L293 D, der über 600mA Strom liefern kann. Daneben gibt es noch weit leistungsstärkere wie den L298 D der mit über 2A Motoren steuern kann. Im nachfolgenden Blockschaltbild ist der prinzipielle Aufbau schematisch dargestellt:

Blockschaltbild des IC L293 (Quelle www.ti.com)

Die Ansteuerung eines Motors ist damit relativ unkompliziert machbar. Wichtig ist dabei auf die unterschiedlichen Spannungsversorgungen zu achten. Der Baustein kann ohne Probleme mit 5V Spannung vom Arduino betrieben werden. Da die zu steuernden Motoren aber meist größere Spannungen benötigen, besteht die Möglichkeit eine externe Spannungsquelle an PIN 8 des Bausteins anzuschliessen. Der Masse Anschluss wird dagegen von beiden Spannungen verwendet.

Die Steuerung des Motors erfolgt über die beiden Eingänge IN1 und IN2 die mit den digitalen Ausgängen des Arduinos verbunden werden. Dabei können folgende vier Zustände auftreten:

Eingang IN 1Eingang IN 2Motor Verhalten
LOWLOWMotor Stoppt
LOWHIGHMotor dreht sich nach Links
HIGHLOWMotor dreht sich nach rechts
HIGHHIGHMotor stoppt

Eine elementare Steuerung mit dem Arduino sieht im einfachsten Fall so aus:

const int PIN_A = 7;
const int PIN_B = 8;

void setup () {
  Serial.begin(9600); 
  pinMode(PIN_A , OUTPUT);
  pinMode(PIN_B , OUTPUT); 
 
  // Motor nach rechts drehen
  digitalWrite(PIN_A, LOW); 
  digitalWrite(PIN_B, HIGH);

  // Motor nach links drehen
   digitalWrite(PIN_A, HIGH); 
   digitalWrite(PIN_B, LOW);
void loop() { }

Steuerung der Geschwindigkeit

Um die Geschwindigkeit mit der sich der Motor dreht zu steuern, stehen zwei Eingänge für ein PWM Signal bereit: Für die Ansteuerung von Motor 1 und Motor 2 wird der PIN1 (EN1) verwendet und für die Motoren 3 und 4 erfolgt das über den PIN 9 (EN2). Ein Blick in das Datenblatt des Schaltkreises zeigt das im Detail.

Auszug aus dem Datenblatt L293 D © Texas Instruments

Um ein PWM-Signal zu erzeugen, geht man von folgender Überlegung aus: ein Pulsweiten-moduliertes Signal (kurz PWM) ist ein Rechtecksignal mit konstanter Periodendauer, das zwischen zwei verschiedenen Spannungspegeln oszilliert. Prinzipiell wird das Signal also in schneller Folge ein- und ausgeschaltet. 

Die Mittlere-Spannung die somit erzeugt wird, berechnet sich nach folgender Formel:

    \[U_m = U_{aus} \cdot (U_{ein}-U_{aus})\cdot (\frac{t_{ein}} {t_{ein}+t_{aus}})\]

Da in den meisten Fällen direkt zwischen 0 V und Vcc umgeschaltet wird, lässt sich die Formel wie folgt umschreiben:

    \[U_m = V_{cc} \cdot (\frac{t_{ein}} {t_{ein}+t_{aus}}) =  V_{cc} \cdot DC\]

D.h. die mittlere Spannung ist direkt vom sogenannten Dutycycle abhängig, und ist ein Maß für die Leistung mit der ein Verbraucher angesteuert wird. Dadurch können beispielsweise Glühlampen und Elektromotoren gedimmt bzw. in ihrer Drehzahl beeinflusst werden. 

Um also selbst ein PWM Signal zu erzeugen benötigt man einen Ausgangsport und die Festlegung einer konstanten Periodendauer z.B. T = 1000ms.

Anschliessend legt man fest, wie das Verhältnis zwischen eingeschaltetem Signal und ausgeschaltetem Signal sein soll (das ist genau der sogenannten Dutycycle DC) z.B. t_{ein} = 500 ms und t_{aus} = 500  ms, was in unserem Beispiel dann zu einem DC-Wert von 0,5 oder 50% führt. Also das Signal gleich lange an- und ausgeschaltet ist: U_m = V_{cc} \cdot DC = 0,5 \cdot V_{cc}, wodurch ein Motor sich mit der Hälfte der maximalen Drehzahl drehen müsste.

Beim Arduino können wir auf die Funktion AnalogWrite (PIN, Wert) zurückgreifen. Wobei der PWM Wert sich aus dem DC Wert abgebildet auf die 8-Bit Auflösung bestimmen lässt. Die Tabelle am Anfang des Beitrags zeigt diesen Zusammenhang für ausgewählte Werte.

Die Schaltung für eine Motorsteuerung, die sowohl die Richtung als auch die Geschwindigkeit eines Gleichstrommotors steuert könnte wie folgt aufgebaut werden:

Einfache Motorsteuerung mit dem L 293 D über Arduino Ausgangs-Pins

Das Arduino Programm sieht im einfachsten Fall wie folgt aus:

// Motor Steuerung über L293D

  int value;
  int MotorVPin=8;
  int MotorRPin=7;
  int PWMPin=5;
  char incomingByte = 0;
  
void setup() {
  Serial.begin(9600);
  pinMode(MotorVPin,OUTPUT);
  pinMode(MotorRPin,OUTPUT);
}

void loop() {
 digitalWrite(MotorVPin,HIGH);
 analogWrite(PWMPin,255);
 delay(3000);
 
 digitalWrite(MotorVPin,LOW);
  digitalWrite(MotorRPin,HIGH);
 analogWrite(PWMPin,255);
 delay(3000);

 digitalWrite(MotorVPin,HIGH);
 digitalWrite(MotorRPin,LOW);
 analogWrite(PWMPin,128);
 delay(3000);

 digitalWrite(MotorVPin,LOW);
 digitalWrite(MotorRPin,HIGH);
 analogWrite(PWMPin,64);
 delay(3000);
}

Natürlich kann man dieses Programm nun noch beliebig erweitern. Beispielsweise in dem man die Geschwindigkeit als Wert über den Seriellen Monitor einliest. Dann erweitert man beispielsweise die Loop-Routine um folgende Funktion:

void loop() {
if (Serial.available()>0) {
  char incomingByte = Serial.parseInt();
  value = incomingByte;
  Serial.println(value); 
 }