Regelung für Winkelpositionierung
Hallo,
da ich leider mathematisch nix auf dem Kasten habe, benötige ich etwas Hilfe.
Ich möchte gerne ein Objekt auf einen Winkel ausrichten.
Folgende Dinge sind gegeben:
Ist-Winkel
Soll-Winkel
Tolleranz bei der positionierung (tolleranz=2.0)
Winkelangaben kamen von einem Sensor in Form von
0° bis 180° (0° bis 180°)
-180° bis -0° (180° -360°)
In Klammern die Werte wie sie auf einen Kreis bezogen wären.
Das habe ich wie folgt umgerechnet:
Code:
ist_angle=ToDeg(yaw); //HIER DEN KOMPASSWERT AUSLESEN
if (ist_angle<0){
ist_angle=180+(180-(ist_angle*-1));
}
Damit bekomme ich Winkel von 0°-360°
Getestet und funktioniert.
Nun kommt mein Problem.
Mit folgendem Code gebe ich die PWM zum positionieren aus:
Code:
//Wenn ANGFIX-Modus aktiv dann selber regeln
if (angfix==1){
if (ist_angle<=(soll_angle-tolleranz)){
WritePWM(servo, 1400); //Rechtslauf
}
if (ist_angle>=(soll_angle+tolleranz)){
WritePWM(servo, 1600); //Linkslauf
}
if ((ist_angle>(soll_angle-tolleranz)) && (ist_angle<(soll_angle+tolleranz))) {
WritePWM(servo, 1500); //Neutral
}
}
Das funktioniert zwar, aber nur so lange, bis man zum Übergang zwischen 0 und 360 kommt.
Beispiel:
Ein Soll-Winkel von 1° gibt folgende Werte und deren Abweichungen in den o.g. Formeln:
-1° (-)
1° (0)
3° (+)
Da geht es los, denn es gibt keinen negativen Ist-Winkel.
Wie kann man das mathematisch bzw. programmiertechnisch möglichst clever lösen?
Edit:
Zum positionieren wird kein Servo verwendet, sondern ein Motor, welcher mittels Getriebe das Objekt positioniert.