Formelberechnung und negativer Wert drucken.

Ich lese erfolgreich den externen ADC-Wert mit ATmega32-A.

 Unsigned int adc;
 adc = AD7798_16(0x58, 0xFFFF);                           // read register 
       printf("ADC value is %d\r\n", adc);   

Ich erhalte den ADC-Wert als Dezimalzahlenbereich zwischen "0 bis 65535". Ich möchte es mit der folgenden Formel in eine analoge Spannung umwandeln.

Code = 2 N – 1 × [( AIN × GAIN / VREF ) + 1]

wobei:
AIN die analoge Eingangsspannung ist.
N = 16 für den AD7798 und N = 24 für den AD7799.

Ich habe die Formel und Berechnung vereinfacht

// Formel zur Berechnung der analogen Spannung aus dem digitalen Ausgang: Code = 2N – 1 × [(AIN × GAIN/VREF) + 1] // GAIN / VREF = 1 / 2,5 => 0,4 ​​// 0,4 Ain = ((adc /
32768 ) - 1)

Schwimmer Ain;

Ain=(((((float) adc) / 32768) - 1) / 0,416);

printf("Wert:%.2f [v]\r\n", Ain);

Die obige Formel gibt immer einen negativen Wert zurück. Ich möchte diesen negativen Wert drucken. Ich habe es wie oben versucht, aber es funktioniert nicht. Wie drucke ich den Ain-Wert? hier ist adc ein vorzeichenloser Wert, also konvertiere ich in Float.

Ich habe es auch so versucht

Ain = (((adc / 32768.0) - 1) / 0.416);

printf("value:%.2f [v]\r\n", Ain);

aber ich kann diesen Wert nicht drucken.

Ich habe meiner Antwort auf Ihre andere Frage einen Beispielcode hinzugefügt . Wenn das nicht hilft, teilen Sie uns mit, was mit dem oben angegebenen Code ausgedruckt wird . Wenn wir sehen können, was ausgegeben wird, können wir helfen herauszufinden, was mit der Eingabe nicht stimmt.

Antworten (1)

Die AVR-Bibliotheken unterstützen standardmäßig nicht das Drucken von Fließkommawerten. Dies dient dazu, Platz in ihren Umgebungen mit begrenzten Ressourcen zu sparen. Sie müssen den Compiler und den Linker anweisen, die Unterstützung für dieses Feature zu aktivieren.

Aus der avr-libc -Dokumentation auf vfprintf():

Da die vollständige Implementierung aller genannten Funktionen ziemlich umfangreich wird, vfprintf()können drei verschiedene Varianten von mithilfe von Linker-Optionen ausgewählt werden. Die Standardeinstellung vfprintf()implementiert alle erwähnten Funktionen mit Ausnahme von Gleitkommakonvertierungen. Eine minimierte Version von vfprintf()ist verfügbar, die nur die sehr einfachen Umwandlungsfunktionen für Ganzzahlen und Zeichenfolgen implementiert, aber nur die zusätzliche Option # kann mithilfe von Umwandlungs-Flags angegeben werden (diese Flags werden korrekt aus der Formatspezifikation geparst, aber dann einfach ignoriert). Diese Version kann mit den folgenden Compiler-Optionen angefordert werden:

-Wl,-u,vfprintf -lprintf_min

Wird die volle Funktionalität inklusive der Fließkomma-Konvertierungen benötigt, sollten folgende Möglichkeiten genutzt werden:

-Wl,-u,vfprintf -lprintf_flt -lm

(Hervorhebung von mir)

Da Sie CodeVisionAVR verwenden, wie wir im Chat besprochen haben , haben sie diese Option in ihr Konfigurationsfenster integriert, wie auf Seite 4, Schritt 9 dieses Tutorials zu sehen :

Geben Sie hier die Bildbeschreibung ein