Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Station, OSOPT V3.1
> 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: