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 auch vc*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 . Falls voltage_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!


Anmelden zum Antworten