Hallo, Vielleicht kann mir jemand weiterhelfen. Hab folgendes Probelem: Ich messe die Temperatur mit einem KTY 220 Fühler dieser wird mit einem 1KOhm Wiederstand gegen VCC geschalten. (siehe Bild) Ich weiss es gibt bessere Methoden hierfür, aber es muss auch so gehen. Ziel ist einfach die gemssene Temperatur auf einem Display auszugeben. Hab das ganze jetzt schon wie auf dem Bild mit nem Arduino Board probiert wie auch auf nem MyAvr Board. Es wird der Wiederstand des Fühlers immer um ca. 80 Ohm falsch gemessen. Dementsprechend Messe ich immer ca. 6° zu viel. Wobei der Fehler immer gleich ist, in jedem Temperaturbereich. Der Fühler ist direkt am Board, ich kann mir nicht erklären wo diese 80 Ohm herkommen. Der Code des Arduino ist wegen den vordefinierten Funktionen entsprechend kurz, die AD Wandlung folgt mit dem Befehl analogRead(potPin), die weitere Berechnung ist dann wie beim AVR GCC Code: Hier mal der Code der Main Funktion beim AVR Board: int main(void) { unsigned char meldung[4]; uint16_t adcval; float U_R, U_PTC, I_R, R_PTC, GRAD,GRAD1,GRADU; DDRD = 0xfc; // ausgänge port d DDRB = 0x01; // ausgänge port b LCDPEN &= ~(1 << LCDEN); lcd4ini(); set_cursor(0,1); lcd4puts("Grad:"); while(1) { set_cursor(0,2); adcval = ReadChannel(0); //************** Berechnung der GRAD Zahl************************* U_R = (float)adcval * 0.0052148; // Intervall bestimmen U_PTC = 5.34 - U_R; // Spannung am Fühler I_R = U_R / 1000.0; // Strom durch den Fühler R_PTC = (U_PTC / I_R)-80; // Korrektur um besagte 80 Ohm GRAD = (R_PTC - 1630) / 15.74; // liniarisierung im Bereich 0°-50° // der Kennlinie des KTY // Anpassung um Wert auf Display darzustellen // Darstellung: xx.x --> nicht weiter wichtig itoa(GRAD, meldung, 10); lcd4put(meldung[0]); lcd4put(meldung[1]); lcd4put('.'); GRAD1 = GRAD * 10; GRADU = (int)GRAD * 10; GRAD = GRAD1 - GRADU; itoa(GRAD, meldung, 10); lcd4put(meldung[0]); for (unsigned char i =1; i<=100;i++) warte1ms; // 10ms Warten }
Eigenerwärmung durch den durchfliessenden Strom?
An die Toleranzen der Bauteile gedacht? Ist der Widerstand kein hochgenauer Typ ist die Abweichung verständlich. Zweite Möglichkeit die Referenzspannung des ADC (die interne Referenz der Controller kann Exemplarabhängig um einiges vom Idealwert abweichen)
Hallo, Danke für die schnellen Antworten: zur Eigenerwämung: Fehler ist gleich nach dem anschalten da. Die Tolernaz, 80 Ohm ist schon ne Menge. Kann ich mir nicht vorstellen. Der Fehler des KTY u. R ist ja Additiv, gibt in dem Sinn keine Fehlerfortpflanzung könnte sich sogar auslöschen bestenfalls. Und die Refernezspannung hab ich vorher mit nem Multimeter gemessen. Viele Grüsse und Danke für die Antworten david
David wrote: > Hallo, ... > Ich messe die Temperatur mit einem KTY 220 Fühler dieser wird mit einem > 1KOhm Wiederstand gegen VCC geschalten. ... > Es wird der Wiederstand des Fühlers immer um ca. 80 Ohm falsch gemessen. Welche Referenzspannung benutzt Du? ... > Hier mal der Code der Main Funktion beim AVR Board: > > int main(void) > { > unsigned char meldung[4]; > uint16_t adcval; > float U_R, U_PTC, I_R, R_PTC, GRAD,GRAD1,GRADU; Warum float? Du mißt Integer (ADC) und gibst Integer (Grad) aus. ... > adcval = ReadChannel(0); Welchen Wert gibt ReadChannel() aus? Was kommt heraus, wenn Du das von Hand in die Temperatur umrechnest? Falk
Hallo Ich nehme die Versorgungsspannung als Refernez. Da muss ich ja nix äußerlich beschalten !? Mit diesen Bits kann die Referenzspannung eingestellt werden: REFS1 REFS0 Referenzspanung 0 0 Externes AREF -->0 1 AVCC als Referenz <-- sind bei mir besagte 5,34V 1 0 Reserviert 1 1 Interne 2,56 Volt ja ich messe Integer, aber ich berechne alles in float, weil ich die Kommawerte haben will. Das Intervall ist ja 5.34 V / 2^10 das Ergebnis ist ungerade. U_R = (float)adcval * 0.0052148; // Intervall bestimmen GRAD ist float, nur scheidet die Funktion itoa die Ziffern nach dem Punkt weg, deswegen geb ich erst alles vor dem Punkt und dann nach dem Punkt aus, dazu muss man ein wenig tricksen: GRAD z.B 20,3° GRAD1 = GRAD * 10; // GRAD1 = 203 GRADU = (int)GRAD * 10; // GRADU = 200 GRAD = GRAD1 - GRADU; // GRAD = 3 Welchen Wert gibt ReadChannel() aus? 1 - 1024
aso, vergessen Was kommt heraus, wenn Du das von Hand in die Temperatur umrechnest? Das passt schon , es ist ja schon der Widerstandswert falsch. Wenn ich den KTY messe, erhalte ich ca. 80 Ohm weniger. Die Linearisierung ist auch OK, ist nur im Bereich von 0 - 50 ° macht zwar auch nen kleinen Fehler, aber wie gesagt, der Widerstandswert ist ja schon falsch. Grüsse david
David wrote: > aso, vergessen > > Was kommt heraus, wenn Du das von Hand in die Temperatur umrechnest? > > > Das passt schon , es ist ja schon der Widerstandswert falsch. > Wenn ich den KTY messe, erhalte ich ca. 80 Ohm weniger. ... Ich nehme an, den hast Du mit einem Ohmmeter nachgemessen. Falk
ja ich hab den KTY ausgebaut und mit nem Ohmmeter nachgemessen, und der bringt ca. 2003 Ohm, was der Temperatur in meinem Zimmer entspräche 26 ° Aber meine Schaltung meint er hätte 80 Ohm weniger
David wrote: > ja ich hab den KTY ausgebaut und mit nem Ohmmeter nachgemessen, > und der bringt ca. 2003 Ohm, was der Temperatur in meinem Zimmer > entspräche 26 ° > > Aber meine Schaltung meint er hätte 80 Ohm weniger Das sind 4%. Der RV stimmt genau? Die Betriebsspannung ist exakt 5V? Wieviel Fehler verursacht die begrenzte Genauigkeit des float-Typs? Welchen Wert hat adcval? 1024/3=341 wäre richtig. Falk
Hallo
Die Betriebsspannung ist 5,34V. Das ist schon richtig , also dass ich
die Betriebsspannung als Refernez nehmen kann, ohne jetzt was extern zu
beschalten.
Oder nimmt der als VCC genau 5 V, ne oder ?
Der Fehler durch den float typ ist zu vernachlässigen.
stimmt genau:
> Welchen Wert hat adcval? 1024/3=341
bei ca. 25 Grad
Denkst du wirklich dass der Fehler bedingt durch die Toleranzen der
Bauteile wirkt ?
Weil dann steigt ich auf I²c Temperaturfühler um.
grüsse
david
Hallo David, wenn du AREF nicht brauchst mußt du den Pin mit 100nF auf GND legen um Störungen zu minimieren. Gruß Hans
auf dem Board sind schon die vorgeschlagenen Noise Reduction Beschaltungen verwirklicht, und AREF ist direkt mit VCC verbunden, hab deswegen jetzt auf die externe Refernz geschalten, ohne Erfolg. grüsse david
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.