Verwendung der nativen PWM-Ausgänge zur Steuerung des Motors
(EN google-translate)
(PL google-translate)
In den vorangehenden beiden Projekten wurde der Motor über in der Hauptschleife über Verzögerungen implementierte PWM-Signale gesteuert. Dies macht es zum einen schwer weitere Funktionalität in die Hauptschleife zu integrieren. Zum anderen ist die Auflösung des PWM-Signals so sehr grob.
Mikrocontroller besitzen Timer, die in der Lage sind PWM-Signale auf bestimmten Pins zu erzeugen. Dazu müssen lediglich spezielle Register des Mikrocontollers entsprechend konfiguriert werden. Die eigentliche Generierung des PWM-Signals übernimmt dann die Hardware (interne Peripherie).
Für die Arduino-Entwicklungsumgebung wurde die Methode "analogWrite(..)" eingeführt, die tatsächlich ein PWM-Signal auf die oben beschriebene Art und Weise erzeugt und einem weitestgehend die Registerkonfiguration erspart.
Auf den den Arduino-Boards zugrunde liegenden AVR-Mikrocontrollern sind häufig mehrere Time mit 8 oder 16 Bit Zählregistern integriert, z.B. bei einem ATmega 32 sind es zwei 8-Bit-Timer (Timer 0 und Timer 2), sowie ein 16-Bit-Timer (Timer 1). Von der Anzahl der Zählregister-Bits hängt ab, mit welcher Auflösung ein PWM-Signal erzeugt werden kann. Ein 8-Bit-Timer erlaubt intern PWM-Werte von 0 bis 255, kann also eine 5 Volt Spannung beispielsweise im Mittel mit Schritten von ca. 0.02 Volt auflösen.
Nachfolgendes Programm stellt eine Variante des ersten Motor-Projekts dar, bei der aber mit analogWrite(..) gearbeitet wird:
int zaehler = 0; int xPWM = 0; void setup() { // put your setup code here, to run once: pinMode(9,OUTPUT); //Ard. oben4=OutPin D9 ---- L293 Pin 15 Input4 pinMode(4, OUTPUT); //Ard. oben9=OutPin D4 ---- L293 Pin 10 Input3 pinMode(3, OUTPUT); //Ard. oben10=OutPin D3 ---- L293 Pin 10 Enable2, PWM pinMode(13, OUTPUT); //Board LED //Eine Richtung festlegen und PWM aus: digitalWrite(4,HIGH); digitalWrite(9,LOW); analogWrite(3,0); //LED aus digitalWrite(13,LOW); } void loop() { delay(20); //0,02 Sekunden Pause if(zaehler==0) { digitalWrite(13,HIGH); analogWrite(3,xPWM); //Änderung des aktuell gültigen PWM-Wertes xPWM++; xPWM%=256; } else if(zaehler==2) { digitalWrite(13,LOW); } zaehler++; zaehler%=5; //0,1 Sekunde == 5 PWM-Perioden }
Code 0-1: Verwendung von analogWrite(..) zur Erzeugung von PWM-Signalen.

Aufgabe
Übertragen Sie das Verwenden von analogWrite(..) auch auf das zweite Motorprojekt, bei dem die PWM-Werte vom PC kommen.