Hallo liebe Arduino-Gemeinde,
ich habe folgendes Problem:
Ich programmiere mir derzeit mit einem Arduino Mega einen eigenen Rasenmähroboter.
Ich steuere meine beiden Radmotoren mit einem Dual H-Brücken Treiber von Pololu (MC33926) an.
Klappt soweit auch ganz gut, nur drehen sich die Motoren bei gleichem PWM Signal mit unterschiedlichen Drehzahlen.
Mein Code (stark vereinfacht) sieht so aus:
#define LeftFront LOW // "Variablen-Namen" werden durch den jeweiligen Status ersetzt
#define LeftBack HIGH
#define RightFront LOW
#define RightBack HIGH
const int motorRightPWM = 10; // PWM-Steuerung für RM, max. 125 pro Motor
const int motorRightDir = 9; // Drehrichtung für Radmotoren, siehe oben #define
const int motorLeftPWM = 8;
const int motorLeftDir = 7;
const int stopTaste = 2; // Stop-Taste
const int startButton = 11; // Pin für Start-Taster
const int stossSensor = 10;
bool startState = LOW; // allgemeine Betriebsbedingung
void setup()
{
pinMode (motorRightPWM, OUTPUT); // Output Pins definieren
pinMode (motorRightDir, OUTPUT);
pinMode (motorLeftPWM, OUTPUT);
pinMode (motorLeftDir, OUTPUT);
pinMode (stossSensor, INPUT_PULLUP);
pinMode (startButton, INPUT_PULLUP); // Eingänge mit internen Pull-Up Widerständen versehen, im unbetätigten Zustand: HIGH
pinMode(stopTaste, INPUT_PULLUP);
attachInterrupt(0, STOP, CHANGE); // Interrupt 0 am digitalen Port 2 bei Änderung -> Motor Stop
}
void loop()
{
if (digitalRead(startButton) == LOW) // Wenn Starttaster gedrückt drehen sich die Motoren gegenläufig, also faehrt der Maeher vorwaerts
{
startState = HIGH; // Hilfsvariable
analogWrite(motorRightPWM, 125); // PWM Pins für Geschwindigkeitssteuerung
digitalWrite(motorRightDir, RightFront); // Direction Pins für Drehrichtung
analogWrite(motorLeftPWM, 125);
digitalWrite(motorLeftDir, LeftFront);
}
while (startState == HIGH) // solange Variable gesetzt ist wird der Stoßsensor ueberprueft
{
if (digitalRead(stossSensor) == LOW)
{
digitalWrite(motorRightPWM, LOW); // Block für Motorstop
digitalWrite(motorRightDir, LOW);
digitalWrite(motorLeftPWM, LOW);
digitalWrite(motorLeftDir, LOW);
delay(1000);
analogWrite(motorRightPWM, 125); // Block für beide Motoren Rückwärts
digitalWrite(motorRightDir, RightBack);
analogWrite(motorLeftPWM, 125);
digitalWrite(motorLeftDir, LeftBack);
delay(2000);
analogWrite(motorRightPWM, 70); // Block für Rechtsdrehung
digitalWrite(motorRightDir, RightBack);
analogWrite(motorLeftPWM, 70);
digitalWrite(motorLeftDir, LeftFront);
delay(2000);
analogWrite(motorRightPWM, 125); // Wieder vorwaerts
digitalWrite(motorRightDir, RightFront);
analogWrite(motorLeftPWM, 125);
digitalWrite(motorLeftDir, LeftFront);
} // end if
} // end while
} // end of loop
void STOP() // Funktion für den Interrupt
{
startState = LOW; // Hilfsvariable wird auf LOW gesetzt und Programm wartet auf Starttaster
digitalWrite(motorRightPWM, LOW); // Motorstop
digitalWrite(motorRightDir, LOW);
digitalWrite(motorLeftPWM, LOW);
digitalWrite(motorLeftDir, LOW);
}
Wenn ich beide Motoren auf den "Direction-Pins" mit HIGH belege, drehen sich beide gleich schnell.
Belege ich hingegen einen mit LOW und einen mit HIGH, also zum Drehen des Mähers, dreht ein Motor langsamer als der andere.
Und hier ist die Frage: Wie bekomme ich das weg? Hat das etwas mit meinem Code zu tun? Oder kann der Treiber irgendwas nicht verarbeiten?
Außerdem kann ich beide Motoren nicht mit einem PWM Wert von 255 ansteuern, sonst dreht einer so gut wie gar nicht und der andere recht schnell. Es funktioniert erst ab einem Wert von 125 (also pro Motor das halbe maximale PWM Signal 2,5 V).
Hoffe ihr könnt mir weiterhelfen.
Vielen Dank im Voraus.

