mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Thermometer mit NTC: Berechnung der Temperatur funktioniert nicht


Autor: Sebastian D. (--sebi--) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte ein Thermometer mit einem NTC bauen.
Aber die Berechnung der Temperatur funktioniert nicht. Ich möchte den 
ADC Wert ermitteln(klappt), Die Temperatur daraus ausrechnen (klappt 
nicht), und die Temperatur per RS232 an meinen Laptop schicken(klappt).
Bei meinem Laptop kommt immer nur "25.01" oder "-273,15" an.
Am ADC ist der NTC und ein 10k Pullup angeschlossen.
Das ist der Code:
#define F_CPU 1000000

#include <stdio.h>

//#include <avr/interrupt.h>


//#include "General.h"

#include "RS232.c"

#include <util/delay.h>

#include <math.h>

//#include "RS232.h"

//#include "Delay.h"

uint16_t ADC_Read(uint8_t channel)

{

    ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);

  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"

  while (ADCSRA & (1<<ADSC) );    // auf Abschluss der Konvertierung warten

    return ADCW;                    // ADC auslesen und zurückgeben

}

int main (void)

{



    RS232_Init ();

    ADMUX = (1<<REFS0);      // VCC als Referenz

      ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler

      ADCSRA |= (1<<ADEN);                  // ADC aktivieren

    printf ("Hello world...\n");

    char itoabuf[20];

    char dtostrfbuf[20];

    int raw;

    float temp;

    while (1)

    {

        _delay_ms(100);    

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        _delay_ms(100);

        raw=ADC_Read(0);

        temp=(1282088/(4300+ln(raw/(1023-raw))*298.16))-273.15;
 //Hier wird die Temperatur berechnet
        dtostrf(temp,3,1,dtostrfbuf);
 //float zu char[]
        printf(dtostrfbuf);

        printf("\n");

        itoa(raw,itoabuf,10);

        printf(itoabuf);

        printf("\n");

    }

}

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss man, damit ln funktioniert, nicht noch etwas anderes als math.h 
einbinden / einstellen ?

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist "ln" nicht der Logarithmus und über welchen Temperaturbereich soll 
die Messung sein ?
Welche Werte nimmt "raw" an, also bevor es in die Temperatur umgerechnet 
wird.
Einfacher als diese Floatberechnung wäre erstmal eine Tabelle, die für 
einen bestimmten ADC-Wert den entsprechenden Temperaturwert hat.

Autor: Sebastian D. (--sebi--) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
raw nimmt den richtigen Wert an. z.B. 528. Wenn ich darauf die 
Temperatur mit dem Taschenrechner berechne, komme ich auch auf die 
richtige Temperatur.

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, dass die Lib eine funktionierende ln()-Funktion hat?

Ich habe das damals so gemacht und es funktionietrte:
#define V_ref  5.0      // 5V

// NTC-thermistor defines
#define Beta  3977.000    // the Beta-value for the NTC sensor
#define R_th  10000.00    // the thermistor resistance @ 25 degree Celsius
#define T_amb  298.0000    // the temperature in Kelvin for 25 degree Celsius
#define T_zero  273.0000    // the temperature in Kelvin for 0 degree Celsius

.
.
.

    ADCSRA |= (1<<ADSC);        //Start conversion
  while (ADCSRA & (1<<ADSC)) {}    //wait until converstion completed
    
    V_ADC = (ADC * V_ref)/1024;        // calculate the voltage over the NTC
  Temperature = (Beta / ((log(V_ADC/(V_ref-V_ADC))/log(exp(1))) + (Beta/T_amb))) - T_zero; 


Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> temp=(1282088/(4300+ln(raw/(1023-raw))*298.16))-273.15;


Schreib 1023.0 und überlege mal wirklich ob floating point so schlau auf 
einem uC ist.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du auch dem Linker gesagt, dass er die Floating-Point Bibliothek 
mit einbinden soll?



Sebastian Deppisch schrieb:
> #include "RS232.c"

