Umrechnung Temperatur aus integer-Wert

Gast #4597318
Ja Servus,

ich hab da mal ne Frage, bzgl. der Umrechnung eines Ganzzahlwertes zu
einer Temperatur:


ich habe einen uint16_t Wert der einem Temperaturwert entspricht!


die Umrechnung geht über temp = ((temp_integer/(2^16))*135)-40  --> ist 
dann  ein Wert in °C!!!

aber wie krieg ich das möglichst sinnvoll hin?? in float casten und
die Funktionen aus der "math.h" nutzen???
#4597323
Hi,

Wenn du einen uint16 durch 2^16 teilst, dh um 16 Stellen nach rechts 
schiebst, ist das Ergebnis immer 0. Bei deiner Rechnung passt was nicht.

Ansonsten: Rechts schieben um 16 Stellen, mit 135 multiplizieren, 40 
abziehen. Keine komplizierten Rechenoperationen notwendig.
#4597331
Du hast 2 Möglichkeiten.
1. wie Peter II schrieb einfach mit float rechnen, oder
2. mit einem 32bit integer rechnen, dafür musst du allerdings bei der 
Reihenfolge der Operationen aufpassen, wie Rainer B. bereits angemerkt 
hat.

Mit einem 32bit integer müsstest du folgendermaßen rechnen:
temp = (temp_integer*135/(2^16))-40

Was du nun tust hängt von deiner konkreten Anwendung ab.
Gast #4597340
Rainer B. schrieb:
> Ansonsten: Rechts schieben um 16 Stellen, mit 135 multiplizieren, 40
> abziehen. Keine komplizierten Rechenoperationen notwendig.

Ich hätte gerne eine Nackommastelle mit dabei!

d.h. dann temp =  temp_integer*135


dann      temp_komma = temp & 0x0000FFFF // nur die niederen Bits 
aufbewahren!

dann      temp = temp>>16;
dann      temp = temp -40;


das ganze sollte dann kein "uint32_t", sondern ein "int32_t"!
oder?

sorry hab echt lange nicht mehr so richtig programmiert! ;)
Gast #4597344
Ein interessierter Vierter schrieb:
> aber wie krieg ich das möglichst sinnvoll hin??
> in float casten und die Funktionen aus der "math.h" nutzen???

Sicher nicht.

(temp_integer/(2^16))*135)-40

Erst mal (2^16)/135 sind 485.5.

Dann erkennen daß man nicht Grad sondern 0.1 GradC auflösen will.

temp_integer/48-400 -> GradC in 0.1 Grad-Schritten

Dann überlegen, wie gross der Fehler durch die fehlende 5.5 ist.

Ca. 1% oder 1.5 GradC maximal.

Dein Sensor wird ungenauer sein.
Gast #4597349
Also damit dir eine Nachkommastelle bleibt

zuerst temp =  temp_integer*1350

dann   durch 2^16 teilen (schieben)

dann   -40

Jetzt ist der Wert z.B 205, was 20.5°C bedeutet.
Gast #4597350
Thomas Z. schrieb:
> temp = (temp_integer*135/(2^16))-40

Das kann auch schiefgehen, wenn temp_integer*135 grösser ist als der 
Bereich von 32 bit.

Thomas Z. schrieb:
> Was du nun tust hängt von deiner konkreten Anwendung ab.

Eben, zuerst sollte mal geklärt sein, welche Werte temp_integer annehmen 
kann.

Übrigens, da 135 eine Konstante ist, kann man sich die "höhere" 
Mathematik sparen:
t*135 = t*128 + t*8 - t.

Georg
#4597352
Ein interessierter Vierter schrieb:
> Ich hätte gerne eine Nackommastelle mit dabei!

Dann den uint16 nicht um 16 Stellen, sondern nur um 8 Stellen 
rechtsschieben und mit 135 multiplizieren.

Die oberen 8 Bit in einen int8 casten, 40 abziehen und du hast den 
Vorkommawert als int8.

Die unteren 8 Bit um 5 Stellen nach rechts schieben und du hast die 
Nachkommaauflösung in 0.125-Grad Schritten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.