PWM / PPM Frequenz an Brushless Motoren mit dem Netduino

NetduinoServo01_bearbeitet-1

Im Modellbau ist es üblich, dass die Frequenz für PWM bei 50Hz zum Ansteuern von analogen Servos und analogen Motorenreglern verwendet wird. Wer allerdings einen digitalen Servo oder eine digitale Motorensteuerung hat, kann hier eine weit höhere Frequenz verwenden. Besonders bei Modellhelikoptern oder auch bei den Quadrocoptern wird dies gefordert. Der Grund liegt hier klar auf der Hand, dass die Periodendauer wesentlich kürzer wird und somit pro Sekunde mehrmals ein neuer Steuerwert festgelegt werden kann. Bei 50Hz liegt die Periodendauer bei 20 Millisekunden, wovon 1 bis 2 Millisekunden das eigentliche Steuersignal (Duration) abbilden und in den restlichen 18 Millisekunden nichts weiter kommt. Daher habe ich mir gedacht, wie sieht eigentlich dann das Signal aus, wenn es auf 200Hz gesetzt wird.

image
Beispiel Darstellung mit 50Hz PWM Signal mit einer Periodendauer von 20ms.
image
Beispiel Darstellung mit 200Hz PWM Signal mit einer Periodendauer von 5ms

Schnell stellt sich heraus, dass sich grundsätzlich die Periodendauer und die LOW Pegellänge verändert, wie in den Bildern zu sehen ist. Die Duration bleibt unverändert und wird auch nicht skaliert, was das Programmieren des Signals einfach gestaltet. Im nächsten Programm Beispiel wird der erste PWM Port mit 20ms und der zweite Port mit 5ms Periodendauer initialisiert.

// PWM Signal mit 20 Millisekunden Periode und 1 Millisekunde Duration
PWM pwm1 = new PWM(PWMChannels.PWM_PIN_D5, 20000, 1000,
    PWM.ScaleFactor.Microseconds, false);
// PWM Signal mit 5 Millisekunden Periode und 1 Millisekunde Duration
PWM pwm2 = new PWM(PWMChannels.PWM_PIN_D6, 5000, 1000,
   PWM.ScaleFactor.Microseconds, false);

// PWM Ausgänge starten
pwm1.Start();
pwm2.Start();

// Analogen Eingang einrichten zum verstellen der Duration für die PWM Ausgänge
AnalogInput ai = new AnalogInput(Cpu.AnalogChannel.ANALOG_0);

double addDuration = 0;

while (true)
{
   // Abfrage des Analogen Einganges
    addDuration = ai.Read();

    // Neuen Duration Wert zuweisen zwischen 1000µs bis 2000µs
    pwm1.Duration = 1000 + (uint)(addDuration * 1000);
    pwm2.Duration = 1000 + (uint)(addDuration * 1000);

}

Dieser Inhalt wird in der ‘Main()’ Methode ausgeführt.

Mit dem analogen Eingang wird die Duration neu festgelegt, was mit einem Potentiometer bestimmt werden kann.

Netduino_zwei_Servos_Steckplatine
Hier sollten möglichst schwache Servos verwenden werden, um den Netduino nicht sonderlich zu belasten andernfalls ist eine externe Versorgung notwendig.

Für diesen Test funktionierten auch die analog Mini Servos, wenn auch nicht ideal (Leider keine passenden Digital Servos). Dreht man nun an dem Potentiometer, so kann man erkennen, dass der Servo am Port mit 200Hz schneller reagiert und der andere mit 50Hz nachzieht.

PWM Steuerung mit verschiedenen Frequenzen
Highspeed Aufnahme mit zwei Servos. Der mit dem Kreuzarm, wird mit 200Hz betrieben. Der mit den einzelnen Arm, wird mit 50Hz angesteuert.

Zudem benötigt die Klasse beim Zuweisen einer neuen Duration etwas Zeit. Grund hierfür ist, dass beim Zuweisen gewartet wird (siehe dazu ggf. Interrupt). Das bedeutet, wenn im Programmcode die Duration einen neuen Wert erhält, so kann es einige Millisekunden dauern, bis es an der Stelle weiter geht. Deutlich wird dies beim Zeitstoppen. Die folgenden Ergebnisse zeigen die Dauer eines Durchlaufens vom Einlesen des Analogen Wertes und anschließend das Zuweisen der beiden PWM Ports.

image image
Netduino Plus 2 Netduino Plus 1

Eigentlich sollte hier die Iterationsdauer fast immer gleich sein, aber sie springt teilweise von 2100 Mikrosekunden bis über 4000 Mikrosekunden bei dem Netduino Plus 1. Der Netduino Plus 2 ist da schon wesentlich konstanter und ist im Schnitt eine halbe Millisekunde schneller, was allein der höheren Taktrate zu verdanken ist.

Zusammengefasst ist klar, dass eine höhere Steuerfrequenz weniger Zeit benötigt, und die zu steuernde Einheit in kürzerer Periodendauer ein neues Steuersignal erhält. Die Frequenzen weit über 50Hz sind aber gut für digital Servos und ESC Regler (Brushless Regler) geeignet. Wie hoch die maximale Steuerfrequenz sein darf ist von der Abtastung des Reglers abhängig.

Verwendete Inhalte:

  • Netduino Plus und Netduino Plus 2
  • Analog Servo; 4,8V-6V  (oder besser ein Digital Servo)
  • Potentiometer
  • Kabel

Die Beispiel Solution mit .NET Micro Framework 4.2 zum Downloaden.

Kommentare

Beliebte Posts aus diesem Blog

Arduino Control (Teil 5) - PWM Signal einlesen

RC Fahrtenregler für Lego Kettenfahrzeug

Angular auf dem Raspberry Pi