PWM Motoren nicht syncron

Hallo Zusammen,

ich habe ein mal ein Funktionsaufbau von einer L298n H Brücke, einem Arduino Nano und 2 DC Motoren aufgebaut.

Ich hab mir dann mal das Sketch von einer Seite für mein Aufbau angepasst und auf dem Nano hochgeladen.

Was mir wohl jetzt auffällt und was ich auch schon in einigen YouTube Videos gesehen habe, ist dass
die Motoren beim PWM Signal nicht gleichzeitig anfangen zu drehen. Dort findet eine Verzögerung von ca 1-2 Sekunden statt bis der zweite Motor anfängt sich zu drehen.

Für ein Fahrzeug mit zwei Motoren ist dies nicht sehr optimal, das die so zeitverzögert starten.
Denn somit dreht das Fahrzeug sich zuerst immer in eine Richtung bevor es gerade aus fährt.

Wie kann ich das im Script beheben? Ich möchte natürlich das beide Motoren gleichzeitig über das PWM Signal anfangen sich zu drehen und nicht nacheinander.

// connect motor controller pins to Arduino digital pins
// motor one
int enA = 6;
int in1 = 5;
int in2 = 7;
// motor two
int enB = 3;
int in3 = 4;
int in4 = 2;

void setup()
{
  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}
void demoOne()
{
  // this function will run the motors in both directions at a fixed speed
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255
  analogWrite(enB, 200);
  delay(2000);
  // now change motor directions
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  delay(2000);
  // now turn off motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}
void demoTwo()
{
  // this function will run the motors across the range of possible speeds
  // note that maximum speed is determined by the motor itself and the operating voltage
  // the PWM values sent by analogWrite() are fractions of the maximum speed possible
  // by your hardware
  // turn on motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // accelerate from zero to maximum speed
  for (int i = 0; i < 256; i++)
{
  analogWrite(enA, i);
  analogWrite(enB, i);
  delay(20);
}
  // decelerate from maximum speed to zero
  for (int i = 255; i >= 0; --i)
{
  analogWrite(enA, i);
  analogWrite(enB, i);
  delay(20);
}
  // now turn off motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}
void loop()
{
  demoOne();
  delay(5000);
  demoTwo();
  delay(5000);
}

Ich habe den Aufbau mal um eine 2. H Brücke erweitert, dort den linken Motor an Kanal A angeschlossen und den rechten Motor an der 2. Brücke an Kanal B angeschlossen.

Leider kam ich selbst mit dem Aubau zum selben Schluss das Kanal B an der einen Brücke weiterhin den Motor schneller über das PWM Signal andreht wie vorher auch, mit nur einer H Brücke.

Im Script geht es mir nur um dem Loop DemoTwo.

DC Motoren sind unterhalb einer gewissen Drehzahl kaum zu steuern, und reagieren auch noch empfindlich auf die aktuelle Last und Lastwechsel. Hinzu kommt die Ansteuerung mit PWM, die keine Drehzahlsteuerung ist.

Ohne einen Regler und einen Encoder für die Umdrehungen kommst Du da nicht aus. Aber dafür ist ja der Arduino da, mit dem sich so eine Regelung implementieren läßt.

zappelmann:
Was mir wohl jetzt auffällt ...

Mit dem selben Problem habe ich auch zu kämpfen. Das Einzige, was hilft, ist eine „elektronische Achse“: Beide Räder bekommen eine „Kodierscheibe“ (sieht aus wie ein Siemensstern), die abgetastet wird. Wenn bei einem Rad die Drehung dazu geführt hat, dass ein Wechsel an der Kodierscheibe registriert wurde, wird es so lange abgebremst (oder angehalten), bis auch am anderen Rad ein Wechsel stattgefunden hat.

Der Algorithmus ist im Grunde ziemlich simpel. Dass ich das noch nicht gemacht habe, liegt daran, dass mein „Langzeitgebastel“ gerade pausiert. In diesem Thread habe ich das mit der el. Achse aber schon einmal hier angeleiert. Möglich, dass Dir dieser Thread ein paar Antworten gibt.

Gruß

Gregor

Nachtrag: Man könnte natürlich auf die Idee kommen, statt DC-Getriebemotoren Schrittmotore zu verwenden. Die stärksten Gegenargumente: Ein Stepper zieht irre Strom und hat stromlos ein lächerliches Haltemoment. DC-Getriebemotore sind da sozusagen um 180° (also vollkommen) anders. Nachteil ist halt, dass selbst zwei eigentlich „identische“ Motore unterschiedlich schnell laufen (bei meinen ist sogar der Unterschied bei vorwärts/rückwärts anders. Für Geradeauslauf ist das natürlich der absolute Horror)