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???
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?
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
Hi, sag aber bitte erstmal, welche Auflösung temp nach der Rechnung hat, sonst wird man dir hier nicht wirklich weiterhelfen können.
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.
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! ;)
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.
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.
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
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.
Georg schrieb: > Das kann auch schiefgehen, wenn temp_integer*135 grösser ist als der > Bereich von 32 bit. Wie soll das gehen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.