PWM- Problem

Hi,
ich bastel gerade an einem 2WD-Robot-Car Bausatz rum.

Ich gebe zur Motorsteuerung 2 gleich PWM-Werte per analogWrite auf Pin 10 und Pin 5 aus.

Dabei messe ich an Pin10 die korrekte PWM-Frequenz von 490Hz an Pin5 jedoch eine Frequenz von 975Hz.
Warum kann ich nicht verstehen.

Den Wert für die Pulsbreite stelle ich z.Z. mit einem Poti ein.
Der soll aber noch von der BAtteriespannung abgeleitet werden.

// Test der Smart-Robot-Car Motorplatine:  SRC-Test_L298N-motSpeed-LP
// aus PDF: Tutorial - L298N Dual Motor Controller Module 2A and Arduino
// 
// ********************************************************
// motor one        Kabelfarben
int enA = 10; //    bl blau  
int in1 = 9;  //    gn grün
int in2 = 8;  //    gb gelb

 // Setup DC Motor B (front and rear) pins
int in3 = 7;  
int in4 = 6; 
int enB = 5; 

int battPin = 2;  // Halbe Batteriespannung
int battVal = 0;   // Variable zum Speichern
int motSpeed = 100;   // PWM Ausgabe für Geschwindigkeit

void setup()
{
// set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);

pinMode (in3, OUTPUT);
pinMode (in4, OUTPUT); 
pinMode (enB, OUTPUT);                                                                                                                                                                                                                                                               

Serial.begin(9600);
}
void loop()
{
// liest und gibt BatterieSpannung aus  (Werte 0-1023)
battVal = analogRead(battPin);   // lies Spannung
    Serial.print(battVal);   //Ausgabe auf Monitor
    Serial.print(" ->  ");   //Ausgabe auf Monitor
    
battVal = battVal/4;  //oder   battVal = map(battVal, 0, 1023, 0, 255);
    Serial.print(battVal);   //Ausgabe auf Monitor
    Serial.print(" ->  ");   //Ausgabe auf Monitor
    
motSpeed = 255-battVal;    //Wert invertieren
    Serial.print(motSpeed);   //Ausgabe auf Monitor
    Serial.print(" ->  ");   //Ausgabe auf Monitor
// turn on motor B
digitalWrite(in4, HIGH);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
// 
analogWrite(enA, motSpeed);
    Serial.print(motSpeed);
    Serial.print(" ->  ");   //Ausgabe auf Monitor
analogWrite(enB, motSpeed);
    Serial.println(motSpeed);
}

Das ist normal. Die Pins verwenden unterschiedliche Timer:

http://playground.arduino.cc/Main/TimerPWMCheatsheet

Jeder der 3 Timer steuert 2 PWM Ausgänge. Nicht alle Timer haben die gleichen Teilerwerte und darum kann nicht die gleiche Frequenz auf allen PWM Ausgängen ausgegeben werden.

Grüße Uwe

Am Arduino (Uno) werden alle 3 Timer für PWM verwendet:

D3 …. Timer 2 „B“ output (OC2B), PWM-Frequenz: ca. 490 Hz
D5 …. Timer 0 „B“ output (OC0B), PWM-Frequenz: ca. 980 Hz
D6 …. Timer 0 „A“ output (OC0A), PWM-Frequenz: ca. 980 Hz
D9 …. Timer 1 „A“ output (OC1A), PWM-Frequenz: ca. 490 Hz
D10 … Timer 1 „B“ output (OC1B), PWM-Frequenz: ca. 490 Hz
D11 … Timer 2 „A“ output (OC2A), PWM-Frequenz: ca. 490 Hz

Leopoldi:
... korrekte PWM-Frequenz von 490Hz an Pin5 jedoch eine Frequenz von 975Hz.
...

Wieso hältst Du 490 Hz für korrekt, 975 Hz aber nicht?
Kann es sein, dass Du Pulsweite und Frequenz durcheinanderbringst?

Gruß

Gregor

Die Frequenz spielt erstmal keine Rolle beim PWM. Nur die Impulsbreite. zB werden Modellbauservos gerade mal mit 50Hz gefahren. Das die Timer unterschiedliche Frequenzen ausgeben, war mir auch neu, aber spielt kaum eine Rolle. Es kann allerdings leichte Drehzahlabweichungen geben, da Motoren ein klein wenig anders reagieren wenn man sie statt 500 mal pro Sekunden 1000 mal pro Sekunde anschubst. Allerdings sind diese unterschiede kleiner als die Serienstreuung der Motoren.

Will man also genau geradeaus laufen, muss man mit Lichtschranke korrigieren. Ich habe das gerade auch lösen müssen. Gabellichtschranke montiert und via Interupt ausgewertet.

Hallo und Danke.

Unterschiedliche Timer - das erklärt evtl. auch warum die beide Signale asynchron laufen.

Beide DC-Motoren verhalten sich auch unterschiedlich (unterschiedliche Effektivwerte?).

Gruß Ulli

Bild im Anhang

Hallo,

tut mir leid, aber #5 kann ich so nicht unkommentiert oder unkorrigiert stehen lassen.

Die PWM Frequenz spielt nur dann keine Rolle, wenn man sie als analoge Spannung betrachtet, also den reinen Effektivwert. Bei allen anderen spielt die grundlegende Frequenz schon eine Rolle. Damit legt man schon einmal die Feinheit/Regelbarkeit des Tastverhältnisses fest. Wie fein oder grob die Abstufungen werden können.

@ Leopoldi: Auch wenn der Effektivwert mit selben Tastverhältnis gleich ist, reagieren die Motoren doch unterschiedlich auf die Frequenz. Der eine wird öfters erregt wie der andere. Zum Bsp. Den Zusammenhang müsste eigentlich chefin besser erklären können. Deswegen bin ich von seiner pauschalen Aussage etwas enttäuscht. Er kann es besser. :wink: