Forum: Compiler & IDEs KTY10-7


von mirki (Gast)


Lesenswert?

Vielleicht bin ich ja hier richtig :

Moin moin zusammen,
ich habe einen KTY10-7 in reiche zu einen 4k7 Ohm geschaltet und den
mittelabgriff auf den ADC des ATmega8 geschaltet. Habe eine Aref von
2,75V. Die ADC werte bekomme ich wunderbar raus und gebe Sie über
RS232
weiter.
Ich will aber die Temperatur werte weitergebn. Wie kann ich die
Temperatur errechnen ?
Das hier bringt mir nur Müll raus :
#define KTY_R25 2030
#define KTY_RS 4700
#define KTY_ALPHA 0.00788
#define KTY_BETA 0.00001937
float temp_calc(int adcwert)
{
float vAdc, temp, kt;
vAdc = (adcwert * V_REF) / 1024;
kt = (KTY_RS / (vcc / vAdc - 1)) / KTY_R25;
temp = pow(KTY_ALPHA, 2) - 4 * KTY_BETA + 4  KTY_BETA  kt;
temp = 25 + ((sqrt(temp) - KTY_ALPHA) / (2 * KTY_BETA));
tempHighbyte = temp;
tempLowbyte = (temp - tempHighbyte) * 10;
return temp;
}
Kann mir da jemand bitte weiterhelfen ?
mirki

von OldBug (Gast)


Lesenswert?

Schnellschuss: Füge bei den Konstanten mal überall ein ".0" an.

von mirki (Gast)


Lesenswert?

Danke für die schnelle Antwort,....

aber was hab ich davon wenn ich bei den konstanten '.0' hinzufüge ?
Sorry für die blöde frage, dann würde es ja heissen

#define KTY_R25 2030.0
#define KTY_RS 4700.0
#define KTY_ALPHA 0.00788 .0
#define KTY_BETA 0.00001937.0

mirki

von OldBug (Gast)


Lesenswert?

>#define KTY_ALPHA 0.00788 .0
>#define KTY_BETA 0.00001937.0

Ähem, DA natürlich nicht ;-)
Das anhängen von "komma null" (.0) macht aus den Konstanten
Integerwerten Floats.

>vAdc = (adcwert * V_REF) / 1024;
>kt = (KTY_RS / (vcc / vAdc - 1)) / KTY_R25;
>temp = pow(KTY_ALPHA, 2) - 4 * KTY_BETA + 4  KTY_BETA  kt;
>temp = 25 + ((sqrt(temp) - KTY_ALPHA) / (2 * KTY_BETA));
>tempHighbyte = temp;
>tempLowbyte = (temp - tempHighbyte) * 10;

Da solltest Du das übrigens auch machen. Also bei 1024, 1, 2, 4...

von OldBug (Gast)


Lesenswert?

Da fällt mir grad noch was auf.
Was soll das denn bezwecken:

>tempHighbyte = temp;
>tempLowbyte = (temp - tempHighbyte) * 10;

Da steht ja eigentlich:

>tempHighbyte = temp;
>tempLowbyte = (temp - temp) * 10;

Also "0 * 10" und das ergibt 0.

von mirki (Gast)


Lesenswert?

// Was soll das denn bezwecken:

keine Ahnung !!!

>tempHighbyte = temp;
>tempLowbyte = (temp - temp) * 10;

Also "0 * 10" und das ergibt 0.


mirk

von Martin Schneider (Gast)


Lesenswert?

Naja, das Format ist schon wichtig.
Wenn temp ein float-Zahl ist und
tempHighByte / tempLowByte ein Byte,
dann steht, wie der Name vermuten läßt,
in tempHighByte der Wert vorm Komma und in
tempLowByte die erste Stelle nach dem Komma...

also 28.67 wird zu 28 und 6.

Ahoi, Martin

von OldBug (Gast)


Lesenswert?

Na gut, dann setzen wir mal ein:

tempHighbyte = temp;
tempLowbyte = (temp - tempHighbyte) * 10;

temp = 28.67

tempHighbyte = 28.67;
tempLowbyte = (28.67 - 28.67) * 10;
tempLowByte = 0

Oder sieht das jemand anders?

von mirki (Gast)


Lesenswert?

tempLowByte kann nicht "0" sein !! :-)

von OldBug (Gast)


Lesenswert?

Sondern?

von mirki (Gast)


Lesenswert?

0.00

LOL

Scheisse, mein progger ist im A...... !

mirki

von mirki (Gast)


Lesenswert?

am A.... meinte ich Natürlich, LOL

von mirki (Gast)


Lesenswert?

Danke für den Tipp OldBug, es funzt und ich bekomme nun gute werte.

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.