PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ergebnis der AD-Wandlung mit Kommata angeben!



patrick-rp6
09.06.2010, 20:34
Wie kann ich mein Ergebnis der AD-Wandlung mit 3 Stellen hinter dem Komma über den datentyp integer ausgeben?

das ist jetzt für den c515c von infineon, aber das prinzip ist ja ungefähr dasselbe wie beim atmel.

Die Vorkommastelle hab ich schon hinbekommen:

Teil aus der deklaration


#define V_REF 5
#define V_SCALE (1024/V_REF)


Teil aus der main


volt = (ADDATH << 2) | ADDATL;
printf("AIN0 = %u Volt \n", (int) ((volt)/V_SCALE));


schonmal vielen dank im vorraus

JoeBlack
10.06.2010, 03:20
Bei drei Stellen nach dem Komma multiplizierst Du die Stellen vor dem Komma mit 1000 und ziehst das Ergebniss vom Ausgangswert ab.

Beispiel:

Gesammt: 123456
Vorkomma: 123
123 x 1000 = 123000
123456 - 123000 = 456
Nachkomma: 456

MfG JoeBlack

wkrug
10.06.2010, 04:41
Im Prinzip stimmt das was JoeBlack schreibt.
In C muss Du da allerdings ein wenig ausfpassen.
Die Berechnungen als INT müssen immer ohne Dezimalbrüche gemacht werden, weil die bei der Berechnung einfach abgeschnitten werden.

Also 9/10 ergibt 0 anstatt 0,9!

Die Werte müssen in Deinem Fall also 1000 mal größer sein ( 3 Nachkommastellen ) als das Ergebnis.

Die Reste können auch durch Eingabe eines "%" berechnet werden.

vorkomma=123456/1000; //Ergebnis 123;
nachkomma=123456%1000; //Ergebnis 456;

Setzt man das Ergebnis wieder zusammen gibt es noch ein Problem mit den ASCII Wandlungen, weil führende Nullen der Dezimalbrüche nicht eingetragen werden. Ob es da eine Möglichkeit für Deinen Compiler gibt die Leerstellenunterdrückung aufzuheben müsstest Du im Manual des Compilers nachlesen.
Wenn es die Möglichkeit nicht gibt, kann man es so machen:
Beispiel führende 0 en Einfügen
itoa(vorkomma,string);
strcpy(ausgabe,string);
strcatf(ausgabe,",");
itoa(nachkomma,string);
if(nachkomma<10){strcatf(ausgabe,"0");}
if(nachkomma<100){strcatf(ausgabe,"0");}
strcat(ausgabe,string);

Wenn Du mit signed Variablen arbeitest wird auch beim Teiler % das Minuszeichen mit übertragen und muß durch Multiplikation mit -1 wieder entfernt werden.
if(nachkomma<0){nachkomma*=-1;};
Sonst bekommst Du als Ergebnis -123,-456

Im klaren solltest Du Dir auch über die Wertebereiche von 16Bit (Integers) und 32 Bit (Long Intergers) sein.

Im übrigen sind 3 Nachkommastellen für einen 10Bit A/D Wandler ohnehin Luxus. Wirklich stimmen eigentlich nur 1 bis 2 Stellen nach dem Komma.