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
> 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;
Vielleicht sollte man an den jeweiligen Stellen noch so etwas wie "+" "-" "*" "/" angeben?
ah, ok, leider bekomme ich das nur durch probieren raus :-( Was macht die Funktion pow für einen nicht mathematiker verständlich ?
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
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
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
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 | }
|
genau, die konstanten Berechnungen nehme ich aus der Funktion raus, macht so nur stress.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.