Im vorhergehenden Projekt eMalRob Cody++ wurden
die Encoder erstmals integriert und die Blöcke für Distanzfahrt,
Kreisfahrt und Winkelfahrt neu erstellt, wie in der
Konzeptentwicklung zu entnehmen ist.
Aktuell wird durch den Benutzer ein maximaler Counterwert
festgelegt, die Lichtimpulse der Encoder werden dann solange in
unabhängigen Interrupts hochgezählt, bis der maximale Counterwert
erreicht wird. Nachdem der maximale Wert erreicht wurde, wird der
jeweilige Motor über den dazugehörigen Interrupt abgeschaltet.
Software anpassen
Im ersten Schritt wurde die Auswertung der Encodersignale genauer
untersucht. Dabei wurde der Counter des jeweiligen Encoders (links
und rechts) auf den seriellen Monitor ausgegeben. Dies ist im
folgenden Bild dargestellt. Man erkennt, dass
die jeweiligen Werte ungleichmäßig hochgezählt werden.
Der Grund dafür ist, dass zu viele
Rechenoperationen wie beispielsweise Ausgaben auf den seriellen
Monitor in der Interrupt-Service-Routine ausgeführt werden, die das Ergebnis verfälschen. Der
Fehler wurde dadurch behoben, dass die Interrupt-Service-Routinen gekürzt
wurden.
Ein weiterer Fehler der älteren
Encodersteuerung besteht darin, dass die beiden Motoren unabhängig
voneinander gestoppt werden, wenn sie die gewünschte Impulsanzahl
erreicht haben. Dabei kommt es sehr häufig während des Bremsvorgangs
zu einer Drehung des Roboters nach rechts oder links, weil ein
Encoder die gewünschte Impulsanzahl bereits früher erreicht hat, als
der andere. Der Fehler kann dadurch behoben werden, dass bei dem
Erreichen des maximalen Counter-Wertes von einer Seite beide Motoren
gleichzeitig abgeschaltet werden. Dafür muss aber davon
ausgegangen werden, dass sich beide Räder gleich schnell drehen und
deshalb bei Erreichen des maximalen Counter-Wertes von einer Seite
die Distanz auf jeden Fall zurückgelegt wurde, obwohl der Counter
der anderen Seite noch nicht den maximalen Wert erreicht hat. Die
detaillierte Lösung ist in der
Softwaredokumentation zu entnehmen.
PI-Regler integrieren
Im nächsten Schritt sollte das Problem der
unterschiedlichen Geschwindigkeiten behoben werden, damit eine
präzise Geradeausfahrt möglich ist. Hierfür wurde eine
PI-Regler-Schleife integriert, sodass die Positionen der beiden
Motoren geregelt werden. Zunächst wird ein PWM-Signal als
"Basisansteuerung" auf die Motoren gegeben, sodass beide Motoren
sich langsam drehen. Entsteht bei der Drehung der Motoren eine
Positionsdifferenz, so wird diese Regelabweichung auf die Motoren
(in Form von PWM-Signalen als Stellgrößen) zurückgeführt.
Die Stelleingriffe des Reglers werden bei dieser Regelung immer mit
unterschiedlichen Vorzeichen auf die Motoren gegeben. Dadurch erreicht man, dass
der zu schnell drehende Motor abgebremst wird, während der zu
langsam drehende Motor beschleunigt.
Entprellen der Encoder
Nach weiteren Versuchen stellte sich heraus,
dass die Lichtimpulse der Encoder noch entprellt werden mussten. Das
Problem ist, dass es beim Empfangen des Lichtimpulses zum Prellen
kommt, wie in folgender Abbildung zu erkennen ist.
Durch Softwareentprellung konnte das Problem jedoch gelöst werden.
Dabei werden die kurzen Impulse herausgefiltert, sodass eine
einzelne Flanke verbleibt. Die detaillierte Lösung ist der
Softwaredokumentation zu entnehmen.
Winkelfahrt
Zusätzlich zur Distanzfahrt wurde die Winkelfahrt mithilfe desselben Vorgehens optimiert. Dabei sollte beachtet werden, dass die
Räder in unterschiedliche Richtungen drehen. Ansonsten können die
Funktionen analog verwendet werden.
|