Fixpunktarithmetik aus float

Gast #3776901
Lesenswert?

Hallo!

Ich habe folgendes Problem, das vermutlich relativ schnell gelöst ist:

ich mach eine Temperaturmessung mit einem ADC (Spannungsteiler mit NTC), 
lies den SPannungswert ein und berechne mir daraus (mit vorwiderstand, 
B-Wert des NTC usw...) die Temperatur. DIe ganzen Berechnungen werden 
mit floats durchgeführt (der Prozessor verfügt über eine floating point 
einheit.

Nun will ich diese Temperatur, nennen wir sie float_temp, als 
fixpunktarithmetik mit einer Funktion auslesen. Die Temperatur geht von 
5°C bis 50°C, es gibt also keine negativen Werte. Ich will 2 
Kommastellen haben.

Mein Ansatz wäre, die float_temp zunächst mit 100 zu multiplizieren und 
dann mit einem cast zu einer 16-Bit-Integerzahl zu casten, also:

int_temp = (u_int32_t) (float_temp * 100);

Ist das korrekt oder hat es damit noch mehr auf sich?

lG
Gast #3777237
Lesenswert?

Ja OK, das meinte ich damit.

Wenn man es genauer machen will, müsste man schon vorher diese 
Fixpunktzahl einsetzen, dann wären alle Berechnungen auch mit int und 
nicht mit float. Aber nachdem der µC eine Floating Point Einheit 
besitzt, wird dies wohl nicht so schwer ins Gewicht fallen, schon gar 
nicht, wenn er mit 64MHz läuft. Ich benötige nur eine Schnittstelle 
(Funktion) nach extern, die mir diesen Wert in Fixpunktdarstellung 
liefert.

Danke, lG
Gast #3777288
Lesenswert?

eProfi schrieb:
> int_temp = (u_int32_t) (float_temp * 100)+0.5;

ok, wenn ich nun z.B. eine Temperatur von 23,47 °C habe, dann ist der 
Wert der Fixpunktzahl 2347. Durch die Addition der 0,5 wird die letzte 
Stelle, in diesem Fall also die 7, richtig sein. Richtig?

Ich nehme an, ich kann auch einen cast zu einem uint_16 machen?! Ich 
weiß, dass d float 32 Bit ist, aber ich benötige nur 16 Bit für die 
Darstellung...

Danke, lG
Gast #3777424
Lesenswert?

Werner13 schrieb:
> ok, wenn ich nun z.B. eine Temperatur von 23,47 °C habe, dann ist der
> Wert der Fixpunktzahl 2347.

In Float hast du aber keine 23,47, sondern es folgen weitere Stellen. 
Genau genommen hast du eine Rationale Zahl, bei der der Devisor eine 
glatte Zweierpotenz ist. Durch die Addition von 0,5 sorgst du dafür, das 
z.B. 23,465xxx zu 23,47 aufgerundet wird, aber 23,464xx zu 23,46 
abgerundet wird. Du halbierst damit also deinen maximalen Anzeigefehler 
- wenn man voraussetzt, dass deine Messungen so genau sind, wie du die 
Zahlen ausgibst ;-)

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