Forum: Mikrocontroller und Digitale Elektronik Werte für Servo skalieren


von Jeff (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

>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.

von Jeff (Gast)


Lesenswert?

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.

von TOM (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

>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
}

}

von Karl H. (kbuchegg)


Lesenswert?

Alles klar.

Dann würde sich aber tatsächlich das von TOM Vorgeschlagene anbieten.

von Rolf Magnus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.