Btw., C-Programme werden nicht included

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich kenn mich nich so genau mit dem AVR aus, aber die math.h lib hat 
meines Wissens keine "ln" Funktion, sondern nur eine "log" bzw. "log10" 
Funktion. Das entspricht auch so in etwa dem Original der Formel aus der 
Lego-NXT Sammlung. Also mal ausprobieren:
=(1282088/(4300+LOG(RAW/(1023-RAW))*298,16))-273,15

ABER, hast Du auch den gleichen NTC-Widerstand ??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Moin,
>
> ich kenn mich nich so genau mit dem AVR aus, aber die math.h lib hat
> meines Wissens keine "ln" Funktion, sondern nur eine "log" bzw. "log10"

log IST der ln


  raw / (1023-raw)

einfach mal mit Ganzzahlarithmetik ausprobieren, was da rauskommt.
Oder um es so zu sagen: Wenn er auf dem Taschenrechner diesen 
Teilausdruck hier ausrechnet, dann nach der Division alle Kommastellen 
wegwerfen. Dann sieht sein Ergebnis auf dem Taschenrechner nämlich auch 
plötzlich ganz anders aus. Zb wird alles für raw kleiner 512 zu einer 
schnöden 0 (was für den ln dann wieder gar nicht gut ist)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> log IST der ln

Danke für den Hinweis. Der OP hat aber "ln" in seiner Berechnung. Das 
sollte doch eher schief gehen, oder ?
Der Hinweis mit der Ganzzahlarithmetik ist deshalb interessant, weil 
jetzt auch klar wird, warum "MaWin" vorgeschlagen hat, mit 1023.0 zu 
rechnen. Dadurch wird der gesamte Ausdruck eine Floatberechnung. Oder 
sehe ich das falsch ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Karl heinz Buchegger schrieb:
>> log IST der ln
>
> Danke für den Hinweis. Der OP hat aber "ln" in seiner Berechnung. Das
> sollte doch eher schief gehen, oder ?


Nochmal:
In Programmiersprachen ist die Funktion log der Logarithmus zur Basis e 
(vulgo der 'natürliche Logarithmus', vulgo ln). Der Logarithmus zur 
Basis 10 schreibt sich meistens log10.


> jetzt auch klar wird, warum "MaWin" vorgeschlagen hat, mit 1023.0 zu
> rechnen. Dadurch wird der gesamte Ausdruck eine Floatberechnung. Oder
> sehe ich das falsch ?

Das siehst du richtig.

Autor: Sebastian D. (--sebi--) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Ich werde es mal mit X.0 probieren

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Deppisch schrieb:
> Danke. Ich werde es mal mit X.0 probieren

Und das hier lesen

http://www.mikrocontroller.net/articles/FAQ#Datent...

und darüber nachdenken, was da alles daraus folgt.

Autor: Sebastian D. (--sebi--) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also es funktioniert jetzt.
Vielen Dank.
Und µC Programmieren klappt bei mir jetzt auch unter Linux.
@Peter
Woher hast du die Formel?
Die ist doch von meiner Homepage, und die Formel hab ich so erstellt.
http://mylegopage.my.funpic.de/index.php?page=selb...
Und da es meine ist, hab ich sogar nicht nur den gleiche, sondern auch 
den selben NTC ;)

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Deppisch schrieb:
> Woher hast du die Formel?
> Die ist doch von meiner Homepage, und die Formel hab ich so erstellt.

Was immer du damit sagen willst - es gibt eine Formel für das Verhalten 
eines NTC, die steht in Wikipedia und in jedem einschlägigen Datenblatt. 
Die muss man für die Anzeige nach T auflösen, und wie das halt in der 
Mathematik so ist, kommt dabei IMMER das Gleiche heraus. U.a. deswegen 
gibt es auch keine Patente auf mathematische Formeln, jedenfalls bisher 
nicht.

Gruss Reinhard

Autor: Sebastian D. (--sebi--) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist mir schon klar, aber 
"=(1282088/(4300+LOG(RAW/(1023-RAW))*298,16))-273,15"(so wie Peter es 
geschrieben hat) Habe ich so auf meiner Homepage stehen.

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.