umrechnung ohne floating point
-
hi leute,
ich muss einen ad wandlungswert in einen anderes format umrechnen ohne floating point zu verwenden;)
es liegt vor, diesen wert lese ich von der ad wandlung aus:
unsigned int voltage_clamp_30 = 909;dann noch ne kleine umrechnung:
/* 5 / 1024 sind wegen ad-wandler */
voltage_clamp_30 * 5 / 1024 = 4,4384765625
4,4384765625 * ((39200 + 102000) / 39200) = 15,98V ... sollte 16V sein;)
/* wegen spannungsteiler */diesen muss ich wieder in einen linearen wert umrechnen in [0=0V, 255=18,5V]
wie kann ich die umrechnung effizient machen, darf halt kein floating point verwenden, da uC!
bye
-
voltage_clamp_30 >> 2
?
edit: Ok, der Weg:
unsigned int vc = ...; // voltage_clamp_30 volt = vc * 5 / 1024 * ((39200+102000)/39200); // Zusammengefasst: volt = vc * 0,017588089923469387755102040816327; analog = volt * 256 / 18.5; // Zusammengefasst: analog = volt * 13,837837837837837837837837837838; // Alles zusammen: analog = (vc*0,017588089923469387755102040816327) * 13,837837837837837837837837837838; analog = vc * 0,24338113623827909542195256480519; analog = vc / 4; // Näherungsweise
Wenn du die Brüche genauer zusammenfasst:
361472000/1485209600
, gekürzt und genähert:441/1813
, womit du also für mehr Genauigkeit auchvc*441/1813
rechnen kannst (wenn das Ergebnis von vc*441 noch in deinen Datentyp passt). Für noch genauer halt weniger Genauigkeit rausnehmen.
-
Ich empfehle eine Fixpunktdarstellung. Aus Performancegründen eine wo das least significant bit eine Wertigkeit von 2^x hat. Ansonsten wie Badestrand gezeigt hat, die Konstanten zusammenrechnen, dass man nur noch eine hat (die Berechnung der resultierenden Konstanten kommt natürlich in einen Kommentar und in die Doku).
-
volt = vc * 0,017588089923469387755102040816327;
rechnet ja in floating point?
-
Du hast meinen Post aber schon komplett gelesen, oder? Da steht durchaus noch ein Satz darunter.
Die Kommazahlen sollten nur den Weg aufzeigen.
-
wenn ich so wie du gesagt hast faktor 441/1813 und mit fixpunkt arbeite, klappt das ja gut! nur wie kommst du auf den faktor?
lg
-
faktor:
9/37
ist näher oder?bye
-
aVrCoDeR1 schrieb:
wenn ich so wie du gesagt hast faktor 441/1813 und mit fixpunkt arbeite, klappt das ja gut! nur wie kommst du auf den faktor?
Naja, einfach die Konstanten zusammengefasst. Erst rechnest du ja
* 5 / 1024 * ((39200+102000)/39200)
um auf die Spannung zu kommen, dann noch* 256 / 18.5
um auf 0..255 zu kommen. Alles zusammen kannst du auch(voltage_clamp * 361472000) / 1485209600
rechnen, wobei du diesen Bruch noch (verlustfrei) kürzen kannst, also(voltage_clamp*1765)/7252
. Fallsvoltage_clamp*1765
nicht in deinen Datentyp passen sollte, kann man den Bruch noch verlustbehaftet mit anderen Zahlen kürzen (z.B. 4, was dann 441/1813 gibt).aVrCoDeR1 schrieb:
faktor:
9/37
ist näher oder?Näher an was?
-
näher als:
441/1813
-
Laut meinem Taschenrechner ist 9/37 dasselbe wie 441/1813.
-
richtig!