www.mikrocontroller.net

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


Autor: David (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
}

Autor: Koster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigenerwärmung durch den durchfliessenden Strom?

Autor: derWarze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke werd ich probieren

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.