Multiplizieren, Potenzieren und Wurzel ziehen

Gast #36943
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
Gast #36944
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
Gast #36946
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.
Gast #36947
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
Gast #36948
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.