ich die Frage im letzten Satz des ursprünglichen Beitrags zu beantworten - nicht die Überschrift. Aber das ist die richtige Antwort für Ihr Projekt.
Sie sagen "Ich brauche nur 2 Dezimalstellen" - so sollte Ihnen das sagen, dass es keine Notwendigkeit für Fließkomma-Mathematik gibt. Physiker und Ingenieure brauchen Schwimmer, um sehr, sehr kleine oder sehr, sehr große Mengen darzustellen, aber Sie brauchen einen "festen Punkt" - was bedeutet, dass Sie ganzzahlige mathematische Berechnungen durchführen und Ihre Einheiten richtig wählen. Fixed Point ist schneller, genauer und reduziert die Größe Ihrer kompilierten Binärdatei, da der Fließkomma-Code nicht benötigt wird.
Die einfachste Lösung besteht darin, Ganzzahlen zu verwenden und Millivolt anzuzeigen, genauso wie die Funktion delay(), die Sie gerade verwendet haben, ein Argument mit einer Ganzzahl von Millisekunden und nicht mit einer Bruchzahl von Sekunden.
#define VREF 5000
uint32_t mvolts;
.
.
mvolts=(value*VREF)>>10; // No floats here...
lcd_printf("milliVolts: %d",mvolts); // ...and no casts
Wenn Sie Volt angezeigt werden muss, dann tut dies der Trick:
lcd_printf("Volts: %d.%02d ",mvolts/1000, (mvolts%1000)/10);
Hinweis, nebenbei gesagt, dass mVolt eine ganze Zahl 32 Bit ist, weil Sie jetzt eine 10-Bit-Zahl sind Multiplikation um 5000 und das wird nicht in 16 Bits passen. Dies ist erforderlich, da Sie während der Skalierung die Genauigkeit des Werts beibehalten müssen. Ich glaube nicht, dass dies Off-Topic ist, da ich davon ausgehe, dass Sie den korrekten Wert anzeigen möchten oder es keinen Sinn hat, diese zwei Dezimalstellen anzuzeigen.
Wenn Sie nicht vorsichtig sind, wird der Compiler den Wert 5000/1024 - 4.8828125 berechnen - und dann Integer-Arithmetik, die den Bruchteil abschneidet und am Ende Ihr ADC-Ergebnis um 4 multipliziert. Um das zu garantieren Verhalten, multiplizieren Sie mit 5000 und teilen Sie dann - 2 getrennte Operationen. Da 1024 gleich 2 ** 10 ist, ist die Verschiebung nach rechts um 10 Bits identisch mit
Schließlich - gehen Sie nicht davon aus, dass das Lesen von 1023 vom ADC tatsächlich 5.000 Volt bis 4 signifikante Zahlen bedeutet; kalibrieren Sie gegen ein getestetes Voltmeter, indem Sie #define VREF
optimieren, um das richtige Ergebnis zu erhalten.
Was wird angezeigt? – immibis
Es gibt hier ein Problem 'Volt = (Wert * 5)/1023'. All dies sind Ganzzahlen, so dass das Ergebnis der Berechnung eine Ganzzahl ist. Das ist wahrscheinlich nicht das, was du willst. Versuchen Sie es mit 'Volt = (Wert * 5f)/1023f'. – msandiford
Oder betrachten Sie MilliVolts: 'unsigned Volt = (Wert * 5000L + 1024/2/* fügen Sie diesen Wert zu runden * /)/1024;' und vermeiden FP Mathe. – chux