Forum: Mikrocontroller und Digitale Elektronik NTC Temperaturfühler Auswertung funktioniert nicht


von Lukas D. (lukas_d)


Lesenswert?

Hallo Leute,

ich möchte einen NTC Temperaturfühler über den PIC16F886 auswerten. 
Dieser NTC hat bei 25°C einen Widerstand von 10kOhm. Sein B beträgt 3993 
K. Bis zur Spannungsberechnung funktioniert der CODE auch. Ab der 
Widerstandsberechnung nicht mehr.

Ich habe die Formel

R(t) = R(n)*e^(B*(1/(t+273,15)-1/298,15))

nach T umgestellt

T = (3993/(ln(R(t)/R(n)+13,39258762)  - 273,15


daraus habe ich folgenden Code gebildet

1
int vADWANDLUNG            = 0;
2
double vSPANNUNG = 0;
3
double vWIDERSTAND = 0;
4
double vNTCTEMP = 0;
5
6
void fNTC()
7
{
8
    //ADCON0
9
    CHS3    = 0;                                                                //Analog Channel bit 4
10
    CHS2    = 0;                                                                //Analog Channel bit 3
11
    CHS1    = 0;                                                                //Analog Channel bit 2
12
    CHS0    = 0;                                                                //Analog Channel bit 1
13
14
    GO_DONE = 1;                                                                 //Starte AD Wandlung
15
    while(GO_DONE);                                                              //warte auf AD Wandlung
16
17
    vADWANDLUNG = ADRESH;                                                       //Auslesen des ADRESH
18
    vADWANDLUNG <<= 8;                                                           //Verschieben des ADRESH
19
    vADWANDLUNG += ADRESL;                                                      //Addieren des ADRESL
20
21
    vSPANNUNG = vADWANDLUNG*5/1024;               //Bis hier läuft
22
    
23
    vWIDERSTAND = vSPANNUNG*10/5-vSPANNUNG;
24
25
    vNTCTEMP = (3993/log(vWIDERSTAND)+13.39258762);
26
    vNTCTEMP -= 237,15;
27
28
    vGANZZAHLIG = vNTCTEMP*10;
29
30
    vZEHNERSTELLE = vGANZZAHLIG/100;                                              //Liefert Zehnerstelle  205/100 = 2,05; ,05 fällt weg
31
    vEINERSTELLE = (vGANZZAHLIG%100)/10;                                          //Liefert Einzerstelle  205%100 = 05/10 = 0,5; ,5 fällt weg
32
    vKOMMASTELLE = vGANZZAHLIG%10;                                                //Liefert Kommastelle   205%10  = 5
33
    fSENDTOSLAVE(0x02,0,0,vZEHNERSTELLE,vEINERSTELLE,vKOMMASTELLE);
34
}

Am Display kommen leider nur schrott raus. Kann mir jemand hierbei 
weiterhelfen? Vielleicht ist mein weg auch zu kompliziert und es gibt 
viel einfachere Möglichkeiten einer Auswertung.

von Juergen G. (jup)


Lesenswert?

wow!

und den Code mutest Du einem PIC16F zu?
Schon mal was von Fixed-point arithmetic gehoert?

Mach die Berechnung auf Deinem PC und leg die Werte in einer Tabelle in 
Deinem PIC an.
Dann ueber LookUps in dieser Tabelle bekommst Du ausreichend genaue 
Werte.

von Markus M. (mark_m)


Lesenswert?

Du überlässt an einigen Stellen deiner Berechnungen dem Compiler die 
Wahl der Datentypen. Wie soll da das von dir Gewünschte Ergebnis heraus 
kommen.
1
vSPANNUNG = vADWANDLUNG*5/1024;               //Bis hier läuft
Und hier ist es schon Falsch. Durch diese Berechnung verlierst Du schon 
die Nachkommastellen. Den Fehler nimmst Du mit in die nachfolgenden 
Berechnungen.

Richtig wäre:
1
vSPANNUNG = vADWANDLUNG*5.0/1024.0;

Grüsse

von Lukas D. (lukas_d)


Lesenswert?

Das heißt ich muss das .0 an jede Zahl heften die ich addiere, 
multipliziere die kein Komma hat? Bevor ich jetzt noch weiter 
rumprobiere und nichts geht. kann mir jemand den Code in die richtige 
Form bringen. Wäre richtig nett (:

von meckerziege (Gast)


Lesenswert?

Jein. Du musst verstehen wie das ganze funktioniert und wann du mit 
Float und wann du mit Ganzzahlen arbeitest.
Beim Teilen durch Konstanten wenn du Float erhalten willst: JA!

von Jürgen H. (Gast)


Lesenswert?


von Lukas D. (lukas_d)


Lesenswert?

Vielen Dank. Wie genau binde ich den Code jetzt in meine ADWandlung ein? 
Wie viele Stützpunkte benötige ich bei 0,5 °C und bei 0,1°C Schritten?

von Michael A. (Gast)


Lesenswert?

Lukas D. schrieb:
> Wie viele Stützpunkte benötige ich bei 0,5 °C und bei 0,1°C Schritten?

Ist dein Excel oder OpenOffice oder ... kaputt?

von Lukas D. (lukas_d)


Lesenswert?

Okay vielen Dank nochmal für eure Hilfestellungen. Mit der Tabelle hat's 
prima hin gehauen :) eine Frage noch. Gibt es diesen Codegenerator auch 
für PTC Widerstände?

von iTroll (Gast)


Lesenswert?

Lukas D. schrieb:
> Wie viele Stützpunkte benötige ich bei 0,5 °C und bei 0,1°C Schritten?

Das kommt auf deinen Temperaturbereich drauf an. Wenn du einen Bereich 
von z.B. 25°C in Schritte von 0,5°C aufteilen möchtest, sind das - 
tataaah - 25/0,5 = 50 Stücke, also 25/0,5 + 1 = 51 Stützstellen.

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.