mikrocontroller.net

Forum: Offtopic C167 und µVision2 - Rechenproblem?


Autor: Markus Hochholzer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Mark de Jong Electronics (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

wo kommtn dein MinTemperatur und Maxtemperatur pberhaupt her ?

seh ich nicht


Gerhard

Autor: Markus Hochholzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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, Yahoo oder Facebook? Keine Anmeldung erforderlich!
Mit Google-Account einloggen | Mit Yahoo-Account einloggen | Mit Facebook-Account einloggen
Noch kein Account? Hier anmelden.