Spis treści:
- 1 Steuerung von DC-Motoren mit Arduino - Hardware und Software
- 2 Drehzahlregelung von DC-Motoren durch PWM-Signal
- 3 Richtungsabhängige Steuerung von DC-Motoren mit "H"-Brücke
- 4 DC-Motorsteuerungsmodul auf Basis des L298N-Chips
- 5 Externe Klemmen des L298N-Controllers
- 6 Anschließen des L298N-Controllers an einen Arduino UNO R3
- 7 Programm-Code
Damit sich der Roboter in verschiedene Richtungen bewegen kann, muss er mit einer geeigneten Steuerungstechnik ausgestattet sein.
Steuerung von DC-Motoren mit Arduino - Hardware und Software
In diesem Artikel wird ein Beispiel für die Steuerung eines Gleichstrommotors (z. B. für den Antrieb eines Roboters) vorgestellt, bei dem ein Hardware-Gleichstrommotor-Controller auf der Grundlage des L298N-ICs und des Arduino UNO R3-Boards verwendet wird. Der Artikel beschreibt, wie die Hardware angeschlossen wird und welche Eigenschaften sie hat, und erörtert einen Beispiel-Quellcode, der die Richtungs- und Drehzahlsteuerung von Gleichstrommotoren implementiert.
Drehzahlregelung von DC-Motoren durch PWM-Signal
Die Wellendrehzahl des Gleichstrommotors ist abhängig von der Höhe der Versorgungsspannung. Eine der gängigsten Methoden der Drehzahlregelung ist die Pulsweitenmodulation (PWM). Bei einem solchen Verfahren wird die Versorgungsspannung in sehr kurzen Abständen ein- und ausgeschaltet. Ein einzelner PWM-Zyklus besteht aus den folgenden Phasen:
- Einbeziehung der Spannung
- Spannung in Wartestellung
- Freischaltung
- Haltung der ausgeschalteten Spannung
Der Durchschnittswert der an den Motor angelegten Versorgungsspannung wird aus dem Füllfaktor PW (Pulse Width) berechnet. Dieser Parameter legt fest, für welchen Anteil der Dauer eines einzelnen PWM-Zyklus die Versorgungsspannung (in diesem Fall für den Motor) eingeschaltet ist. Anhand des Füllfaktors und des Höchstwerts der Versorgungsspannung lässt sich der Durchschnittswert der Versorgungsspannung über mindestens einen PWM-Zyklus berechnen, wie die Oszillogramme in Abb. 1 zeigen. 1:
Abb. 1 – Einfluss der Füllfaktorregelung auf den Mittelwert der Versorgungsspannungswellenform
Aus den obigen Oszillogrammen ist ersichtlich, dass je höher der Wert des Füllfaktors, desto höher ist der Durchschnittswert der Versorgungsspannung. Die praktische Auswirkung in unseren Überlegungen ist, dass die Motordrehzahl umso höher ist, je höher der Wert des Füllungsfaktors ist, und dass eine Verringerung dieses Wertes zu einer entsprechenden Verlangsamung der Motorwelle führt.
Richtungsabhängige Steuerung von DC-Motoren mit "H"-Brücke
Bei Gleichstrommotoren erfolgt die Drehrichtungsänderung in der Regel durch Änderung der Polarität der Versorgungsspannung. Eine der gebräuchlichsten technischen Lösungen in diesem Bereich besteht darin, den Motor über eine H-Brücken-Anordnung an die Versorgungsspannung anzuschließen, wie in Abb. 2 gezeigt 2:
Abb. 2 – Gleichstrommotor, der über eine Brücke vom Typ “H” an die Versorgungsspannung angeschlossen ist
Die “H”-Brücke besteht aus vier Schaltern (S1, S2, S3, S4), die zusammen mit dem Motor auf dem Diagramm (als M abgebildet) in einer Form angeordnet sind, die dem Buchstaben “H” ähnelt. In der Praxis handelt es sich bei den Schaltern um Transistortasten, in der Regel BJTs oder MOSFETs, an die das Steuersignal z. B. von den Ausgängen eines Mikrocontrollers angelegt werden kann. Durch Schließen der Schalter S1 und S4 und Offenlassen der Schalter S2 und S3 wird eine Spannung an die Motorklemmen angelegt, die den Motor im Uhrzeigersinn dreht, d. h. der Pluspol der Spannungsquelle an den Pluspol des Motors und der Minuspol der Stromversorgung an den Minuspol des Motors. Wenn wir nun die Zustände aller Schalter ändern, wird durch die Umpolung der Versorgungsspannung auch die Drehbewegung der Motorwelle in die entgegengesetzte Richtung erfolgen.
DC-Motorsteuerungsmodul auf Basis des L298N-Chips
Das Gleichstrommotor-Treibermodul, das wir in unserem Projekt verwenden werden, basiert auf dem IC L298N, der eine H-Brücke enthält. Um den Treiber vor Überhitzung zu schützen, wurde ein großer Kühlkörper an das Chipgehäuse geschraubt, um die Wärmeabgabefläche des L298N-IC zu vergrößern. Diese Steuerung kann maximal zwei Motoren gleichzeitig betreiben. Die Stromversorgung des Controllers erfolgt über einen 3-poligen ARK-Schraubverbinder, der die Pins für die Motorversorgung (VS), die Masse (GND) und die Logikteilversorgung (VSS) enthält. Der Bereich der zulässigen Versorgungsspannungen am VS-Pin beträgt bis zu 12 V. Die zulässige Versorgungsspannung des Logikteils, die an den VSS-Pin angelegt wird, liegt jedoch zwischen 5 und 7 V.
Das Modul verfügt über einen eingebauten linearen 5-V-Spannungsstabilisator, der durch Umstecken eines Jumpers ausgeschaltet und überbrückt werden kann – durch Stecken eines Jumpers auf die Pins wird der Stabilisator eingeschaltet – die Stromversorgung des Eingangs erfolgt direkt über den VS-Pin. Die maximale Stromkapazität des eingebauten 5V-Spannungsstabilisators beträgt 0,5A, so dass der Strom für Arduino oder andere externe Module angeschlossen werden kann. Wird der Jumper jedoch entfernt, muss die Spannung für den Logikteil extern, direkt am VSS-Pin, zugeführt werden. Bitte beachten Sie, dass es verboten ist, in dieser Situation einen Jumper einzusetzen, da dies den Spannungsstabilisator oder sogar das gesamte Steuergerät beschädigen kann! Laut den technischen Daten beträgt der Spannungsabfall am Motorcontroller L298N etwa 2 V. Dies ist auf den internen Spannungsabfall an den Verbindungsstellen der Schalttransistoren zurückzuführen, die eine ,,H”-Brücke bilden. Wenn wir also 12 V an die Stromversorgungsklemmen der Motoren anschließen, erhalten die Motoren eine maximale Spannung von etwa 10 V. Das heißt, wenn Sie einen Motor mit einer Nennspannung von 12 V an den Regler anschließen, wird er nie mit der vom Hersteller angegebenen Höchstgeschwindigkeit drehen. Um die maximale Drehzahl zu erreichen, sollte die Motorversorgungsspannung etwas höher sein als die tatsächliche Spannung, die der Motor benötigt, um die maximale Drehzahl zu erreichen. Ein anderes Beispiel: Bei einem Spannungsabfall von 2 V müssen wir bei Motoren, die eine Nennspannung von 5 V benötigen, um die volle Drehzahl zu erreichen, eine Versorgungsspannung von 7 V an den Ausgangsklemmen des Reglers bereitstellen, und bei einem 12-V-Motor würde die Motorversorgungsspannung 14 V betragen.
Der Gleichstrommotor-Treiberbaustein, den wir in unserem Projekt verwenden werden, basiert auf dem IC L298N, der eine H-Brücke enthält. Um den Treiber vor Überhitzung zu schützen, wurde ein großer Kühlkörper an das Chipgehäuse geschraubt, um die Wärmeabgabefläche des L298N-IC zu vergrößern. Diese Steuerung kann maximal zwei Motoren gleichzeitig betreiben. Die Stromversorgung des Controllers erfolgt über einen 3-poligen ARK-Schraubverbinder, der die Pins für die Motorversorgung (VS), die Masse (GND) und die Logikteilversorgung (VSS) enthält. Der Bereich der zulässigen Versorgungsspannungen für den VS-Pin liegt zwischen 5 und 35 V. Die zulässige Versorgungsspannung des Logikteils, die an den VSS-Pin angelegt wird, liegt jedoch zwischen 5 und 7 V. Das Modul verfügt über einen eingebauten linearen 5-V-Spannungsstabilisator, der durch Umstecken eines Jumpers ausgeschaltet und überbrückt werden kann – durch Stecken eines Jumpers auf die Pins wird der Stabilisator eingeschaltet – die Stromversorgung des Eingangs erfolgt direkt über den VS-Pin. Die maximale Stromkapazität des eingebauten 5V-Spannungsstabilisators beträgt 0,5A, so dass der Strom für Arduino oder andere externe Module angeschlossen werden kann. Wird der Jumper jedoch entfernt, muss die Spannung für den Logikteil extern, direkt am VSS-Pin, zugeführt werden. Bitte beachten Sie, dass es verboten ist, in dieser Situation einen Jumper einzusetzen, da dies den Spannungsstabilisator oder sogar das gesamte Steuergerät beschädigen kann! Laut den technischen Daten beträgt der Spannungsabfall am Motorcontroller L298N etwa 2 V. Dies ist auf den internen Spannungsabfall an den Verbindungsstellen der Schalttransistoren zurückzuführen, die eine ,,H”-Brücke bilden. Wenn wir also 12 V an die Stromversorgungsklemmen der Motoren anschließen, erhalten die Motoren eine maximale Spannung von etwa 10 V. Das heißt, wenn Sie einen Motor mit einer Nennspannung von 12 V an den Regler anschließen, wird er nie mit der vom Hersteller angegebenen Höchstgeschwindigkeit drehen. Um die maximale Drehzahl zu erreichen, sollte die Motorversorgungsspannung etwas höher sein als die tatsächliche Spannung, die der Motor benötigt, um die maximale Drehzahl zu erreichen. Ein anderes Beispiel: Bei einem Spannungsabfall von 2 V müssen wir bei Motoren, die eine Nennspannung von 5 V benötigen, um die volle Drehzahl zu erreichen, eine Versorgungsspannung von 7 V an den Ausgangsklemmen des Reglers bereitstellen, und bei einem 12-V-Motor würde die Motorversorgungsspannung 14 V betragen.
Externe Klemmen des L298N-Controllers
Die Motorleistungsausgänge des Controllers L298N für Motor A und Motor B sind über zwei Schraubklemmen im Raster 3,5 mm an den Rand des Moduls geführt. An diese Klemmen können zwei Gleichstrommotoren mit Spannungen von 5 bis 35 V angeschlossen werden. Jeder Kanal des Moduls kann bis zu 2 A an den Gleichstrommotor liefern. Die Höhe des Stroms, der dem Motor zugeführt wird, hängt jedoch von der Versorgungsspannung des Reglers ab. Für jeden der Ausgangskanäle des L298N-Reglers gibt es zwei Arten von Steuerpins, die es ermöglichen, gleichzeitig die Geschwindigkeit und die Richtung der DC-Motoren zu steuern, d.h. Richtungssteuerungspins und Geschwindigkeitssteuerungspins. Mit den Stiften, die die Drehrichtung kontrollieren, können wir steuern, ob sich der Motor im oder gegen den Uhrzeigersinn drehen soll. Diese Pins steuern die Transistoren in der ,,H”-Brückenschaltung, die sich im IC L298N befindet. Das Modul hat zwei Richtungssteuerungsstifte für jeden Kanal. Die Pins IN1 und IN2 steuern die Drehrichtung von Motor A, während die Pins IN3 und IN4 die Drehrichtung von Motor B steuern. Die Drehrichtung des Motors kann durch Anlegen eines logisch hohen (+5V) oder logisch niedrigen (GND) Zustands an diese Eingänge gesteuert werden, wie unten beschrieben
IN1 |
IN2 |
Drehrichtung |
GND |
GND |
Motor aus |
+5V |
GND |
im Uhrzeigersinn |
GND |
+5V |
gegen den Uhrzeigersinn |
+5V |
+5V |
Motor aus |
Außerdem befinden sich auf der Platine die Pins ENA und ENB, die zum Ein- und Ausschalten der Motoren und zur Steuerung ihrer Geschwindigkeit dienen. Wenn Sie diese Pins auf einen hohen Wert setzen, drehen sich die Motoren, wenn Sie sie auf einen niedrigen Wert setzen, stoppen die Motoren. Mit der Pulsweitenmodulation (PWM) können wir die Geschwindigkeit der Motoren tatsächlich steuern. Das Modul ist in der Regel mit einem Jumper auf diesen Pins ausgestattet. Wenn dieser Jumper gesteckt ist, ist der Motor eingeschaltet und dreht sich mit maximaler Geschwindigkeit. Wenn Sie die Geschwindigkeit der Motoren programmgesteuert kontrollieren wollen, entfernen Sie die Jumper und verbinden Sie sie mit den Pins mit aktivierter PWM-Erzeugung am Arduino. Der VCC-Pin versorgt den Motor mit Strom. Die Spannung kann zwischen 5 und 35 V liegen. Wenn der Jumper 5V-EN gesteckt ist, muss eine 2V höhere Spannung als die tatsächliche Nennspannung des Motors angelegt werden, um die maximale Motordrehzahl zu erreichen. GND ist der gemeinsame Erdungspin. Der 5V-Pin versorgt die Schaltlogik im L298N IC mit Strom. Wenn der 5V-EN-Jumper gesteckt ist, fungiert dieser Pin als Ausgang und kann zur Stromversorgung des Arduino verwendet werden. Wenn der 5V-EN-Jumper entfernt ist, verbinden Sie ihn mit dem 5V-Pin des Arduino. Die ENA-Pins werden zur Steuerung der Geschwindigkeit von Motor A verwendet. Wenn dieser Pin auf einen hohen Wert gesetzt wird (indem der Jumper in Position gehalten wird), dreht sich Motor A, und wenn der gleiche Pin auf einen niedrigen Wert gesetzt wird, stoppt der Motor. Durch Entfernen des Jumpers und Verbinden dieses Pins mit dem PWM-Eingang kann die Geschwindigkeit von Motor A gesteuert werden. Die Pins IN1 und IN2 dienen zur Steuerung der Drehrichtung von Motor A. Wenn einer der Pins im High-Zustand und der andere im Low-Zustand ist, beginnt sich Motor A zu drehen. Sind beide Eingänge entweder im High-Zustand oder im Low-Zustand, wird Motor A angehalten. Die Pins IN3 und IN4 werden zur Steuerung der Drehrichtung von Motor B verwendet. Wenn einer der beiden Anschlüsse im High-Zustand und der andere im Low-Zustand ist, dreht sich der Motor B. Wenn beide Eingänge entweder im High-Zustand oder im Low-Zustand sind, wird Motor B angehalten. Der ENB-Pin wird zur Steuerung der Geschwindigkeit von Motor B verwendet. Wenn Sie diesen Stift in den High-Zustand versetzen (indem Sie den Jumper an Ort und Stelle halten), dreht sich der Motor B, wenn Sie diesen Stift in den Low-Zustand versetzen, stoppt der Motor. Wenn Sie die Brücke entfernen und diesen Pin mit dem PWM-Ausgang verbinden, können wir die Geschwindigkeit von Motor B steuern. Die Pins OUT1 und OUT2 sind mit Motor A verbunden, während die Pins OUT3 und OUT4 mit Motor B verbunden sind.
Anschließen des L298N-Controllers an einen Arduino UNO R3
Nun, da wir alles über das L298N-Treibermodul wissen, können wir es an unseren Arduino anschließen! Beginnen wir mit dem Anschluss der Stromversorgung an die Motoren. In unserem Projekt verwenden wir Gleichstrommotoren mit Reduktionsgetriebe, die typischerweise in Robotern mit Zweiradantrieb eingesetzt werden. Ihr Betriebsspannungsbereich reicht von 3V bis 12V. Wir werden also eine externe 12V-Versorgung an die VCC-Klemme anschließen. Aufgrund des internen Spannungsabfalls an den Brückentransistoren ,,H” in der L298N-Schaltung erhalten die Motoren eine Spannung von 10 V und drehen sich mit etwas geringerer Geschwindigkeit. Aber das ist in Ordnung. Als nächstes müssen wir 5 V für den Logikteil des L298N-Treibers bereitstellen.
Wir werden den eingebauten 5-V-Regler verwenden und 5 V von der Motorversorgung abnehmen, so dass der 5-V-EN-Jumper an seinem Platz bleibt. Nun werden die Eingangs- und Einschalt-Pins (ENA, IN1, IN2, IN3, IN4 und ENB) des L298N-Moduls mit den sechs digitalen Ausgangspins des Arduino (9, 8, 7, 5, 4 und 3) verbunden. Beachten Sie, dass beide Arduino-Ausgangspins, d.h. Nr. 9 und Nr. 3, PWM unterstützen. Schließen Sie schließlich einen Motor an Klemme A (OUT1 und OUT2) und den anderen Motor an Klemme B (OUT3 und OUT4) an. Wir können die Motoranschlüsse austauschen, technisch gibt es keinen richtigen oder falschen Weg.
Programm-Code
Die folgende Code-Skizze zeigt, wie man mit dem Motorcontroller L298N die Geschwindigkeit und Richtung eines Gleichstrommotors regelt und kann als Grundlage für weitere praktische Experimente und Projekte dienen:
// Podlaczanie silnika A ze sterownikiem L298N
int enA = 9;
int in1 = 8;
int in2 = 7;
// Podlaczanie silnika B ze sterownikiem L298N
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Piny sterowania silnikiem ustawione jako wejscia
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Stan poczatkowy - wylaczenie silnikow
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// Sterowanie kierunkiem obrotow silnikow
void directionControl() {
// Ustawienie maksymalnej predkosci obrotowej
// Zakres predkosci dla PWM od 0 do 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Wlaczenie silnikow A i B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Zmiana kierunku wirowania
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Wylaczenie silnikow
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// Funkcja pozwalajaca na regulacje predkosci obrotowej
void speedControl() {
// Wlaczenie silnikow
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Rozpedzanie silnikow
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Hamowanie silnikow
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Wylaczenie silnikow
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Der obige Code verwendet zwei spezielle Funktionen, nämlich:
directionControl() – Diese Funktion veranlasst beide Motoren, sich zwei Sekunden lang mit maximaler Geschwindigkeit vorwärts zu drehen. Dann kehrt er die Drehrichtung des Motors um und lässt ihn für weitere zwei Sekunden drehen. Schließlich schaltet er die Motoren ab.
speedControl() – Diese Funktion beschleunigt beide Motoren von Null auf die Höchstgeschwindigkeit, wobei PWM-Signale mit der Funktion analogWrite() erzeugt werden, und bremst dann die Motoren wieder auf Null ab. Schließlich schaltet er die Motoren ab.
Wie hilfreich war dieser Beitrag?
Klicke auf die Sterne um zu bewerten!
Durchschnittliche Bewertung 4.3 / 5. Stimmenzahl: 18
Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.