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
}
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
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