> es geht mir aber allgemein darum wie ich so etwas realisieren kann.
> Denn dann läuft's auch auf kleineren µCs.
Welchen Grund sollte man haben sich soetwas anzutun?
Du kannst natuerlich grundsaetlich deine Koeffizienten so skalieren
und runden das sie binaer kompatibel werden und dann shiften anstatt
zu multiplizieren. Allerdings ist die Frage ob die Aufloesung dann
noch reicht. Wenn du die Koeffizienten deines Reglers so veraenderst,
dann moechtest du da auch fein genug machen um halt vernuenftig Regeln
zu koennen.
Wenn man etwas sehr langsames regelt, wie z.B Temperatur, dann kannst
du sicher einen beliebigen Controller nehmen und alles den Compiler
machen lassen. Wenn man sich aber Gedanken machen muss ob es zeitlich
knapp wird dann wuerde ich mindestens einen 16Bit Controller nehmen.
Fuer die meisten Sachen reicht ja ein 8Bit Wert als Ein und
Ausgangsgroesse aus. Aber im Regler selber haettest du sicher gerne 16
oder gar 32Bit damit du eben deine Koeffizienten gut skalieren kannst
und damit es zu keinem Ueberlauf kommt.
Und da bietet es dich dann halt an z.B mit 128, 256 usw. zu skalieren
damit man beim zurueckrechnen nur shiften muss.
Ein anderes Beispiel. Nehmen wir mal an du brauchst einen Koeffizient
Kp=0.453. Wandel da erstmal in eine Bruch um, also 453/1000. Den rundest
du etwas, und schon werden daraus 113/250. Jetzt skalierst du das ganze
auf 116/256. Dann bemerkst du das man das noch gut kuerzen kann, auf
29/64.
Nun sind aber 29/64 eigentlich 0.453125. Du hast jetzt also eine kleine
Abweichung mit der du wahrscheinlich leben kannst. Dafuer musst du
nur noch mit 29 multiplizieren und 6mal shiften. Damit wird das doch
schon einfacher und dein Zwischenwert passt sicher in ein 16Bit
Register.
Du koenntest natuerlich noch weiter vereinfachen auf Kp=0.5, aber
dem sind leider Grenzen gesetzt. Irgendwann laeuft dein Regler dann
nicht
mehr vernuenftig.
Aber gerade bei der Auswahl eines Controllers fuer einen Regler wuerde
ich darauf achten das man ordentlich Reserven hat!
Olaf