kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




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.

arduino_micro_motor003.zip - Arduino-Quelltext.
Aufgabe

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