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
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"
Werner13 schrieb: > int_temp = (u_int32_t) (float_temp * 100); dafür braucht man keine Cast. geht auch ohne, ist sogar sicherer.
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!
Werner13 schrieb: > aber prinzipiell ist es das, was mit fixpunktarithmetik gemeint ist Das ist eine Fixpunktzahl, Arithmetik ist da ja keine. Georg
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
Wenn Du noch runden willst: int_temp = (u_int32_t) (float_temp * 100)+0.5;
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 ;-)
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.