PWM-Signale (Pulsweitenmodulation) werden verwendet um Bauteile anzusteuern und Sensorwerte zu erhalten. PWM-Signale können auch missbraucht werden um beispielsweise LEDs zu dimmen oder einen Buzzer anzusteuern. Dazu erkläre ich in diesem Beitrag kurz den Aufbau von PWM-Signalen und wie du mit einem .Net Microcontroller einen Servo ansteuern kannst.
PWM-Signale
Ein PWM-Signal ist ein sich ständig wiederholendes Signal. Zum Anfang der Periode wird für eine bestimmte Zeit (Pulsbreite) ein High-Wert (der Puls, 3,3 V) ausgegeben. Für den Rest der Periodendauer wird ein LOW-Wert (0 V) ausgegeben.
Beispiel Servo:
Das Servo erwartet ein PWM-Signal mit einer Periodendauer von etwa 20 ms. Über die Pulsbreite des High-Signals wird die gewünschte Position vom Servo bestimmt. Bei 0,5 ms zeigt der Servo nach links, bei 1,5 ms nach vorne und bei 2,5 ms nach rechts. Um das Servo also nach vorne zeigen zu lassen, muss alle 20 ms ein Puls für 1,5 ms erzeugt werden.
Beispiel LED:
Um eine LED zu dimmen wird heutzutage oft PWM eingesetzt. Die LED leuchtet dann nicht konstant, sondern wird mittels PWM in hoher Frequenz ein- und ausgeschaltet. Dabei kann über die Pulsdauer die Helligkeit bestimmt werden. Weil das menschliche Auge träge ist, wird die LED nicht flackernd sondern konstant leuchtend wahrgenommen. Achtung: Das funktioniert nur theoretisch. Praktisch sehen viele Menschen doch ein mehr oder weniger starkes Flackern, was nachts an LED-Rückleuchten von vorbeifahrenden Autos beobachtet werden kann.
Die Schaltung
Ich verwende für dieses Beispiel das Servo HS-311:
Kabelfarbe | Spannung | |
---|---|---|
Gelb | PWM-Signal 3 – 5 V |
Kann direkt an den PWM-Pin vom Microcontroller angeschlossen werden |
Rot | Betriebsspannung 4,8 – 6 V |
Für diesen Test kann die Betriebsspannung in der Regel vom 5V-Pin des Microcontroller-Boards abgegriffen werden. Wenn in späteren Projekten mehrere Verbraucher angeschlossen werden, musst du die benötigte Gesamtstromstärke ausrechnen und eventuell die Verbraucher an eine separate Spannungsquelle anschließen. Beachte auch, dass Servos unter Last mehr Strom benötigen. Informiere dich in den Datenblättern vom Servo und vom Microcontroller-Board ob die Spannungsversorgung ausreicht. |
Schwarz | Masse |
Code
PWM pwm = new PWM( Cpu.PWMChannel.PWM_3, 20000, 0, PWM.ScaleFactor.Microseconds, false); pwm.Start(); while (true) { pwm.Duration = 500; // 0,5 ms: links Thread.Sleep(1000); pwm.Duration = 1500; // 1,5 ms: geradeaus Thread.Sleep(1000); pwm.Duration = 2500; // 2,5 ms: rechts Thread.Sleep(1000); }
Im Konstruktor der PWM-Klasse wird zuerst der PWM-Channel übergeben. Hier heißt es wieder: Datenblatt vom Microcontroller-Board nach der Belegung der PWM-Ausgänge durchsuchen. Der PWMChannel.PWM_3 liegt beim Cerbuino Bee auf dem Pin D5. Außerdem wird im Konstruktor die Periodendauer angegeben. Für den PWM-Servo sind 20 ms richtig. Der dritte Parameter gibt die Pulsdauer an, die bei der Initialisierung auf 0 stehen kann. Der ScaleFactor ist wichtig für die Zeitangaben: Weil für die Zeitangaben Integer-Werte benutzt werden, muss der ScaleFactor (Einheit) klein genug sein, um die Werte als ganze Zahlen darstellen zu können. Mit dem letzten Parameter kann das PWM-Signal invertiert werden. Das ist für den Betrieb des Servos nicht nötig.
Nach der Instanziierung wird die Ausgabe des PWM-Signals gestartet. Durch die Pulsweite von 0 ms, liegt am Port erst mal dauerhaft ein LOW-Wert an.
In der Endlosschleife wird die Pulsdauer für verschiedene Positionen eingestellt und dann kurz gewartet um dem Servo Zeit zu geben die neue Position einzustellen.
Fazit
Mit einem PWM-Signal ist es einfach Geräte anzusteuern. Der Beispielcode steuert auf eine einfache Art einen Servo an. Für eine weitere Benutzung solltest du den Ansteuerungs-Code auslagern und sinnvoller ansprechbar machen, damit du im weiteren Programmverlauf nicht mit den Millisekundenangaben, sondern mit Positionsangaben arbeiten kannst. Ich habe dazu auch eine Klasse erstellt, die ich in einem späteren Beitrag vorstellen werde.
Zurück zum NetMf-Tutorial-Index
Disclaimer
Die hier zusammen gestellten Informationen und Anleitungen habe ich mit bestem Wissen und Gewissen erstellt. Falls sich Fehler eingeschlichen haben oder du Verbesserungsvorschläge hast, schicke mir bitte eine Nachricht oder schreibe einen Kommentar unter den jeweiligen Beitrag. Informiere dich selber wie alles funktioniert. Ein Nachbau erfolgt auf eigene Gefahr. Du allein bist dafür verantwortlich, dass das, was du tust, funktioniert und keine Sach- oder Personenschäden verursacht.
Danke für den tollen Beitrag, ich habe noch eine Frage:
Sind die Pulse Breiten und Frequenzen der PWM – Signale von LED und Servo vergleichbar?
Könnte ich eventuell eine LED Steuergerät / Controller mit Fernbedienung zum steuern von Servo’s verwenden?
Wer kann mir helfen?
Danke im Voraus, JS
Hi Josef,
Danke für das Kompliment.
Zu deiner Frage: Dazu habe ich keine praktische Erfahrung. Ich halte es aber für sehr unwahrscheinlich, dass das funktioniert. Denn das Dimmen von LEDs erfordert eine viel höhere Frequenz (also deutlich kürzere Pulsbreiten) als ein Servo. Ein normaler Servo benötigt eine Pulsbreite von 20 ms. Es würde mich sehr wundern, wenn es eine Ansteuerung für eine LED gäbe, die auch mit 20 ms, also 50 Hz arbeitet. Denn bei 50 Hz wäre ein sehr deutliches Flackern der LED zu sehen.
Viele Grüße,
Daniel