Forum: Mikrocontroller und Digitale Elektronik Fixpunktarithmetik aus float


von Werner13 (Gast)


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

von Achim (Gast)


Lesenswert?

ist es ein Cortex M4F?

Bei dem kann die FPU float zu fixed-point und zurück wandeln.

Aus: 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/CHDDIGAC.html

"Convert  between integer, fixed-point, half-precision and float 
VCVT.F32"

von Peter II (Gast)


Lesenswert?

Werner13 schrieb:
> int_temp = (u_int32_t) (float_temp * 100);

dafür braucht man keine Cast.

geht auch ohne, ist sogar sicherer.

von Werner13 (Gast)


Lesenswert?

Achim schrieb:
> ist es ein Cortex M4F?

Nein, es ist ein AT32UC...

Peter II schrieb:
> dafür braucht man keine Cast.
>
> geht auch ohne, ist sogar sicherer.

OK, aber prinzipiell ist es das, was mit fixpunktarithmetik gemeint ist, 
oder?

Danke!

von Georg (Gast)


Lesenswert?

Werner13 schrieb:
> aber prinzipiell ist es das, was mit fixpunktarithmetik gemeint ist

Das ist eine Fixpunktzahl, Arithmetik ist da ja keine.

Georg

von Werner13 (Gast)


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

von eProfi (Gast)


Lesenswert?

Wenn Du noch runden willst:
int_temp = (u_int32_t) (float_temp * 100)+0.5;

von Werner13 (Gast)


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

von Wolfgang A. (Gast)


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

von Werner13 (Gast)


Lesenswert?

Danke für die Info!

von Andreas R. (andreasr)


Lesenswert?

int_temp = (u_int32_t) ((float_temp * 100)+0.5);

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.