Hallo zusammen, ich möchte einen Servomotor von einem anderen Device steuern. Das Device gibt über einen Regler einen 8-Bit Wert von 0-255 vor. Den kann ich leider nicht ändern. Die Steuerung des Servos klappt einwandfrei. Nur ist der +/-90 Grad Bereich den der Servo von der Mittelstellung aus schafft viel zu groß. Das sollten höchstens +/-15 Grad sein. Dazu hab ich den Servowert mit folgender Formel begrenzt: servowert = ((servowert / 4) + 97); Funktioniert soweit auch, nur leider hab ich da jetzt ganz schöne Stopper drin und der Servo braucht eine gewisse Zeit bis er auch die Änderung des Reglers reagiert, weil wahrscheinlich nicht jede Position des Reglers angefahren werden kann.. Hat jemand ne Idee wie ich das verbessern kann?
Servowert ist der Wert den du vom Device bekommst? Du wirst ja mit diesem Wert irgendetwas machen, bevor du ihm ans Servo legst. Zb. Umrechnen in eine Zeit oder einen Timerwert. Verlagere deine Skalierung an eine Stelle nach dieser Umrechnung (oder bau sie in diese Umrechnung ein), aber Limitiere nicht davor. Dadurch das du im Ganzzahl Bereich rechnest, verlierst du sont ne Menge. Konkret verringerst du den Wertebereich, den du vo Device bekommst von 0 bis 255 auf den Bereich 0 bis 63. Anstelle von 256 verschiedenen Servopositionen, hast du nur noch 64.
>Verlagere deine Skalierung an eine Stelle nach dieser >Umrechnung (oder bau sie in diese Umrechnung ein), >aber Limitiere nicht davor. Ich überlege nur gerade wie. Da ich den Motor selber ansteuere ist das nicht so einfach. Hab halt nur diese Werte für die Abfrage. >Konkret verringerst du den Wertebereich, den du vo Device bekommst >von 0 bis 255 auf den Bereich 0 bis 63. Anstelle von 256 >verschiedenen Servopositionen, hast du nur noch 64. Hab schon überlegt in den Float Bereich zu gehen. Meinst du das macht Sinn? Braucht halt nur ziemlich viel Speicherplatz.
Was ich aber machen könte wäre statt der 8-Bit Auflösung des AD-Wandlers 16-Bit zu nutzen und den 8-Bit Vorgabewert des Devices auf 16 Bit hochzurechnen.
Den Regler hast du selbst implementiert? Dann könntest du doch einfach den Ist-Wert nach oben skalieren, anstatt den Sollwert nach unten, dann bleibt die Auflösung erhalten.
Jeff wrote: >>Verlagere deine Skalierung an eine Stelle nach dieser >>Umrechnung (oder bau sie in diese Umrechnung ein), >>aber Limitiere nicht davor. > > Ich überlege nur gerade wie. Da ich den Motor selber ansteuere ist das > nicht so einfach. Hab halt nur diese Werte für die Abfrage. Aber du musst ja doch irgendwas mit diesem Wert machen. Was machst du denn damit? Oder geht der Servowert direkt in deine Regelung ein? > > Hab schon überlegt in den Float Bereich zu gehen. Meinst du das macht > Sinn? Braucht halt nur ziemlich viel Speicherplatz. Im Moment sehe ich keinen Grund für float. Aber ohne die Kenntnis dessen, wie dieser Servowert weiterverarbeitet wird, kann man schlecht einen Rat geben. Denkbar wäre ja eventuell auch eine rein mechanische Lösung des Problems. Das Abtriebsgestänge am Servohebel einfach weiter innen einhängen. Das Servo dreht nach wie vor 90°, aber der linearisierte Weg wird kleiner.
>Oder geht der Servowert direkt in deine Regelung ein?
Im Prinzip schon. Und da wird dann eine Art Zweipunktregelung gemacht.
Ungefähr so:
void motor_regelung()
{
if((lenkung_ist <= (lenkung_soll + 3)) && (lenkung_ist >= (lenkung_soll
- 3)))
{
PORTB &= ~(1 << PB1);
PORTB &= ~(1 << PB0);
//Anhalten
}
if((lenkung_ist +3) < (lenkung_soll))
{
PORTB |= (1 << PB1);
PORTB &= ~(1 << PB0);
//Rechts drehen
}
if((lenkung_ist -3) > (lenkung_soll))
{
PORTB |= (1 << PB0);
PORTB &= ~(1 << PB1);
//Links drehen
}
}
Alles klar. Dann würde sich aber tatsächlich das von TOM Vorgeschlagene anbieten.
Dann muß man aber darauf achten, daß es nie (z.B. durch mechanisches Verdrehen) sein kann, daß der skalierte ist-Wert den Wertebereich der Variablen verläßt. lenkung_ist muß also mindestens mit 16 Bit definiert sein.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.