Mikrocontroller Startseite >> [AVR Einstieg] >> Mathe für Mikrocontroller


Mathematik für Mikrocontroller

Mikrocontroller besitzen im Allgemeinen eine eingebaute Integer Arithmetik, das heißt sie können nur mit Ganzen Zahlen rechnen. Integer bedeutet alles nach dem Komma wird abgeschnitten, also weggelassen. Das hat auch nichts mit runden zu tun, dafür muss man selber sorgen, indem man zum Beispiel 0,5 zu einem Ergebnis (was in Integer gewandelt wird) dazu addiert. Das Rechnen mit gebrochenen Zahlen muß über die Software gelöst werden, was umständlich und langsam ist. Aus diesem Grund sollte man versuchen möglichst mit ganzen Zahlen auszukommen.

Beim Rechnen mit ganzen Zahlen sind allerdings ein paar Grundregeln zu beachten. In der Mathematik ist a * b /c = a / c * b. Beim Rechnen mit ganzen Zahlen kann das allerdings zu erheblichen Fehlern führen.

Beispiel 27 * 49 / 28 = 47,25, das Komma 25 kann die Integerarithmetik nicht also wäre ideal wenn 47 raus kommen würde. Bei 27 * 49 / 28 = 47 ist das auch der Fall. Rechne ich aber 27 / 28 * 49 = 0 kommt Null raus, weil aus der 0,9... halt eine 0 wird und 0 * 49 immer noch Null ist.

Man sollte also immer versuchen große Zwischenergebnisse zu erzielen, muß aber dabei aufpassen, daß kein Zahlenüberlauf eintritt. Bei der üblichen 16Bit Arithmetik ist bei 65535 Schluß bzw bei 32767 mit Vorzeichen. Das heißt ohne Vorzeichen ist das Ergebnis von 222 * 333 (= 73926) nicht 73926 sondern 8391 was ja auch leicht daneben liegt.

Wenn ich nun zum Beispiel die Tagesmitteltemperatur mit einer Integerarithmetik berechnen will und ich benutze die normalen Temperaturwerte, habe ich folgendes Problem, den Mittelwert berechne ich wie folgt:
mittelwert = (mittelwert_alt * anzahl_der_messwerte) + neuer_messwert / (anzahl_der_messwerte + 1)
Hab ich nun zum Beispiel 10 mal die Temperatur 15C gehabt, dann wäre mein Durchschnittswert logischer weise 15. Würde jetzt im nächsten Moment die Temperatur auf 25C steigen, so hätte ich
(10 * 15) + 25 / (10 +1) = 175 / 11 = 15,9 daraus wird 15. Da die Außentemperatur in kurzen Abständen nicht solche Sprünge macht würde der Durchschnittswert immer am Anfangswert hängen bleiben.

Die Lösung, ich multipliziere die Zahlen für die Berechnung einfach mit 100. Sprich 15C sind für mich intern eine 1500. Dann hab ich also (10 * 1500) + 2500 / (10 +1) = 17500 / 11 = 1590,9
das heißt also jetzt wäre mein Mittelwert von 15C auf 15,9C gestiegen. Ich muß allerdings jetzt aufpassen, daß ich keine Zahlenüberläufe bekomme. In dem Fall sollte man dann eine 32Bit Integerarithmetik verwenden, die immer noch deutlich einfacher und schneller ist als eine Gleitkomma Berechnung. Das mit dem Faktor 100 ist praktisch, da man so automatisch zwei Nachkommastellen hat. Verwendet man diese Multiplikation blos zur internen Darstellung, und gibt nur ganze Temperaturwerte aus, so wäre der Faktor 64 zum Beispiel idealer. Da man dann statt multiplizieren nur 5 mal rechts bzw links schieben muß (rechnen mit dualen Zahlen).




[Impressum] [Kontakt] [Links] [Home]
© 05.12.2007 Hans-Jürgen Jacob (Pirna)