Temperaturerfassun mit Multiplexer und Station II (mit Quellcode) Kategorie: Programmierung (von Markus - 14.02.2009 14:02) | ||
| ||
Hallo Gemeinde, 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. Zum einen das Modul zum Auswerten der Temperatursensoren und zum anderen das MUX-Abfragemodul thread getmux (kann ich das so einfach kombinieren wie ich das gemacht habe?). Zurückgegeben werden sollen T[1] bis T[16] 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? 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? /*********************************************************************/ /* 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 main //-------------- { byte i; run getmux; 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; } } Vielen herzlichen Dank für Eure Hilfe, Markus | ||
Antwort schreiben Antworten: Re: Temperaturerfassun mit Multiplexer und Station II (mit Quellcode) (von André H. - 13.04.2009 16:51) Re: Temperaturerfassun mit Multiplexer und Station II (mit Quellcode) (von Markus - 16.05.2009 15:54) |