Forum: Mikrocontroller und Digitale Elektronik Umrechnung Temperatur aus integer-Wert


von Ein interessierter Vierter (Gast)


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???

von Peter II (Gast)


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???

wie genau brauchst du denn die Temperatur? recht 1 Grad aus?

Warum nicht float, oder musst du code oder Zeit sparen?

von Rainer B. (katastrophenheinz)


Lesenswert?

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.

: Bearbeitet durch User
von Heinz (Gast)


Lesenswert?

Hi,

sag aber bitte erstmal, welche Auflösung temp nach der Rechnung hat,
sonst wird man dir hier nicht wirklich weiterhelfen können.

von Thomas Z. (thomas_z41)


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.

von Ein interessierter Vierter (Gast)


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! ;)

von MaWin (Gast)


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.

von Bernadette (Gast)


Lesenswert?

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.

von Georg (Gast)


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

von Rainer B. (katastrophenheinz)


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.

von H.Joachim S. (crazyhorse)


Lesenswert?

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

Wie soll das gehen?

von Ein interessierter Vierter (Gast)


Lesenswert?

Bernadette schrieb:
> dann   -40
>
> Jetzt ist der Wert z.B 205, was 20.5°C bedeutet.

stimmt soweit nur, dass ich -400 rechnen muss! ;)

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.