Do. Apr 25th, 2024

Die I/O-Pins des Arduino können nur maximal 40mA aufbringen. Das reicht, um andere Digitaleingänge oder einzelne LED’s anzusteuern. Bei großen Lasten, wie z.B. Power-LEDS, Gleichstrommotoren, Relais benötigt man eine Zusatzschaltung, um den I/O-Pin zu verstärken.

Die Grundschaltung

Für das Schalten von größeren Strömen verwendet man Bipolare-Transistoren oder wenn es sich um große Lasten handelt auch sogenannte Power-MOSFET’s. Der Unterschied ist (vereinfacht) das Bipolar-Transitoren mit Strom gesteuert werden und FETs mit Spannung.

Schaltbilder mit Bipolar- und Feldeffekt-Transistoren

Ein MOSFET ist ein elektronischer Schalter, welcher hohe Ströme durch Anlegen einer Steuerspannung am Gate schalten kann. Ein sehr kleiner Strom (<1 mA) „öffnet“ dieses Gatter und lässt den Strom fließen. Dies ist sehr praktisch, da wir die Arduino-PWM-Ausgabe an dieses Gate senden können, wodurch ein weiterer PWM-Impulszug mit demselben Tastverhältnis durch den MOSFET erzeugt wird, wodurch Spannungen und Ströme ermöglicht werden, die den Arduino zerstören würden. Ein voll durchgesteuerter MOSFET hat zwischen Drain und Source im eingeschalteten Zustand nur wenige Milliohm Widerstand. Die Verlustleistung am MOSFET bleibt deshalb gering.

Allerdings muss man die richtigen Typen auswählen, welche sich mit der geringen Steuerspannung von 0..5V des Arduino vollständig öffnen lassen. Diese MOSFETs werden auch als „Logic Level MOSFET“ bezeichnet. Ein sehr verbreiteter Transistor ist der N-Kanal-Typ IRLIZ44N. Den gibt es bereits für wenige Cent in allen Fachgeschäften. Das Datenblatt findet sich hier!

Steuern von Gleichstrommotoren

Viele elektrische Verbraucher können in ihrer Leistung reguliert werden, indem die Versorgungsspannung in weiten Bereichen verändert wird. Ein normaler Gleichstrommotor wird z. B. langsamer laufen, wenn er mit einer geringeren Spannung versorgt wird, bzw. schneller laufen, wenn er mit einer höheren Spannung versorgt wird. Anstatt die Spannung abzusenken, ist es auch möglich, die volle Versorgungsspannung über einen geringeren Zeitraum anzulegen. Und genau das ist das Prinzip der Pulsweiten-Modulation (PWM). Durch die Abgabe von Pulsen mit unterschiedlichen Pulsweiten wird die abgegebene Energiemenge gesteuert.

Pulsweitenmodulation

Praktisch nimmt man bei der Pulsweiten-Modulation ein Rechtecksignal mit einer festen Frequenz und variiert die Breite der jeweiligen Pulse, um so die abgegebene Energiemenge zu steuern.  Der Arduino Uno stellt standardmässig mit der Funktion analogWrite (pin, wert) eine einfache Möglichkeit bereit, PWM-Signale zu erzeugen. Bei dieser eingebauten Funktion ist die Auflösung konstant bei 8 Bit und die Frequenz bei den Pins (D3, D9, D10 und D11) 490 Hz bzw. 980 Hz bei den Pins (D5 und D6).

Wer für seine Anwendung eine höhere Auflösung  benötigt, muss die entsprechenden Timer-Funktionen nutzen, mit der eine flexiblere Plus-Erzeugung möglich ist.

Die Funktion analogWrite sendet „pseudo-analoge“ Werte (Pulse mit einem definiertem Puls/Pausen Verhältnis ) an den adressierten Ausgangspin mit folgender Syntax:

PWM-Signal Charakteristika

Ein PWM-Signal ist somit durch zwei Größen charakterisiert: Die Frequenz f (normalerweise Prozessor-abbhängig aber konstant) und den Tastgrad g auch als dutycycle bezeichnet.

Frequent f = 490 Hz
T = 1/f  : T= 1/490 Hz = 2,041 ms
pwm_value 255 : tL = T = 2041 µs
pwm_value 1   bedeutet T/256 == 7,97 µs

pwm_value 127 bedeutet T/256 * 127 = 7,97 µs * 255 = tH = 1/2T
Tastgrad g = (1/2T)/T= 1/2 =50%

pwm_value 255 bedeutet T/256 * 255 = 7,97 µs * 255 = tH = T
Tastgrad g = T/T= 1 = 100%

Damit wird deutlich, dass der Parameter value in der Funktion analogWrite() im direkten Zusammenhang mit der festgelegten Frequenz und der Zeit t_H steht. Über den in der Abbildung beschriebenen Zusammenhang

    \[g =\frac{T}{t_H+t_L} = \frac{\frac{1}{f}}{t_H+t_L}\]

lassen sich dann die jeweiligen Tastgrade bestimmen.

In der praktischen Anwendung kann man damit ohne weiteres eine einfache Geschwindigkeitssteuerung für einen Motor realisieren. Komplexere Steuerungsaufgaben erfordern dann aber spezifischere Motorsteuerungen, um die es hier aber nicht gehen soll.

Es soll ein Motor gemäß der oben im Beitrag dargestellten Schaltung mit Hilfe eines MOSFETs IRF24A gesteuert werden. Das verwendete Arduino Programm, gibt in einer Schleife die PDM Werte aus und steuert damit nach dem PWM-Verfahren die Geschwindigkeit eines Motors (z.B eines Lüfters).

// Lüftersteuerung
// PHOF Jan 2021
  const int motorpin = 3;
  int motor_speed = 0; 

void setup(){
  Serial.begin(57600);
  pinMode(motorpin, OUTPUT); 
}

void loop() {
  for (motor_speed = 0; motor_speed <= 255; motor_speed += 5) {
    printSpeed(motor_speed); 
    analogWrite(motorpin, motor_speed); 
    delay(250);
  }
  delay(5000); 
}

void printSpeed(int motor_speed) {
   Serial.print("Current Speed: ");
   Serial.println(motor_speed); 
}

Im nachfolgenden Beispiel ist gezeigt, wie man eine eigene Pulsweitensteuerung aufbauen kann. Hier wird nicht die eingebaute analogWrite-Funktion verwendet, sondern man erzeugt zwei digitale Pulse, deren Zeiten durch einen Potentiometer gesteuert werden. Könnte man natürlich einfacher machen, aber um zu zeigen, wie die Pulsdauern variiert werden, taugt dieses kleine Beispiel sicher besser.

Beispiel einer selbsterzeugten Pulsweiten Steuerung