Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > > 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: > > <code> > /*********************************************************************/ > /* 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; > } > } > </code> > > 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.