Re: Temperaturerfassun mit Multiplexer und Station II (mit Quellcode) Kategorie: Programmierung (von Markus - 16.05.2009 15:54) | ||
Als Antwort auf Re: Temperaturerfassun mit Multiplexer und Station II (mit Quellcode) von André H. - 13.04.2009 16:51 | ||
| ||
> Hallo Markus, > > > ich möchte mit dem AD-Multiplexer Art.# 1415 und der Station II 16 Temperatursensoren auslesen. > > Ich hab momentan keine Hardware zur Verfügung um das ganze zu testen, evtl. kann mir ja > > einer sagen ob das so funktioniert oder ob ich mich auf dem Holzweg befinde. > > Ich habe zwei SW Module von Andre Helbig und Malte Alpers kombiniert. > > Prinzipiell funktioniert es. > Allerdings mu�t Du beachten, da� zwei Möglichkeiten verwendet werdent, die AD-Werte zu erfassen. > Ich benutze (bzw. so ist es beim ReglerBoard) die Interpolation von 10 Messungen, wodurch > sich ein Wertebereich von 0-10230 ergibt. (siehe rbports.c2) > Dementsprechend sind die getPT-Funktionen ausgelegt. > Ohne Interpolation mu� mit 0-1023 gearbeitet werden und die Auswertung entsprechend > auf diesen Wertebereich anpepa�t werden. Aber Du kannst auch 10 Werte Messungen, wie > in rbports.c2 aufaddieren. > > > Gleich ne Frage zur Array Festlegung: Wieso int T[17]? > > Weil ich einmal von 0...15 hab und die Temperaturen von T[1] bis T[16] habe, und von 0..16 > > gleich 17 ergiebt? > > korrekt. > Allerdings würde ich 0-basierende Werte benutzen, und bei T[0] anfangen. > Dementsprechend brauchst Du auch nur 16 statt 17 Arrayelemente definieren. > > > > Weiter soll function getPT1 für die Abgastemperaturmessung dienen, 4 Sensoren > > ca. von 0°C bis 700°C (muss ich noch anpassen, aber wie?) (Auflösung 1°C), > > hierfür muss ich den KonstantstromMUX mit 12V versorgen, bleibt mir dann für die anderen > > 12 Sensoren eine hohe Auflösung (0,1°C) erhalten? > > Ja. > Es kann aber sein, da� bei der Versorgung durch 12V das Rauschen höher wird, > wenn die 12V unstabilisiert sind. > > > MfG André H. > Hallo André, vielen Dank für Deine Antwort, hab das Prog jetzt getestet, haut aber leider nicht so recht hin... Kurz zu meinem Versuchsaufbau: Hab die Station 2, an der hängt die Messplatine 4 mit den Messadaptern für PT1000 (Messadapter nicht abgeglichen!) wie folgt Verkabelt: - adc 0...3 auf A-D an der Messplatine - GND Verbunden - 12V Klemme der Messplatine von Netzteil (ca.11,8V) - Klemme �bersp. der Messplatine auf 12V von Station Verkabelung MUX mit Messplatine: - Ch.1-4 auf A-D der Messplatine - VEE auf 4 x Klemmen M - Klemmen A und B vom MUX auf port 14 und 15 der Station - GND - 5V von Station - 12V von Netzteil (ca. 11,8V) Alle 16 Jumper am MUX gesezt, Jumper 17 nicht gesetzt. Jumper des Konstantstrom-MUX auf 12V gesetzt Am MUX sind nur die ersten 4 Klemmenpaare mit PT1000 Sensoren belegt, sollte für Testzwecke reichen, Leere Klemmenpaare sind offen! Ich bekomme folgende Werte am Display ausgegeben: T1 -14,5 T2 -14,5 T3 -14,5 T4 -9,5 Ziehe ich eine Messkarte, ändert sich der dazugehörige Wert auf ca. -24 bzw. bei T4 auf ca. -28 Ziehe ich den Konstantstrom-MUX, ändern sich alle Werte auf -99,9 Ziehe ich den Jumper am Konstantstrom-MUX, alle Werte zeigen ebenfalls -99,9 Ziehe ich den Jumper für einen PT1000 Sensor, ändert sich nichts, der Wert bleibt bei -14,5 Bei anwärmen des Sensors mit einem Feuerzeug ändert sich auch nichts am angezeigten Wert!? Hier nochmal mein Quellcode, habs noch ein bischen abgeändert, genauergesagt noch erweitert um die Ausgabe von 4 Werten auf dem Station Display: /*********************************************************************/ /* Modul zur Auswertung der Temperatursensoren am CC2-Multiplexer */ /* Vorlage : André Helbig */ /* Geändert : Malte Alpers (malte.alpers@gmx.de) */ /* Angepasst für Station: Markus Haidn */ /* Version : 1.0 */ /* Datum : 05.07.2005 */ /*********************************************************************/ /* WICHTIG: */ /* - Verwendete Auswertfunktionen müssen angepasst werden, wenn die */ /* Messadapter für einen anderen Messbereich abgeglichen werden! */ /* - Im thread "main" muss ggf. der Name der zu verwendende */ /* Auswertfunktion geändert werden! */ /* - ggf. individuelle Offsetwerte der einzelnen Sensoren setzen */ /* (Abweichung von einer Bezugstemperatur) */ /* - Ausgabewerte T[1]...T[16] der Sensoren 1...16 am Reglerboard */ /* in 1/10°C (z.B. 21.6°C = 216)! */ /* - Erkennung von Fühlerbruch und -kurzschluss: */ /* - bei Wert = -999 : Fühlerkurzschluss */ /* - bei Wert = 9999 : Fühler unterbrochen oder nicht angeschlossen*/ /*********************************************************************/ int T[17]; // Anzahl der Sensoren (Ports) + 1 (16 + 1 = 17) !!! // Setzen der individuellen Offset-Werte in +/- 1/10°C (z.B. Offset 2K = 20) // Sensor: 1,2,3,4 , 5,6,7,8 , 9,10,11,12 , 13,14,15,16 const OFFSET[] = 0,0,0,0 , 0,0,0,0 , 0,0,0,0 , 0,0,0,0; /***********************************************************************/ /* Auswertfunktion für Pt1000 (linearisiert) */ /* Funktion: y=((y-AD)*TempBereich)/ADBereich +(-) Offset */ /* TempBereich in K (z.B. +60 bis +80°C = 20 K) */ /* ADBereich = (oberer AD-Wert MINUS unterer AD-Wert)/10 (integer!) */ /* Offset in 1/10 K (z.B. Bereich ab -20°C : Offset = -200) */ /* Rückgabewert in 1/10°C (z.B. 21.6°C = 216)! */ /***********************************************************************/ /* WICHTIG: */ /* - Linearisierung für andere Messbereiche: AD-Werte müssen neu ermit-*/ /* telt werden! Soll keine Linearisierung erfolgen, siehe 'getAD592'.*/ /* - Werte in den Berechnungen unten entsprechend ändern! */ /* - Klammern und Rechenreihenfolge nicht ändern (wg. int, long)! */ /* - Ausgabewerte mit vorgegebenen Temperaturwerten am Sensoreingang */ /* für jeden Bereich kontrollieren um Tipp-/Rechenfehler zu bemerken!*/ /***********************************************************************/ function getPT1(int x, byte i) returns int //Abgastemperaturmessung /* Temperaturbereiche für Linearisierung AD-Wert +280°C = 10230 +200°C = 7760 +100°C = 4600 0°C = 1340 -40°C = 0 */ { long y; y=x; // Datentypwechsel von 'int' auf 'long' if x==0 return -999; // Fühler Kurzschlu� if x==10230 return 9999; // Fühler unterbrochen if x>=7760 y=((y-7760)*80)/247+2000; else if x>=4600 y=((y-4600)*100)/316+1000; else if x>=1340 y=((y-1340)*100)/326; else y=(y*40)/134-400; y=y+OFFSET[i]; // Addieren des individuellen Offsets return y; } /***********************************************************************/ /* Auswertfunktion für Pt1000 (linearisiert) */ /* Funktion: y=((y-AD)*TempBereich)/ADBereich +(-) Offset */ /* TempBereich in K (z.B. +60 bis +80°C = 20 K) */ /* ADBereich = (oberer AD-Wert MINUS unterer AD-Wert)/10 (integer!) */ /* Offset in 1/10 K (z.B. Bereich ab -20°C : Offset = -200) */ /* Rückgabewert in 1/10°C (z.B. 21.6°C = 216)! */ /***********************************************************************/ /* WICHTIG: */ /* - Linearisierung für andere Messbereiche: AD-Werte müssen neu ermit-*/ /* telt werden! Soll keine Linearisierung erfolgen, siehe 'getAD592'.*/ /* - Werte in den Berechnungen unten entsprechend ändern! */ /* - Klammern und Rechenreihenfolge nicht ändern (wg. int, long)! */ /* - Ausgabewerte mit vorgegebenen Temperaturwerten am Sensoreingang */ /* für jeden Bereich kontrollieren um Tipp-/Rechenfehler zu bemerken!*/ /***********************************************************************/ function getPT2(int x, byte i) returns int //Wasser- bzw. Umgebungstemp.-messung /* Temperaturbereiche für Linearisierung AD-Wert +130°C = 10230 +100°C = 8360 +50°C = 5180 0°C = 1960 -30°C = 0 */ { long y; y=x; // Datentypwechsel von 'int' auf 'long' if x==0 return -999; // Fühler Kurzschlu� if x==10230 return 9999; // Fühler unterbrochen if x>=8360 y=((y-8360)*30)/187+1000; else if x>=5180 y=((y-5180)*50)/318+500; else if x>=1960 y=((y-1960)*50)/322; else y=(y*30)/197-300; y=y+OFFSET[i]; // Addieren des individuellen Offsets return y; } /***********************************************************************/ /* Abfrage und Auswertung der Sensorwerte und Speicherung als */ /* Temperaturen in T[1]...T[16] */ /* Rückgabewert in 1/10°C (z.B. 21.6°C = 216)! */ /***********************************************************************/ /* WICHTIG: */ /* - Für anderen Sensortyp Funktionsname ändern (s.u.)! */ /* - Bei Mischbestückung muss eine Abfrage mit 'if' erfolgen, z.B.: */ /* */ /* for i=0...15 */ /* { */ /* if i%4==2 or i%4==3 T[i+1]=getAD592(rbports.ad(i),i); */ /* else T[i+1]=getPT1(rbports.ad(i),i); */ /* } */ /* */ /* Im Beispiel werden Messadapter 'C' + 'D' mit der Auswertfunktion */ /* für AD592 und die anderen Messadapter mit 'PT1' ausgewertet. */ /* */ /* i%4==0 (Messadapter A) Wasser- bzw. Umgebungstemp. */ /* i%4==1 (Messadapter B) Wasser- bzw. Umgebungstemp. */ /* i%4==2 (Messadapter C) Wasser- bzw. Umgebungstemp. */ /* i%4==3 (Messadapter D) Abgasmessung */ /***********************************************************************/ /******************************************************************/ /* Ansteuerung für den AD-Multiplexer */ /* Author : André Helbig (andre.h@cc2net.de) */ /* Vorlage : André Helbig (andre.h@cc2net.de) */ /* Versionen : 1.0 */ /* Datum : 30. August 2002 */ /* Getestet : ja */ /* Benötigt : ports.c2 */ /******************************************************************/ const PortA=14; //(P1H.6) Steuerports für den AD-Multiplexer const PortB=15; //(P1H.7) int AD[16]; //Integer-Array für alle 16 Portwerte //--------- thread getmux //--------- { byte i,j; for i=0...3 { ports.set(PortA,i and 0b01); ports.set(PortB,i and 0b10); sleep 25; run 255; yield; for j=0...3 { AD[i*4+j]=ports.adc(j); } resume; } } thread display { lcdext.init(); lcdext.goto(1,0); lcdext.zahl4n1(T[1]); lcdext.goto(1,8); lcdext.zahl4n1(T[2]); lcdext.goto(2,0); lcdext.zahl4n1(T[3]); lcdext.goto(2,8); lcdext.zahl4n1(T[4]); sleep 1000; } //-------------- thread main //-------------- { stports.init(); byte i; run getmux; run display; loop { for i=0...15 { if i%4==3 T[i+1]=getPT1(AD[i],i); else T[i+1]=getPT2(AD[i],i); } sleep 250; } } Die Aufaddierung im main thread hab ich noch nicht gemacht, möchte erst, dass sich überhaupt mal was tut ;-) Ok, ich hab schon ein bisschen daran zumgespielt, dann springen aber die Werte wild umher... Vielleicht will sich ja hier einer erbarmen und mir ein paar Zeilen hinschreiben ;-) Vielen Dank für Eure Hilfe, Markus H. | ||
Antwort schreiben Antworten: |