Forum: Mikrocontroller und Digitale Elektronik UTI03 - Auswertung Pt100/Pt1000


von MegaFan (Gast)


Lesenswert?

Hallo,

ich möchte einen Smartec UTI03 zur Auswertung von Pt100/Pt1000 
verwenden.
(DB: 
http://www.smartec-sensors.com/assets/files/pdf/sensors/SMTUTIN.PDF)
Dieser liefert als Ausgangssignal ein pulsbreiten-moduliertes Signal.

Leider schwanken meine Werte sehr und ich erhalte in weiterer Folge 
keine sinnvollen Temperaturwerte.

Verwendet habe ich folgende Komponenten:
a) ATMega32 (betrieben an Quarz mit 16 MHz)
b) UTI03 (samt notwendigen Widerständen und Pt100)
c) LCD 4x40 Display

(aufgebaut alles auf einem Steckbrett)

Meine Grundidee zur Auswertung des UTI03 ist folgende:
1) Timer1 mit Systemtakt starten (mit Noise Canceller und auf rising 
Edge getriggert)

TCNT1 = 0x0000;
TCCR1B = (1<< ICNC1) + (1<<CS10) +  (1<<ICES1);
TIMSK = (1<<TOIE1) + (1<<TICIE1);
sei();

2) bei Overflow von Timer1 eine uint-Variable inkrementieren
ISR (TIMER1_OVF_vect)
{
  ovf_counter++;
}

3) bei Input Capture die aktuellen Werte von ICR1 und der 
Overflow-Variable in ein Array speichern; nach einer bestimmbaren Anzahl 
von Messwerten den Timer1 deaktivieren und über ein Flag das Messende 
signalisieren
ISR (TIMER1_CAPT_vect)
{


  ICR[meas_counter] = TCNT1;
  OVF[meas_counter] = ovf_counter;

  meas_counter++;

  if (meas_counter >= MEAS_CYCLES * MEAS_NUMBER)
  {
    cli();
    TIMSK &= ~((1<<TOIE1) + (1<<TICIE1));
    meas_finished = 1;
  }

  return;
}

4) Die Berechnung der Zeitdifferenzen erfolgt nach den Messungen mit 
folgender Formel:
diff[i] = (OVF[i+1] * 0x10000 + ICR[i+1]) - (OVF[i] * 0x10000 + ICR[i])

Anmerkung:
OVF[], ICR[] unsigned int,
diff[] unsigned long


Habe ich einen massiven Denkfehler in der Logik?
Schwanken die Werte der UTI03 wirklich so sehr (auf meinem Oszi sieht 
das nicht so aus)?


Bin für jeden Tipp dankbar.

PS: grundsätzlich soll der UTI03 aufgrund gewisser Rahmenbedingungen 
verwendet werden!

von Jens (Gast)


Lesenswert?

Hallo Megafan,

ich denke, in 4) wird zu spät auf long umgeschaltet. Ein paar casts 
sollten helfen.

Vielleicht

((long)OVF[i+1] * 0x10000L + ICR[i+1]) - ((long)OVF[i] * 0x10000L + 
ICR[i])

Gruß
Jens

von MegaFan (Gast)


Lesenswert?

Hallo Jens,

vielen Dank für deine Antwort. Leider brachten die expliziten Casts 
keine Besserung.

Hat schon mal jemand mit diesen UTI03 gearbeitet? Mich würde eure 
Erfahrungen interessieren.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

ich bin grad dabei eine Platine mit 3 Stück UTI für insgesamt 9x PT 100 
// PT500 // PT1000 in Betrieb zu nehmen, allerdings mit Arduino. Die 
ersten Tests schauen vielversprechend aus, ich bin mit den 
messergebnissen soweit zufrieden, bisher recht genau und kaum 
Schwankungen.

ich arbeite allerdings nicht mit timern, sondern mit einer "normalen" 
mess-Schleife, die einfach nur Durchläufe zählt.

Wenns dich interessiert kann ich gerne mal meinen Code posten.

offtopic: wie schreib ich einen Schrägstrich, wenn ich nicht kursiv 
haben will?

von Daniel Signorell (Gast)


Lesenswert?

Hallo Michael
konntest Du Dein Projekt mit Erfolg abschliessen?
Würdest Du Deine Erfahrungen teilen?
Ich möchte als Endziel eine Heizungssteuerung bauen, aber vorerst mich 
mit der Thematik der genauen Temperaturmessung mit UTI03 und Arduino 
auseinandersetzen.
Schon vorab vielen Dank für Dein Feedback

Daniel

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.