Forum: Mikrocontroller und Digitale Elektronik Atmega KTY10-7 Temperatur


von Michael (Gast)


Lesenswert?

Hallo,

ich möchte aus dem ADC Wert die Temeratur errechnen.

Der KTY ist mit 4,7k in reihe geschaltet und ich messe am 
Spannungsteiler. VRef sind die internen 2,56 V

Ich habe die ADC Werte per RS232 ausgegeben, funktioniert alles soweit.

hier habe ich ein Beispiel gefunden:
Beitrag "KTY10-7"

Leider bekomme ich den code nicht komplett kompiliert.

#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define KTY_R25 2030.0
#define KTY_RS 4700.0
#define KTY_ALPHA 0.00788
#define KTY_BETA 0.00001937
float V_REF = 2.56;
float tempHighbyte;
float tempLowbyte;
float vcc 5.0;

float temp_calc(int adcwert)
{
  float vAdc, temp, kt;
  vAdc = (adcwert * V_REF) / 1024.0;
  kt = (KTY_RS / (5.0 / vAdc - 1.0)) / KTY_R25;
  temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0  KTY_BETA  kt;
  temp = 2.05 + ((sqrt(temp) - KTY_ALPHA) / (2.0 * KTY_BETA));
  tempHighbyte = temp;
  tempLowbyte = (temp - tempHighbyte) * 10;
return temp;
}

in der Zeile bekomme ich den Fehler:
  temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0  KTY_BETA  kt;

error: expected ';' before numeric constant


wird die pow Funktion falsch aufgerufen ? Hat jemand einen Tipp für 
mich.

viele Grüße
Michael

von Norbert (Gast)


Lesenswert?

>   temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0 KTY_BETA  kt;

temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0 <???> KTY_BETA <???> 
kt;

von Michael (Gast)


Lesenswert?

Hi,

was meinst du mit <???> ?

von Norbert (Gast)


Lesenswert?

Vielleicht sollte man an den jeweiligen Stellen noch so etwas wie "+" 
"-" "*" "/" angeben?

von Michael (Gast)


Lesenswert?

ah, ok, leider bekomme ich das nur durch probieren raus :-(

Was macht die Funktion pow für einen nicht mathematiker verständlich ?

von Norbert (Gast)


Lesenswert?


von Peter D. (pdiener) Benutzerseite


Lesenswert?

pow(KTY_ALPHA, 2.0)

Das quadriert KTY_ALPHA.

pow(x,y) = x hoch y

Das zweite Argument ist der Exponent, also im Fall von 2 eine einfache 
Quadrierung.

Grüße,

Peter

von Tobi (Gast)


Lesenswert?

Moin,

der Aufruf von pow() ist schon richtig

temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0  KTY_BETA  kt;

Das Problem ist das was nach dem "+" Zeichen kommt. Schau dir das 
einfach mal genau an.


Gruss,
Tobi

von Michael (Gast)


Lesenswert?

Super, danke, komme jetzt schon weiter.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Abgesehen davon ist es nicht sinnvoll, Konstanten zur Laufzeit zu 
quadrieren.

KTY_BETA ist im Originalbeitrag FETT geschrieben, das geht durch 
vorangestelltes Mal-Zeichen und nachfolgendes Mal-Zeichen, es ist also 
vor und nach dem KTY_BETA ein Multiplikationsoperator.

Das sieht dann im Forum ohne Textformatierung fett aus:

temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0  KTY_BETA  kt;

Eigentlich ist das gemeint:
1
temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0 * KTY_BETA * kt;

Grüße,

Peter

von Michael (Gast)


Lesenswert?

Danke Peter,

habe hier scheinbar den Ursprung der Funktion gefunden:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=23077&start=0

Da ist es auch besser kommentiert, es klappt jetzt :)
1
//***************************************************************** 
2
//* Calculate KTY-Temperature 
3
//***************************************************************** 
4
5
// KTY100-6 
6
#define KTY_R25 2000 // R at 25�C 
7
#define KTY_RS 3900 // serial resistor 
8
#define KTY_ALPHA 0.00788 
9
#define KTY_BETA 0.00001937 
10
11
float kty_calc(int adcResult) 
12
{ 
13
float vAdc, temp, kt; 
14
15
vAdc = (adcResult * V_REF) / 1024; 
16
kt = (KTY_RS / (vcc / vAdc - 1)) / KTY_R25; // Temperaturfaktor 
17
18
temp = pow(KTY_ALPHA, 2) - 4 * KTY_BETA + 4 * KTY_BETA * kt; 
19
temp = 25 + ((sqrt(temp) - KTY_ALPHA) / (2 * KTY_BETA)); // Temperatur in �C 
20
21
tempHighbyte = temp; 
22
tempLowbyte = (temp - tempHighbyte) * 10; 
23
24
return temp; 
25
}

von Michael (Gast)


Lesenswert?

genau, die konstanten Berechnungen nehme ich aus der Funktion raus, 
macht so nur stress.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Es sollte schon reichen, wenn man pow(KTY_BETA, 2.0) durch 
KTY_BETA*KTY_BETA ersetzt. Das sollte der Compiler wegoptimieren können.

Grüße,

Peter

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.