mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PT100 Auswertung


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

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag

So ich wollte mit meinen Atmel mega 8 ein paar Temp werte erfassen und 
diese auf dem LCD ausgeben.
ich habe dazu 2 - 3 Fragen.

Frage 1: ist ein PT 100 besser als ein KTY ?

Frage 2: wie realesire ich das mit dem Mega 8 das ich ein AD eingang 
nehmen muß ist soweit klar aber wie linearesire ich und wie scallire ich 
den und gebe den auf den LCD aus ich wollte das in C oder Assambler 
machen.

Frage 3 oder sollte ich direckt den 
https://www.distrelec.com/distrelec/datasheets.nsf... 
nehmen?

ist das besser und Billiger?

Ich danke erstmal

Mumpitz

p.s. die schaltung die ich angehängt habe kommt von der Seite 
http://www.sprut.de/

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst Du denn genau (woran) messen?

Mal "PT100" in Google eingeben und den ersten (und zweiten) Treffer 
anklicken und lesen.

Vorteil einer PT100/PT1000 (letzerer ist besser) gegenüber einem KTY ist 
die annähernd lineare Widerstandskennline und die Wiederholgenauigekeit 
beim Einsatz verschiedener Sensoren des gleichen Typs (auch wenn man den 
Sensor mal auswechselt, braucht ggf nichts neu angeglichen werden).

@LM75, was besser, billiger?
Kommt drauf an, was Du willst.
Preise kannst Du sicherlich selber rausfinden und damit entscheiden, was 
billiger ist.
Wenn Du einen Tauchsensor mit Temperaturen > 200°C hast, ist der LM75 
(und jeder andere Siliziumsensor) ungeeignet.

@Linearisierung:
a. Lookup-Tabelle mit Zwischenwertinterpolation (schnell).
b. Anwenden der umgestellten Formel der Widerstandskennline. Also aus 
dem Widerstand die Temperatur berechnen (erfordert eventuell viele 
Berechnungen).
c. Linearisierung mittels Opamps/Spezial-IC

Auch hier kommt es drauf an, was Du willst (Messgenauigkeit).

Autor: Mumpitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Thx erstmal

Ich wollte eigentlich nur Raumpenperaturen Messen. Aber um später noch 
leistung frei zu haben wollte ich eigentlich so wenig Software wie 
möglich schreiben.(ich muss sowieso noch schauen wie ich das schreibe 
fange greade erst damit an :) )
Der LM 75 ist für knapp 5 Euro schon zu bekommen da ist er aber schon 
auf einer kleinen Platiene drauf (das ist besser weil es SMD Technik 
ist).
Ein KTY oder PT kostet schon so 2-4 Euro ...
Gibt es einen Assambler Quode den ich mir anschauen kann wie die 
Auswertung des Signales und die Ausgabe auf ein LCD geht?

Sage schon mal THX.

Mumpitz

Autor: nix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das Dein Einstiegsprojekt in die AVR-Controllerfamilie ist und Du 
vielleicht sogar bisher nichts oder sehr wenig in Assembler gemacht 
hast, empfehle ich Dir als Programmiersprache entweder C 
(WinAVR/AVR-Studio; kostenlos erhältlich, gut ausgereift, kein Ärger 
über Demoversionen mit eingeschränktem Leistungsumfang) oder Bascom 
(Compiler-Basic; viele spezielle Routinen z.B. für Ansteuerung eines LCD 
bereits integriert. Einstieg relativ schnell möglich; Demoversion mit 
Beschränkung auf 4kB Codegröße frei erhältlich, Vollversion kostet 
jedoch etwa 90 Euro, und die Sprache ist im Vergleich zu C etwas 
unflexibler). Als Temperatursensoren für Raumtemperaturmessung würde ich 
solche verwenden, die direkt eine der Temperatur proportionale 
Gleichspannung liefern, z.B. LM35, LM335 o.ä. Es gibt verschiedene 
Varianten mit unterschiedlicher Genauigkeit. Man sollte diese Sensoren 
direkt an die Analogeingänge des Mega8 anschließen können - für PT100 
braucht man einen vorgeschalteten Verstärker. Die lineare Kennlinie 
erspart einem die Arbeit mit Tabellen und Interpolation.

