Umrechnung Temperatur aus integer-Wert

Gast #4597318
Lesenswert?
• ▲
▼
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???
#4597331
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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 #4597350
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren