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