Forum: Mikrocontroller und Digitale Elektronik Multiplizieren, Potenzieren und Wurzel ziehen


von Wolfram Hubert (Gast)


Lesenswert?

Hallo,

wie gross in etwa ist der Codeaufwand in C für die folgenden
Rechenoperationen bei den AVRs:

Multiplizieren bei den AVRs, die nicht multiplizieren können
Potenzieren
Wurzel ziehen

Andersrum gefragt: Wie wandelt man die analoge Größe eines
Temperaturfühlers mit E-Funktion-Kennlinie in digitale Werte um?

MfG

Wolfram Hubert

von Gralf (Gast)


Lesenswert?

Da es speziell um diesen Fühler geht, würde ich einmal die Kennlinie
aufnehmen, die Werte extern errechnen und dann eine Look-up-Tabelle
benutzen. Das ist zum einen weniger Codeaufwand und benötigt auch
weniger Rechenkapazität.
Beispiele für Multiplikationsroutinen gibt es in den App-Notes von
Atmel. Sind zwar in Assembler, aber die kann man bestimmt in C
einbinden (kenne mich mit C nicht aus).

Wurzelziehen allgemein ist schon der Hammer. Denn ein diskretes
Wurzelziehen wird auf Divisionen zurückgeführt (wenn mich meine
Mathekenntnisse nicht im Stich lassen). Wenn der µC auch keine
Divisionen kann, so muß auch das in Subtraktionen umgewandelt werden.
Wer da bei 10bit-Werten (ADC) noch den Durchblick behält... Hut ab!

Wenns dann doch allgemein bleiben soll, würde ich einfach mal
betreffend Mathegrundlagen googlen. Irgend ne Uni bietet da bestimmt
fertige Gleichungen, die man nur auf C konvertieren muß.

Viel Spaß
Gralf

von thkais (Gast)


Lesenswert?

Wurzelziehen kann man mit einer Iteration. Hatte ich vor zig Jahren mal
im EDV-Unterricht, kann mich aber nur Bruchstückhaft erinnern.

von crazy horse (Gast)


Lesenswert?

typisches Beispiel für eine Hochsprache :-)
Geht aber auch in Assembler, wenn man irgendwo die Routinen dafür
findet. Selber schreiben ist relativ zeitaufwändig und fehleranfällig.
Habs gerade mal in C probiert, die Wurzel aus einer float-Zahl braucht
6400 Takte.

Für Kennlinienlinearisierung ist i.a. eine Tabelle besser geeignet. Muß
nicht für jedes Argument einen Funktionswert enthalten (will man z.B.
den kompletten A/D-Bereich in einer Tabelle abbilden, sind das eben mal
ca. 2kB nur für die Tabelle).
Besser wirds, wenn man sich sich in gewissen Abständen Stützpunkte
abspeichert, dazwischen linear interpoliert. Je mehr Stützpunkte, je
genauer.

von Wolfram Hubert (Gast)


Lesenswert?

Hallo Gralf,

die Variante mit einer Tabelle kann mein Problem lösen. Mir kommt
bezüglich der Tabellengröße sehr entgegen, dass ich einen
Temperaturumfang von 50 Grad Kelvin (0 Grad Celsius bis 50 Grad
Celsius) nur erfassen muß, mit 0,5 Grad Kelvin Auflösung. Ergibt 99
Elemente. Das Element ist vom Datentyp Byte.

Danke für die Antwort.

MfG

Wolfram Hubert

von Martin (Gast)


Lesenswert?

Hallo Wolfram!

Und warum nimmst du nicht einen Temperaturfühler, der die Werte digital
sendet. Dann sparst du dir den ganzen Aufwand.

Der DS1621 kann von -55°C bis +125°C messen und das in 0,5°C -
Schritten. Nimmt man die angegebene Formel zu Hilfe, so kommt man sogar
unter 0,1°C.

Tolle Sache dieser Fühler.

Martin

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.