NTC Temperaturfühler Auswertung funktioniert nicht

OP #3195901
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.
#3195916
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
Gast #3196069
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.

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