Hallo,
ich bin gerade dabei mich mit der Motorsteuerung zu beschäftigen.
Um die Geschwindigkeit der Motoren zu setzen, also den richtigen Compare - Wert für den Timer1 zu ermitteln stehen in der Funktion
void motor_set(int16 left, int16 right) folgende 2 Formeln
pwm = PWMMAX/(BOT_SPEED_MAX*4.0)) * left) + 50;
bzw.
pwm = PWMMAX/(BOT_SPEED_MAX*1.1)) * left) - 30;
Kann mir jmd. sagen, wo die Formeln herkommen bzw. wie sie hergeleitet wurden.
Vielen Dank
Gruß Bernhard
Motorsteuerung
Re: Motorsteuerung
Hi,
lauten. Die Überlegung für die tatsächlich angewandte Formel ist nun, dass die Motoren im unteren Drehzahlbereich ein deutlich größeres Puls-Pause-Verhältnis benötigen als sonst. Darum der Faktor 4 für kleine Geschwindigkeiten. Der andere Fall sorgt dann dafür, dass der Bot bei einer doppelt so hoch eingestellten Geschwindigkeit auch in etwa doppelt so schnell fährt.
Bei einer festen Zuordnung von Geschwindigkeit zu Puls-Pause-Verhältnis bestehen aber immer folgende Probleme:
a) Es gibt keinen Gleichlauf der Motoren.
b) Die tatsächliche Geschwindigkeit hängt stark von der aktuellen Akkuspannung ab.
c) Die tatsächliche Geschwindigkeit hängt stark vom Untergrund ab, auf dem der Bot fährt.
Damit der Bot auch bei fast leeren Akkus noch losfährt, muss man die kleinste Geschwindigkeit entsprechend groß wählen, wodurch es aber unmöglich wird, sehr genaue Drehungen zu erreichen.
Insgesamt sollte man also die Geschwindigkeit regeln lassen und nicht nur einstellen. Daher ist die einfache Variante ohne Motorregelung auch nicht perfekt an die wirkliche Motorkennlinie angepasst, sondern nur ein Kompromiss zum einfachen Ausprobieren des Bots.
Hinzu kommt, dass durch die dabei recht niedrige PWM-Frequenz (bei höheren Frequenzen funktioniert das Prinzip so gar nicht mehr) höhere Ströme durch die Motorspulen fließen, was den Verschleiß erhöht.
Gruß,
Timo
gar nicht. Die Kennlinie der Motoren ist nicht linear und hängt u.a. auch von der Frequenz des PWM-Signals ab. Wäre sie linear, würde die Formel logischerweiseSheridan hat geschrieben:Hallo,
ich bin gerade dabei mich mit der Motorsteuerung zu beschäftigen.
Um die Geschwindigkeit der Motoren zu setzen, also den richtigen Compare - Wert für den Timer1 zu ermitteln stehen in der Funktion
void motor_set(int16 left, int16 right) folgende 2 FormelnKann mir jmd. sagen, wo die Formeln herkommen bzw. wie sie hergeleitet wurden.Code: Alles auswählen
if (left <= BOT_SPEED_NORMAL) { pwm = (uint16_t)(((float)PWMMAX/(BOT_SPEED_MAX*4.0)) * left) + 50; } else { pwm = (uint16_t)(((float)PWMMAX/(BOT_SPEED_MAX*1.1)) * left) - 30; }
Code: Alles auswählen
pwm = (uint16_t)(((float)PWMMAX / BOT_SPEED_MAX) * left) + OFFSET;
Bei einer festen Zuordnung von Geschwindigkeit zu Puls-Pause-Verhältnis bestehen aber immer folgende Probleme:
a) Es gibt keinen Gleichlauf der Motoren.
b) Die tatsächliche Geschwindigkeit hängt stark von der aktuellen Akkuspannung ab.
c) Die tatsächliche Geschwindigkeit hängt stark vom Untergrund ab, auf dem der Bot fährt.
Damit der Bot auch bei fast leeren Akkus noch losfährt, muss man die kleinste Geschwindigkeit entsprechend groß wählen, wodurch es aber unmöglich wird, sehr genaue Drehungen zu erreichen.
Insgesamt sollte man also die Geschwindigkeit regeln lassen und nicht nur einstellen. Daher ist die einfache Variante ohne Motorregelung auch nicht perfekt an die wirkliche Motorkennlinie angepasst, sondern nur ein Kompromiss zum einfachen Ausprobieren des Bots.
Hinzu kommt, dass durch die dabei recht niedrige PWM-Frequenz (bei höheren Frequenzen funktioniert das Prinzip so gar nicht mehr) höhere Ströme durch die Motorspulen fließen, was den Verschleiß erhöht.
Gruß,
Timo