Hallo locked,
ich habe mir das Video und den Code jetzt genauer angesehen. Deine Vermutung, dass der Sharp zu langsam ist, könnte stimmen. Eine Simulation mit geschätzten Daten (da ich die Werte deines Bots nicht genau kenne) zeigen, dass die 40ms Messrate des Sharpsensors schon sehr kritisch sind. Für eine genauere Analyse bräuchte ich aber die genauen Daten deines Bots, wie die Zeitkonstante der Beschleunigung, die Höchstgeschwindigkeit und die Schwingdauer des Bots als Pendel. Eine andere Möglichkeit herauszufinden ob der Sharp zu langsam ist, wäre die Schwingdauer des Bots versuchsweise zu verlangsamen. D.h. den Schwerpunkt weiter nach oben zu verlegen. Dummerweise geht der Abstand des Schwerpunkts nur mit der Wurzel in die Schwingdauer ein, so dass für doppelte Schwingdauer der Abstand vervierfacht werden muss. Aber ein Versuch wäre es ja wert. Wenn es dann funktioniert, liegt es wirklich an der Messrate des Sharp.
Des weiteren hier noch einige Tipps:
1. Den D-Anteil im Code mit 511 anstatt 255 berücksichtigen, da dein max. PWM-Wert 511 ist. Nach der Anpassung muss vielleicht Kd geändert werden.
2. Die Reibung als Offset in der Ansteuerung berücksichtigen: Dazu den PWM-Wert ermitteln, bei dem dein Bot gerade noch nicht rollt (wird vermutlich zw. 100...200 liegen) und den Wert zur Stellgröße des Reglers hinzu addieren. Dadurch wird die Nichtlinearität der Regelstrecke verursacht durch die Reibung etwas kompensiert. Diese Maßnahme könnte vielleicht die Stabilität etwas verbessern.
3. Eine Ursache für die Instabilität ist auch noch, dass dein Regler nur den Winkel ausregelt und nicht noch zusätzlich die Geschwindigkeit oder Position. Nach dem Einschalten und dem ersten Ausregelvorgang wird sich eine zufällige Geschwindigkeit einstellen bei der der Bot senkrecht steht. Diese Geschwindigkeit muss dann beibehalten werden, um den Bot auszubalancieren. Nur per Zufall wird die Geschwindigkeit nach dem ersten Regelvorgang sehr gering sein und der Bot längere Zeit stehen bleiben. Dieses Problem kann nur durch zusätzliches Berücksichtigen der Geschwindigkeit oder Position behoben werden. Falls keine Odometrie vorhanden ist, kann durch eine mathematische Nachbildung des Antriebs und Schätzung der Geschwindigkeit das Problem umgangen werden. Inwieweit das auch in der Realität funktioniert, weiss ich nicht, zumindest in der Simulation hat es gewirkt.
Ähnliches gilt auch für einen möglichen Offset des Sensors, der kann auch durch die Berücksichtigung der Geschwindigkeit oder Position ausgeregelt werden.
4. Die Wiederholrate des Reglers mit 500us macht wenig Sinn wenn die Messrate des Sharp 40ms ist. Aber falls der Sharp kein Signal hat ab wann die neue Messung gültig ist, dann lass es so, sonst gibt es noch eine zusätzliche Totzeit.
Hier noch der Teil des Code mit der Einarbeitung der ersten beiden Tipps. Einen Beispielcode für den 3.Tipp kann ich Dir geben, wenn ich die Daten für deinen Antrieb habe.
Code:
yd = (e - ealt)*kd; // D-Anteil berechnen und mit
yd += drest; // nicht berücksichtigtem Rest addieren
if (yd > 511) drest = yd - 511; // merke Rest
else if (yd < -511) drest = yd + 511;
else drest = 0;
yp = e*kp; // P-Anteil berechnen
y = yp + yi + yd; // Gesamtkorrektur
ealt = e; // x merken
if(y>=0)
{
lon;
roff;
}
else
{
//y=-y;
loff;
ron;
}
y = abs(y) + Offset ; //Kompensation der Reibung
if(y>511)y=511;
OCR1A=y;
Ich hoffe das hilft Dir etwas weiter. Wünsch Dir viel Erfolg.
Gruß Waste
Lesezeichen