Forum: Offtopic C167 und µVision2 - Rechenproblem?


von Markus Hochholzer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich unternehme gerade meine ersten Gehversuche mit dem C167CR-LM in
Verbindung mit dem µVision2-Compiler, und hoffe hier richtig zu sein.

Das C-Programm im Anhang liefert mir folgende Ausgabe:
Kanal: 0 ==> Wandlungsergebnis: 654 ==> Temperatur 13.9
Kanal: 0 ==> Min. -50, Max. 50,Differenz 100, Faktor 0.6
Kanal: 1 ==> Wandlungsergebnis: 654 ==> Temperatur 63.9
Kanal: 1 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.6
Kanal: 2 ==> Wandlungsergebnis: 646 ==> Temperatur 63.1
Kanal: 2 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.6
Kanal: 3 ==> Wandlungsergebnis: 322 ==> Temperatur 13.0
Kanal: 3 ==> Min. -50, Max. 150,Differenz 200, Faktor 0.3

Bis hierhin funktioniert alles. Wenn ich jetzt aber die Spannungen an
den Analogeingängen geringfügig erhöhe, erhalte ich folgende
Ergebnisse:
Kanal: 0 ==> Wandlungsergebnis: 667 ==> Temperatur -48.9
Kanal: 0 ==> Min. -50, Max. 50,Differenz 100, Faktor 0.7
Kanal: 1 ==> Wandlungsergebnis: 670 ==> Temperatur 1.4
Kanal: 1 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.7
Kanal: 2 ==> Wandlungsergebnis: 665 ==> Temperatur 0.9
Kanal: 2 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.7
Kanal: 3 ==> Wandlungsergebnis: 353 ==> Temperatur -45.0
Kanal: 3 ==> Min. -50, Max. 150,Differenz 200, Faktor 0.3

Hier stimmen die berechneten Temperaturwerte nicht mehr.
Warum ist das so? Wer kann/will mir helfen?

Gruß Markus

von Mark de Jong Electronics (Gast)


Lesenswert?

Hallo Markus,

Deine Bereichnung gehr schien weil einen unsigned int maximal denn wert
von 65535 haben kann.

aber:
(maxTemperatur[i] - minTemperatur[i]) * messwert[i]
100 * 667 = 66700 also solltest du mit unsigned long arbeiten.

versuche es mal mit:

istTemperatur[i] = (signed long)minTemperatur[i] + (((signed
long)maxTemperatur[i] - (signed long)minTemperatur[i]) * (unsigned
long)messwert[i] / 1023.0);

oder
unsigned long messwert[4];
signed long maxTemperatur[4]={50, 100, 100, 150};
signed long minTemperatur[4]={-50, 0, 0, -50};

Dann müßte es richtig laufen.

Grüße Mark,

von Gerhard Gunzelmann (Gast)


Lesenswert?

Hi

wo kommtn dein MinTemperatur und Maxtemperatur pberhaupt her ?

seh ich nicht


Gerhard

von Markus Hochholzer (Gast)


Lesenswert?

Hallo zusammen!

@Mark:
Danke für Deine Ausführungen. Das heißt, daß vor der Umwandlung in
FLOAT temporär der gültige Zahlenbereich überschritten wird. Das hab
ich nicht gewußt.
Deshalb habe ich richtiggestellt:
Statt
istTemperatur[i] = minTemperatur[i] + ((maxTemperatur[i] -
minTemperatur[i]) * messwert[i] / 1023.0);

einfach
istTemperatur[i] = minTemperatur[i] + ((maxTemperatur[i] -
minTemperatur[i]) / 1023.0 * messwert[i]);

und schon funzt es. Hat mich drei Tage gekostet :-(

@Gerhard:
signed int maxTemperatur[4]={50, 100, 100, 150};
signed int minTemperatur[4]={-50, 0, 0, -50};

Hier werden die Felder deklariert und mit Werten vorbelegt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.