Atmega KTY10-7 Temperatur

Gast #2058918
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
Gast #2058989
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
Persönliche Seite #2059007
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
Gast #2059112
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren