LM35 Temperature Error

Persönliche Seite #5734997
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
}
Angehängte Dateien:
Moderator Persönliche Seite #5735008
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).
#5735009
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.
Persönliche Seite #5735011
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
Moderator Persönliche Seite #5735015
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.
Persönliche Seite #5735016
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
Persönliche Seite #5735026
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.)
Moderator Persönliche Seite #5735029
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.)
Gast #5735030
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.
Persönliche Seite #5735036
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
#5735037
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. :-)
Gast #5735164
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.
Moderator Persönliche Seite #5735353
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.

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