Viel Erfolg!

Autor: Mumpitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Nix

hallo und guten Morgen.
Erstmal danke für die Antwort das Problem mit dem LM 35 ist das die 
Kabellänge nicht so hoch werden darf den wenn ich greade mal 25 C° bei 
3,5 V habe dann habe ich nach 5 Metern nichts mehr zum messen :(
Zu Assambler ich habe mal in der Abendschule einen 8085 mit Assambler 
beschrieben und auch gelernt, deswegen wollte ich bei dieser "Sprache" 
bleiben.
Ein Buch zu C habe ich mir schon gekauft aber mir fehlt da irgentwie der 
einstig (Moderne C-Prorammierung).
Ein paar Sachen sind in C einfach einfacher als in Assambler und 
deswegen habe ich damals schon darüber nachgedacht...
Das beste ist das ich mir das HOWTO c von dieser Seite mal anschaue.
Programmiren tuhe ich im moment mit SISY AVR das war dabei und geht 
eigentlich ganz gut.Soll angeblich auch C und C++ können.
Schauen wir mal was passirt, habe jetzt etwas zeit mich damit zu 
beschäftigen.

Sage erstmal Danke

Mumpitz

Autor: Mumpitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich habe nochmal nachgeschaut und mit dem SISY helper wollte ich was 
erstellen aber ich bekomme bei dem Kompeliren den Fehler

Kompiliere die Datei unbenannt.cc.
unbenannt.cc:24: error: expected unqualified-id before '{' token
Ende.

der Quode Lautet
//-------------------------------------------------------------------------
// Titel : 
//-------------------------------------------------------------------------
// Funktion : 
// Schaltung : 
//-------------------------------------------------------------------------
// Prozessor : ATmega8
// Takt : 3686400 Hz
// Sprache : C
// Datum : 12.10.2009
// Version : 1.0
// Autor : 
// Programmer: 
// Port : 
//-------------------------------------------------------------------------
// created by myAVR-CodeWizard
//-------------------------------------------------------------------------
//
#define   F_CPU   3686400
#include <avr\io.h>
#include <util\delay.h>

//---------------------------------------------------------------------------
void waitMs(int miliSec)
{
   _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);   // 4 Zyklen warteschleife
}
//////////////////////////////////////////////////////////////////////////////
//   LCD-Funktionen für myAVR-Board + myAVR-LCD
//   4-BitModus an PortD Bit 4-7
//   PortD Bit 2 = RS, high=Daten, low=Kommando
//   PortD Bit 3 = E, high-Impuls für gültige Daten
//---------------------------------------------------------------------------
//   lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
//   RS muss vorher richtig gesetzt sein
//   PE:   data=zu sendendes Byte
//---------------------------------------------------------------------------
void lcdSend(char data)
{
   // aktuelles RS ermitteln
   char rs=PORTD;
   rs&=4;
   // High-Teil senden
   char tmp=data;
   tmp&=0xf0;
   tmp|=rs;
   PORTD=tmp;
   // Schreibsignal
   sbi(PORTD,3);
   cbi(PORTD,3);
   // Low-Teil senden
   tmp=data;
   tmp&=0x0f;
   tmp*=16;
   tmp|=rs;
   PORTD=tmp;
   // Schreibsignal
   sbi(PORTD,3);
   cbi(PORTD,3);
   // verarbeiten lassen
   waitMs(1);
}
//---------------------------------------------------------------------------
//   lcdCmd(..) - sendet ein Kommando an LCD
//   PE:   cmd=Kommando-Byte
//---------------------------------------------------------------------------
void lcdCmd(char cmd)
{
   cbi(PORTD,2);      // RS löschen = Kommando
   lcdSend(cmd);      // senden
}
//---------------------------------------------------------------------------
//   lcd_write(..) - sendet ein Zeichen (Daten) an LCD
//   PE:   text=Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char text)
{
   sbi(PORTD,2);      // RS setzen = Daten
   lcdSend(text);      // senden
}
//---------------------------------------------------------------------------
//   lcdWrite(..) - sendet eine Zeichenkette an LCD
//   Die Zeichenkette muss mit 0x00 abgeschlossen sein
//   PE:   pText=Zeiger auf Zeichenkette
//---------------------------------------------------------------------------
void lcdWrite(char* pText)
{
   while(pText[0]!=0)
   {
      lcdWrite(pText[0]);
      pText++;
   }
}
//---------------------------------------------------------------------------
//   lcdClear(..) - löscht die Anzeige im LCD
//---------------------------------------------------------------------------
void lcdClear()
{
   lcdCmd(0x01);
   waitMs(2);         // warten
}
//---------------------------------------------------------------------------
//   lcdOn(..) - schaltet das LCD an
//---------------------------------------------------------------------------
void lcdOn()
{
   lcdCmd(0x0E);
}
//---------------------------------------------------------------------------
void waitUs(int mikroSec)
{
   _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);   // 4 Zyklen warteschleife
}
//---------------------------------------------------------------------------
//   lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
//---------------------------------------------------------------------------
void lcdInit()
{
   // Port D = Ausgang
   DDRD=0xff;
   PORTD=0;
   // warten bist LCD-Controller gebootet
   waitMs(50);
   // SOFT-RESET
   PORTD = 0x30;   //0b00110000;
   sbi(PORTD,3);
   cbi(PORTD,3);
   waitMs(5);
   PORTD = 0x30;   //0b00110000;
   sbi(PORTD,3);
   cbi(PORTD,3);
   waitUs(100);
   PORTD = 0x30;   //0b00110000;
   sbi(PORTD,3);
   cbi(PORTD,3);
   waitMs(5);

   // 4-BitModus einschalten
   PORTD=0x20;
   // Schreibsignal
   sbi(PORTD,3);
   cbi(PORTD,3);
   waitMs(5);

   // ab hier im 4-Bit-Modus
   lcdCmd(0x28);      // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
   lcdCmd(0x06);      // Entry Mode
   lcdOn();
   lcdClear();
}
//---------------------------------------------------------------------------
//   lcdWrite(..) - sendet eine Zeichenkette an LCD
//   PE:   pText=Zeiger auf Zeichenkette
//      count=Anzahl der zu sendenden Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char* pText, int count)
{
   while(count!=0)
   {
      lcdWrite(pText[0]);
      pText++;
      count--;
   }
}
//----------------------------------------------------------------------
// Titel   : C-Funktion Zeichenkette senden.
//----------------------------------------------------------------------
// Funktion   : ...
// IN       : char *buffer, Zeichenkette mit NUll abgeschlossen
// OUT      : ...
//----------------------------------------------------------------------
void lcdString(char *buffer)
{
   for (int i=0; buffer[i] !=0;i++)
      lcdWrite (buffer[i]);
}
//---------------------------------------------------------------------------
//   lcdOff(..) - schaltet das LCD aus
//---------------------------------------------------------------------------
void lcdOff()
{
   lcdCmd(0x08);
}
//------------------------------------------------------------------------
// Initialisierungen
//------------------------------------------------------------------------
void init()
{
   lcdInit();
   lcdWrite('H');
   lcdWrite('a');
   lcdWrite('l');
   lcdWrite('l');
   lcdWrite('o');
}

/////////////////////////////////////////////////////////////////////////////
// Main-Funktion
/////////////////////////////////////////////////////////////////////////////
main()
{
   init();   // Initialisierungen
   while (true)    // Mainloop-Begin
   {
   //...
   } // Mainloop-Ende
}
//---------------------------------------------------------------------------

ich bedanke mich schonmal

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> main()
Ist das so erlaubt (als Definition)? (Besonders in C++)
Probier mal
>> void main(void)

ps.: Du könntest:
a) deinen Code auf ein Minimum reduzieren
b) deinen Code anhängen
c) die Zeile aus der Fehlermeldung markieren

hth, Jörg

Autor: Mumpitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK thx

Ich mache das jetzt etwas anders werde klein anfangen und den Quode nach 
und nach aufbauen.
Die Grundbefehle zum ansprechen der Ports bleiben ja gleich nur das 
drumherum ist anders :)
das werde ich mal nach und nach schauen.
ich betrachte jetzt die sache als erledigt.
mumpitz

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.