Forum: Mikrocontroller und Digitale Elektronik Systematischer Fehler bei Analog Digitalwandlung Atmega8


von David (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Koster (Gast)


Lesenswert?

Eigenerwärmung durch den durchfliessenden Strom?

von derWarze (Gast)


Lesenswert?

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)

von David (Gast)


Lesenswert?

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

von Falk W. (dl3daz) Benutzerseite


Lesenswert?

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

von David (Gast)


Lesenswert?

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

von David (Gast)


Lesenswert?

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

von Falk W. (dl3daz) Benutzerseite


Lesenswert?

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

von David (Gast)


Lesenswert?

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

von Falk W. (dl3daz) Benutzerseite


Lesenswert?

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

von David (Gast)


Lesenswert?

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

von hans (Gast)


Lesenswert?

Hallo David,
wenn du AREF nicht brauchst mußt du
den Pin mit 100nF auf GND legen um
Störungen zu minimieren.

Gruß Hans

von David (Gast)


Lesenswert?

ok, danke werd ich probieren

von David (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.