www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega KTY10-7 Temperatur


Autor: Michael (Gast)
Datum:

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

Autor: Norbert (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was meinst du mit <???> ?

Autor: Norbert (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, ok, leider bekomme ich das nur durch probieren raus :-(

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

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke, komme jetzt schon weiter.

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
temp = pow(KTY_ALPHA, 2.0) - 4.0 * KTY_BETA + 4.0 * KTY_BETA * kt;

Grüße,

Peter

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter,

habe hier scheinbar den Ursprung der Funktion gefunden:
http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Da ist es auch besser kommentiert, es klappt jetzt :)
//***************************************************************** 
//* Calculate KTY-Temperature 
//***************************************************************** 

// KTY100-6 
#define KTY_R25 2000 // R at 25�C 
#define KTY_RS 3900 // serial resistor 
#define KTY_ALPHA 0.00788 
#define KTY_BETA 0.00001937 

float kty_calc(int adcResult) 
{ 
float vAdc, temp, kt; 

vAdc = (adcResult * V_REF) / 1024; 
kt = (KTY_RS / (vcc / vAdc - 1)) / KTY_R25; // Temperaturfaktor 

temp = pow(KTY_ALPHA, 2) - 4 * KTY_BETA + 4 * KTY_BETA * kt; 
temp = 25 + ((sqrt(temp) - KTY_ALPHA) / (2 * KTY_BETA)); // Temperatur in �C 

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

return temp; 
}

Autor: Michael (Gast)
Datum:

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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.