Forum: Mikrocontroller und Digitale Elektronik PT100 Auswertung


von Mumpitz (Gast)


Angehängte Dateien:

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/WebAttachments/471AB81E27A257EAC12571B900467357/$File/LM75_e.pdf 
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/

von Christian H. (netzwanze) Benutzerseite


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).

von Mumpitz (Gast)


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

von nix (Gast)


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!

von Mumpitz (Gast)


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

von Mumpitz (Gast)


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
1
//-------------------------------------------------------------------------
2
// Titel : 
3
//-------------------------------------------------------------------------
4
// Funktion : 
5
// Schaltung : 
6
//-------------------------------------------------------------------------
7
// Prozessor : ATmega8
8
// Takt : 3686400 Hz
9
// Sprache : C
10
// Datum : 12.10.2009
11
// Version : 1.0
12
// Autor : 
13
// Programmer: 
14
// Port : 
15
//-------------------------------------------------------------------------
16
// created by myAVR-CodeWizard
17
//-------------------------------------------------------------------------
18
//
19
#define   F_CPU   3686400
20
#include <avr\io.h>
21
#include <util\delay.h>
22
23
//---------------------------------------------------------------------------
24
void waitMs(int miliSec)
25
{
26
   _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);   // 4 Zyklen warteschleife
27
}
28
//////////////////////////////////////////////////////////////////////////////
29
//   LCD-Funktionen für myAVR-Board + myAVR-LCD
30
//   4-BitModus an PortD Bit 4-7
31
//   PortD Bit 2 = RS, high=Daten, low=Kommando
32
//   PortD Bit 3 = E, high-Impuls für gültige Daten
33
//---------------------------------------------------------------------------
34
//   lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
35
//   RS muss vorher richtig gesetzt sein
36
//   PE:   data=zu sendendes Byte
37
//---------------------------------------------------------------------------
38
void lcdSend(char data)
39
{
40
   // aktuelles RS ermitteln
41
   char rs=PORTD;
42
   rs&=4;
43
   // High-Teil senden
44
   char tmp=data;
45
   tmp&=0xf0;
46
   tmp|=rs;
47
   PORTD=tmp;
48
   // Schreibsignal
49
   sbi(PORTD,3);
50
   cbi(PORTD,3);
51
   // Low-Teil senden
52
   tmp=data;
53
   tmp&=0x0f;
54
   tmp*=16;
55
   tmp|=rs;
56
   PORTD=tmp;
57
   // Schreibsignal
58
   sbi(PORTD,3);
59
   cbi(PORTD,3);
60
   // verarbeiten lassen
61
   waitMs(1);
62
}
63
//---------------------------------------------------------------------------
64
//   lcdCmd(..) - sendet ein Kommando an LCD
65
//   PE:   cmd=Kommando-Byte
66
//---------------------------------------------------------------------------
67
void lcdCmd(char cmd)
68
{
69
   cbi(PORTD,2);      // RS löschen = Kommando
70
   lcdSend(cmd);      // senden
71
}
72
//---------------------------------------------------------------------------
73
//   lcd_write(..) - sendet ein Zeichen (Daten) an LCD
74
//   PE:   text=Zeichen
75
//---------------------------------------------------------------------------
76
void lcdWrite(char text)
77
{
78
   sbi(PORTD,2);      // RS setzen = Daten
79
   lcdSend(text);      // senden
80
}
81
//---------------------------------------------------------------------------
82
//   lcdWrite(..) - sendet eine Zeichenkette an LCD
83
//   Die Zeichenkette muss mit 0x00 abgeschlossen sein
84
//   PE:   pText=Zeiger auf Zeichenkette
85
//---------------------------------------------------------------------------
86
void lcdWrite(char* pText)
87
{
88
   while(pText[0]!=0)
89
   {
90
      lcdWrite(pText[0]);
91
      pText++;
92
   }
93
}
94
//---------------------------------------------------------------------------
95
//   lcdClear(..) - löscht die Anzeige im LCD
96
//---------------------------------------------------------------------------
97
void lcdClear()
98
{
99
   lcdCmd(0x01);
100
   waitMs(2);         // warten
101
}
102
//---------------------------------------------------------------------------
103
//   lcdOn(..) - schaltet das LCD an
104
//---------------------------------------------------------------------------
105
void lcdOn()
106
{
107
   lcdCmd(0x0E);
108
}
109
//---------------------------------------------------------------------------
110
void waitUs(int mikroSec)
111
{
112
   _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);   // 4 Zyklen warteschleife
113
}
114
//---------------------------------------------------------------------------
115
//   lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
116
//---------------------------------------------------------------------------
117
void lcdInit()
118
{
119
   // Port D = Ausgang
120
   DDRD=0xff;
121
   PORTD=0;
122
   // warten bist LCD-Controller gebootet
123
   waitMs(50);
124
   // SOFT-RESET
125
   PORTD = 0x30;   //0b00110000;
126
   sbi(PORTD,3);
127
   cbi(PORTD,3);
128
   waitMs(5);
129
   PORTD = 0x30;   //0b00110000;
130
   sbi(PORTD,3);
131
   cbi(PORTD,3);
132
   waitUs(100);
133
   PORTD = 0x30;   //0b00110000;
134
   sbi(PORTD,3);
135
   cbi(PORTD,3);
136
   waitMs(5);
137
138
   // 4-BitModus einschalten
139
   PORTD=0x20;
140
   // Schreibsignal
141
   sbi(PORTD,3);
142
   cbi(PORTD,3);
143
   waitMs(5);
144
145
   // ab hier im 4-Bit-Modus
146
   lcdCmd(0x28);      // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
147
   lcdCmd(0x06);      // Entry Mode
148
   lcdOn();
149
   lcdClear();
150
}
151
//---------------------------------------------------------------------------
152
//   lcdWrite(..) - sendet eine Zeichenkette an LCD
153
//   PE:   pText=Zeiger auf Zeichenkette
154
//      count=Anzahl der zu sendenden Zeichen
155
//---------------------------------------------------------------------------
156
void lcdWrite(char* pText, int count)
157
{
158
   while(count!=0)
159
   {
160
      lcdWrite(pText[0]);
161
      pText++;
162
      count--;
163
   }
164
}
165
//----------------------------------------------------------------------
166
// Titel   : C-Funktion Zeichenkette senden.
167
//----------------------------------------------------------------------
168
// Funktion   : ...
169
// IN       : char *buffer, Zeichenkette mit NUll abgeschlossen
170
// OUT      : ...
171
//----------------------------------------------------------------------
172
void lcdString(char *buffer)
173
{
174
   for (int i=0; buffer[i] !=0;i++)
175
      lcdWrite (buffer[i]);
176
}
177
//---------------------------------------------------------------------------
178
//   lcdOff(..) - schaltet das LCD aus
179
//---------------------------------------------------------------------------
180
void lcdOff()
181
{
182
   lcdCmd(0x08);
183
}
184
//------------------------------------------------------------------------
185
// Initialisierungen
186
//------------------------------------------------------------------------
187
void init()
188
{
189
   lcdInit();
190
   lcdWrite('H');
191
   lcdWrite('a');
192
   lcdWrite('l');
193
   lcdWrite('l');
194
   lcdWrite('o');
195
}
196
197
/////////////////////////////////////////////////////////////////////////////
198
// Main-Funktion
199
/////////////////////////////////////////////////////////////////////////////
200
main()
201
{
202
   init();   // Initialisierungen
203
   while (true)    // Mainloop-Begin
204
   {
205
   //...
206
   } // Mainloop-Ende
207
}
208
//---------------------------------------------------------------------------

ich bedanke mich schonmal

von Jörg G. (joergderxte)


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

von Mumpitz (Gast)


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

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.