Werte für Servo skalieren

Gast #731518
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?
#731536
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.
Gast #731567
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.
#731587
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.
Gast #731601
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
}

}
Gast #731622
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren