Forum: Mikrocontroller und Digitale Elektronik LM35 Temperature Error


von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,

ich habe für meinen Kunden einen LM35 für den Messbereich 30°C - 90°C im 
Einsatz. VREF liegt bei 2.5V mit einem LM385.

Nun hat er die Möglichkeit über ein Servicemenue einen Korrekturfaktor 
einzubauen, da gemessenen und angezeigte Werte abweichen. (Evtl. auch 
weil zu messende Materie und Sensor etwas auseinander liegen)

Laut Datenblatt ist die Messkurve ja relativ linear.
Doch dort gibt es auch das Bild (siehe Anhang).

Aktuell erhällt der Kunde bei 50° mit einem Korrekturwert von +0,4 ein 
passables Ergebnis. Jedoch passt ihm diese "Formel" für 90° überhaupt 
nicht.

Dort bräuchte ich eine Anpassung von 1,8.

Nun habe ich dazu frei Fragen:

1. mit Welcher FormelMethode kann ich dies möglichst über den ganzen 
Messbereich erreichen? (Wichtig sind Werte bei 50 und 90, aber ich 
möchte die Anzeige auch nicht springen lassen).

Auch wenn es auf einen LookUpTabelle hinausläuft bräuchte ich initial 
eine Formel, um diese in Excel zu berechnen.

2.
Hier...
Beitrag "Re: suche einfachen und guten Temp Sensor"
Beitrag "Re: Temperatur 0,1°C Auflösung"
...ist die rede von Erwärmung durch Verlustleistung beim "power-pollen"
Muss ich beim ADC mit dem LM35 ebenfalls aufpassen, und kann bereits 
bessere Werte erziehlen, wenn ich den ADC anders anspreche?

(Alternate Sensoren möchte ich an dieser Stelle nicht verwenden. Nur das 
optimum durch rumrechnen aus diesem holen)

Falls es von Relevanz ist noch etwas Code:
1
void initAnalogComparator() {
2
#ifndef GCC
3
  DDRA &= ~(1 << PA5); //as input
4
  DDRA &= ~(1 << PA6); //as input
5
  DDRA &= ~(1 << PA7); //as input
6
  PORTA &= ~(1 << PA5); //no Pull-up
7
  PORTA &= ~(1 << PA6); //no Pull-up
8
  PORTA &= ~(1 << PA7); //no Pull-up
9
10
    //REFS0=0; REFS1=0 --> AREF, Internal Vref turned OFF!
11
    //ADEN=ADC Enable
12
    //ADSC=Starte Wandlung
13
    //ADIE= Interrupt nach Abschluss
14
    //ADATE= Auto Trigger Enable -->SFIOR(Special FunctionIO Register)
15
    //ADPS0:2=Vorteiler 50kHz - 200kHz : hier 64
16
    ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS1) | (1 << ADPS2);
17
    //ADCSRA |= 1<<ADATE;//Free running Mode
18
19
    sei();
20
21
    //ADMUX |= (1 << MUX0) | (1 << MUX2); //ADC5
22
    //ADMUX |= (1 << MUX0) | (1 << MUX1)| (1 << MUX2);//ADC7
23
24
  //Start the first conversation to activate Interrupt!
25
  ADCSRA |= 1 << ADSC;
26
#endif
27
}
28
29
30
uint16_t readADC(uint8_t next) {
31
#ifndef GCC
32
  uint16_t old_adc_value = ADCW;
33
  ADMUX = next;
34
35
  // Den ADC erneut starten
36
  ADCSRA |= (1 << ADSC);
37
38
  return old_adc_value;
39
#endif
40
}
41
42
uint8_t lastChannel, nextChannel;
43
/*
44
 * ADC Conversion Complete Interrupt Service Routinge
45
 * */
46
ISR(ADC_vect) {
47
48
    //Universal
49
  /*for (uint8_t i = 0; i < 8; i++) {
50
    if(selectedChannels[i]){
51
      lastChannel = nextChannel;
52
      nextChannel = i;
53
      uint16_t unused = readADC()
54
    }
55
  }*/
56
    //Switch nur zwischen ADC5 und ADC7
57
    if(lastChannel == 5){
58
        lastChannel = 7;
59
        nextChannel = 5;
60
    }else{
61
        lastChannel = 5;
62
        nextChannel = 7;
63
    }
64
    adcValues[lastChannel] = readADC(nextChannel);
65
        /*
66
         * Messwerte im Bereich 0 bis 1023
67
         * also 0=0V; 1023=2,5V
68
         * Spannung =  ADC*AREF/1023
69
         * 87*2,5/1023 = 0,2126V == 21,2C°
70
         * 87*2500/1023 =  212mV == 21,2C°
71
         * LM35--> 10mV/C°
72
         */
73
}

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

Den Wert einfach mit 2 Korrekturwerten mappen ist bei 30-100 Grad nicht 
genau genug?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> (Wichtig sind Werte bei 50 und 90, aber ich möchte die Anzeige auch
> nicht springen lassen).

Bei zwei Punkten kannst du doch immer eine Gerade durchlegen.  Ein Punkt 
bestimmt die Offsetkorrektur an dieser Stelle, der zweite Punkt den 
Anstieg. Dazwischen skaliert alles monoton, das sollte also deinen 
Bedingungen entsprechen.

Macht sich natürlich am einfachsten als Gleitkommarechnung, aber das ist 
auf einem AVR an sich ja kein Problem (hast du möglicherweise ohnehin 
schon drin).

von Harald W. (wilhelms)


Lesenswert?

D a v i d K. schrieb:

> Nun hat er die Möglichkeit über ein Servicemenue einen Korrekturfaktor
> einzubauen, da gemessenen und angezeigte Werte abweichen.

Da braucht man mindestens eine Zweipunktkorrektur (A+B*X).
Die passenden Werte bekommt man mit einer Wertetabelle im
Excel, indem man in der erstellten Grafik eine lineare
Regression durchführt. Das geht im Excel recht einfach
selbst mit Korrekturfaktoren zweiten und höheren Grades.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Jens M. schrieb:
> Den Wert einfach mit 2 Korrekturwerten mappen ist bei 30-100 Grad nicht
> genau genug?

Es ist ein Regelkreis der ohne Nachkommastellen im Display angezeigt 
wird jedoch mit 1 Nachkommastelle genau  in die Schaltzyklen eingeht.

Bsp. unter 49,5° wird geheizt über 50,3° wird gekühlt.
So dass im Display fast immer 50° steht.
Die angestrebten 50° sind ebenfalls Konfigurierbar. Heißt ein anderer 
Kunde könnte dort 40° anstreben und ich möchte wie gesagt nicht, dass es 
dann irgendwo plötzlich spring.

Grüße David

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Harald W. schrieb:
> Das geht im Excel recht einfach
> selbst mit Korrekturfaktoren zweiten und höheren Grades.

Da braucht man kein Excel dafür, das kann der AVR auch in einer 
Kalibrierroutine selbst ausrechnen. ;-)  Man bringt ihn in einen 
Kalibriermodus, heizt den Sensor auf 50 °C, drückt eine Taste, heizt auf 
90 °C, drückt nochmal eine Taste, und er speichert sich die Werte im 
EEPROM ab.  Wenn dann mal 40 °C gemessen werden, haben die natürlich 
wieder einen kleinen Restfehler, denn der Fehler wurde ja bei 50 und 90 
°C zu 0 definiert.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Sorry, ihr habt so schnell geantwortet, dass ich nicht alles sofort 
gelesen habe ;)


Harald W. schrieb:
> D a v i d K. schrieb:
> Da braucht man mindestens eine Zweipunktkorrektur (A+B*X).

Kannst du mir das etwas genauer erklären, stehe gerade auf dem Schlauch.
Was ist der ADC-Wert? X?

Dann hätte ich B=1 gewählt und A=0,01 (bei 50° zumindest)
Bei 90° wäre A=0,02

: Bearbeitet durch User
von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Harald W. schrieb:
>> Das geht im Excel recht einfach
>> selbst mit Korrekturfaktoren zweiten und höheren Grades.
>
> Da braucht man kein Excel dafür, das kann der AVR auch in einer
> Kalibrierroutine selbst ausrechnen. ;-)  Man bringt ihn in einen
> Kalibriermodus

Die beiden Differenzen in einer Routine zu bestimmen bekomme ich hin.
Aber wie rechne ich damit dann weiter.

Also
50: -->50,4
90: -->91,8

(vermutlich muss ich nun erst mal nachschlagen, was "lineare Regression" 
wirklich bedeutete.)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du hast:

mit V als auszugebendem Wert und V_{sensor} als gemessenem.

Nun willst du bei 50 und 90 °C kalibrieren, dann hast du zwei 
Gleichungen:

Die kannst du umstellen und einsetzen:

(Hoffentlich habe ich mich nicht vertippselt bei den LaTeX-Formeln.)

: Bearbeitet durch Moderator
von Karl M. (Gast)


Lesenswert?

Hallo David K.

wenn man sich an diese Schreibweise erinnern mag:

f(x) = a0*x⁰ + a1*x¹ + a2*x² + .. wann wird es vielleicht klarer.

Setzt man dann noch alle Koeffizienten an = 0 mit n >= 2, dann erhält 
man eine Geradengleichung:

https://de.wikipedia.org/wiki/Geradengleichung#Koordinatengleichungen

Die Koeffizienten kann man dann einfach, durch Umformen,
bei zwei gegebenen Messwerten y1, y2, f(x1) = y1 und f(x2) = y2 
berechnen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mit deinen beiden Werten käme ich auf:

Kontrolle:

Passt also. :)

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> (Hoffentlich habe ich mich nicht vertippselt bei den LaTeX-Formeln.)

Perfekt, danke. (Wusste nicht dass es hier LaTeX-Formeln gibt :)
Ich hoffe der Kunde lässt sich auf die Kalibrierung ein.

Passiert die Reproduzierbarkeit dann darüber, dass der Kunde die .eep 
von einem kalibrierten ausließt und auf alle anderen flasht?

Grüße David

von Harald W. (wilhelms)


Lesenswert?

Jörg W. schrieb:

> Du hast:
>
>

Schade, Du hast A und B genau umgekehrt wie ich definiert. :-)
Vor einigen Jahren hatte ich eine ähnliche Aufgabe für die
Kalbrierung eines Interferrometers mit nm-Genauigkeit. Dort
musste ich eine Anpassung dritten Grades machen. Die Formel
konnte dann in das Meßgerät eingetippt werden. Die Meßwerte
habe ich ins Excel eingetippt und die Formel wurde dann vom
Excel errechnet. Dafür das ich vorher noch nie mit Excel
gearbeitet hatte, funktionierte das recht gut. :-)

von my2ct (Gast)


Lesenswert?

Jörg W. schrieb:
> Macht sich natürlich am einfachsten als Gleitkommarechnung, aber das ist
> auf einem AVR an sich ja kein Problem (hast du möglicherweise ohnehin
> schon drin).

Man weiss ganz genau, dass der Skalierungsfaktor nahe bei 1 ist und der 
Offset bestimmt nicht genauer als 0,1°C erforderlich ist.

Was soll da die Gleitkommarechnung, die zur Erhöhung der Dynamik 8 Bit 
für den Exponenten - in diesem Fall - verschwendet und für jede Zahl 
ganze 32 Bit durch die Rechnung schleppt, obwohl für den Temperaturwert 
10 Bit mehr als genug währen. So eine Aufgabe ist nun wirklich 
prädestiniert für Festkommaarithmetik, auch wenn man da vielleicht mal 
kurz über Auflösung und Zahlenbereich nachdenken muss.

von holger (Gast)


Lesenswert?

>Was soll da die Gleitkommarechnung,

Weil es geht?

Wenn genug Flash und Rechenzeit über ist kann man das bedenkenlos 
machen.
Handoptimierung macht man erst wenn es nicht anders geht. Kostet ja auch
Zeit und Kundengeld.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> Passiert die Reproduzierbarkeit dann darüber, dass der Kunde die .eep
> von einem kalibrierten ausließt und auf alle anderen flasht?

Nein, du kalibrierst jeden Sensor einzeln, denn jeder wird ein wenig 
anders ausfallen. Daher ist es ja auch am sinnvollsten, das irgendwie 
mit einer Prozedur wie der oben beschriebenen gleich in die Firmware mit 
einzubauen.

my2ct schrieb:
> Man weiss ganz genau, dass der Skalierungsfaktor nahe bei 1 ist und der
> Offset bestimmt nicht genauer als 0,1°C erforderlich ist.

Allein die obigen Rechenergebnisse zeigen, dass deine Annahme schon mal 
falsch ist: der Offset ist deutlich größer.

Selbstverständlich kann man das natürlich auch alles in Assembler mit 
Bitschieberei und -skaliererei machen – wenn man zu viel lange Weile 
hat. Man kann aber auch einfach die paar CPU-Zyklen spendieren und hat 
die Lösung dann schon fix&fertig beim Kunden, während andere noch die 
Bits zählen … :)

Wenn ich die Aufgabe hätte, würde ich gleich von den rohen ADC-Werten 
ausgehend die Kalibrierung vornehmen, d.h. die Umrechnung der ADC-Werte 
in die Temperatur fällt dann gleich nebenbei mit ab.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Wenn ich die Aufgabe hätte, würde ich gleich von den rohen ADC-Werten
> ausgehend die Kalibrierung vornehmen, d.h. die Umrechnung der ADC-Werte
> in die Temperatur fällt dann gleich nebenbei mit ab.

Den letzten Satz verstehe ich nicht.

von Jens M. (schuchkleisser)


Lesenswert?

Na, anstatt
ADC zu Temp ungefähr
und dann
Temp ungefähr zu Temp genau

Kann man auch direkt
ADC zu Temp genau

Also
ADC 34 zu 40° und dann 40°*1,04
Kann man ja direkt ADC 34 * x rechnen und auf die genaue Temperatur 
kommen.

Dann hat man Kalibrierung und Konversion in einem Schritt. Und mit 
höherer Genauigkeit auch noch.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jens M. schrieb:
> Kann man auch direkt
> ADC zu Temp genau

Yep, und für die erste Abschätzung, bis das Ding kalibriert ist, 
errechnet man sich vorab ein paar Werte für a und b – von mir aus auch 
mit Excel. :-)

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.