PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehr als eine "if" Abfrage. Programm friert ein?



achso
24.01.2019, 07:10
Hallo,
Mein Frequenzumrichter hat 4 (x1-x4) Eingänge. Wenn man Sie auf LOW setzt, ergeben sich je nach Konstellation 16 Frequenzen. Die er dann ausführt, wenn man x6(Vorwärts) auch auf LOW setzt.
Als Temperaturquelle dient ein MAX 6675 Modul mit "K" Fühler.
Regeln möchte ich die Drehzahl des Abgasgebläses, meines alten Holzvergasers.
Die Temperatur liegt bei 220°C. Die möchte ich auf 170-180° bringen.

Nun funktioniert es mit einer if Abfrage einwandrei.
Aber wenn ich eine weitere zufüge, friert das Programm ein.


#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int numRows = 2;
const int numCols = 16;

#include <max6675.h>


const int max6675SO = 9; // Serial Output am PIN 9
const int max6675CS = 10; // Chip Select am PIN 10
const int max6675CLK = 13; // Serial Clock am PIN 13

const int x1 = A1; //Analog Ausgänge
const int x2 = A2; //zum Transistor
const int x3 = A3;
const int x4 = A4;
const int x6 = 6;


// Initialisierung der MAX6675 Bibliothek mit
// den Werten der PINs
MAX6675 ktc(max6675CLK, max6675CS, max6675SO);

const float Temp1 = 30;//Das sind die einzustellenden
const float Temp2 = 29;//Gradzahlen des Abgases
const float Temp3 = 28;
const float Temp4 = 27;
const float Temp5 = 26;
const float Temp6 = 25;
const float Temp7 = 24;
const float Temp8 = 23;
const float Temp9 = 22;
const float Temp10 = 137;
const float Temp11 = 136;
const float Temp12 = 135;
const float Temp13 = 134;
const float Temp14 = 133;
const float Temp15 = 128;


void setup() {
lcd.begin(numCols, numRows);//Start
Serial.begin(9600); // Begin der Seriellen Kommunikation mit 9600 Baud
delay(500); // eine kleine Pause damit der Sensor sich kalibriert
pinMode(x1, OUTPUT); // Analog Ausgang
pinMode(x2, OUTPUT);
pinMode(x3, OUTPUT);
pinMode(x4, OUTPUT);
pinMode(x6, OUTPUT);

}

void loop() {
lcd.setCursor(0, 0); //1. Reihe 1.Zeichen
lcd.print("Abgastemperatur"); //Schreibt das Wort
lcd.setCursor(10, 1); //2. Reihe
lcd.print("Grad");
lcd.setCursor(2, 1); //2. Reihe 4.Zeichen
lcd.print(ktc.readCelsius()); //Schreibt den Wert

digitalWrite(x6, HIGH);//Solange Spannung anliegt-High. Der Frequenzumrichter liefert 16 Volt, die gegen COM gesetzt werden. Deshalb sind da noch NPN Tranistoren zwischen.

// Lesen des Temperaturwertes in Grad Celsius
float temperatur = ktc.readCelsius();


if ((temperatur < Temp1) || (temperatur > Temp2))
{
digitalWrite(x1, LOW);
}
else
{
digitalWrite(x1, HIGH);
delay(1000);

//Das Funktioniert bis hier. Aber wenn ich die folgende if
//dazustelle,friert das Programm ein

}
if ((temperatur < Temp2) || (temperatur > Temp3))
{
digitalWrite(x2, LOW);
}
else
{
digitalWrite(x2, HIGH);
delay(1000);
}



Serial.print(ktc.readCelsius());
Serial.println("C");


// 500ms Pause bis zum nächsten Durchlauf
delay(1000);
}
}

Arduino ist trotz Arduino Kochbuch nicht meine Welt. Trotzdem knacke ich daran rum.
Vieles funktioniert auch. Aber so richtig begreifen tue ich es nicht.
Also keine große Hoffnung auf Läuterung verschwenden.
Ganz zufrieden bin ich mit dem Max 6675 nicht. Manchmal fangen die Gradzahlen das schwimmen an. Teils 6°. Irgendwann kriegt er sich dann wieder ein.
Deshalb greife ich vielleicht auf einen PT1000 mit Messwandler zurück.

Nett wäre, wenn ich den Fehler wüsste und eine Lösung hätte.
Dankeschön
Achim

HaWe
24.01.2019, 08:09
hat du schon mal so etwas getestet...?

if (statement1) {...}
else
if (statement2) {...}
else
if (statement3) {...}
else
if (statement4) {...}

else {...} // default

Ceos
24.01.2019, 08:22
also grundsätzlich klingt das mit dem code fetzen ohne wissen über den vernwendeten controller/board unmöglich, aber du hast hier mehrere probleme mit dem code die zu nebeneffekten führen können die man nicht ohne die hardware zu haben abschätzen kann

gib mal bitte in deinem code beispiel auch realisitsche temperaturen an denn diese werte 30,29,28 etc. machen die ifs völlig sinnfrei, die sind immer true :)

achso
24.01.2019, 15:15
Danke HaWe,
habe ich probiert.Negativ.
Wahrscheinlich nicht wie Du meintest.


if (Temp1) {digitalWrite (x1,HIGH);}

else
if (Temp2) {digitalWrite(x2,HIGH);}

else
if (Temp3) {digitalWrite(x1,HIGH);}
else
if (Temp4) {digitalWrite(x1,HIGH);}

Hallo Ceos,
Sind die Codes nicht überall gleich?
Ich teste immer mit einem Uno. Der ist fertig auf einem Steckbrett.
Das läuft dann auch auf dem Promini oder ATTYNI.
Habe ich damit nur Glück gehabt?
Die Temperaturen habe ich gewählt, damit ich mit der Hand die Temperaturen ändern kann.
Der Frequenzumrichter hat mehrere Eingänge.
Nur fand ich den Multiblock so einfach. Ich kann jeder der 16 Möglichkeiten eine Frequenz zuweisen.
Zuerst versuchte ich ihn mit Spannung zu regeln.
10 oder 5 Volt sind möglich. Leider bekam ich die PWM vom Arduino nicht so gut glatt. Dem Frequenzumrichter war es zu rauh.
Spannungsgesteuert macht für mich mehr Sinn(Das begreife ich so halb)
Bei diesem Max 6675 Typ K Auswerter, brauchte ich ewig, bis ich überhaupt wusste, auf welchen Wert ich mich beziehen muss. (Auf "temperatur", hoffe das stimmt).

Nun hatte ich heute Zeit und den Wärmetauscher des Ofens modifiziert.
Soweit ich das sehe, läuft er jetzt schon ohne Zutun mit 160°C.
Dann bräuchte ich nur eine if. Einmal über 140°C= 50Hz. Einmal unter 140°C = 30Hz.
Das geht ja mit der einen if.
Trotzdem noch eine Frage:

digitalWrite(x2,x3,x4, LOW);

Wenn mehrere Ausgänge das Gleiche machen sollen. Wie fasse ich das zusammen?
Ich mache keinen Hehl draus, ich komme mit dem Programmieren ganz schlecht klar.

Das Ganze hat wohl überhaupt keinen Zweck. Wenn ich den TYP K Fühler auf über 100°C erhitze, habe ich wenn es unter 100°C werden, 3 Stellen hinterm Punkt. Also 98.345°C zum Beispiel.

achso
25.01.2019, 17:07
Es hat geklappt.
Dadurch, dass ich den Wärmetauscher umgebaut habe, erübrigt sich eine ausgiebige elektronische Steuerung.
Der Code funktioniert, aber benutzen kann ich ihn nicht.
Das K Modul schwimmt zu stark.
Das schein normal zu sein.
Einen PID REX 100FK02 hatte ich mir zum Testen bestellt.
Den habe ich nur an den Oszi gehängt.
Auch hier schwingt es zwischen LOW und HIGH nur so rum. Solange die Temperatur 2°C vor dem Schaltpunkt und 6° hinter dem Schaltpunkt liegt, schalte er sauber durch. Aber in diesem Bereich ist es eine Katastrophe. Merkwürdigerweise gibt es meinem Metrawatt Thermometer (TYP-K) sowas nicht.

Also warte ich, bis Pollin meinen Kram geschickt hat und baue das mit dem PT1000 auf.

Danke für Eure Anregungen und Tipps!
Achim



#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int numRows = 2;
const int numCols = 16;

#include "max6675.h" //Die MAX6675 Bibliothek

const int max6675SO = 9; // Serial Output am PIN 8
const int max6675CS = 10; // Chip Select am PIN 9
const int max6675CLK = 13; // Serial Clock am PIN 10



// Initialisierung der MAX6675 Bibliothek mit
// den Werten der PINs
MAX6675 ktc(max6675CLK, max6675CS, max6675SO);
const double x1 = A1; //Prog 105 Ausgänge über Transistor
const double x2 = A2; //Prog 106 zum Umrichter
const double x3 = A3; //Prog 108
const double x4 = A4; //Prog 112
const double x6 = 6;
//Abgastemperatur
const float Temp1 = 30;//über 150°
const float Temp2 = 28;//145°-150°
const float Temp3 = 26;//140°-145°
const float Temp4 = 24;//unter 140°



const long oneSecond = 1000;
const long oneMinute = oneSecond * 60;

void setup() {
lcd.begin(numCols, numRows);//Start
Serial.begin(9600); // Begin der Seriellen Kommunikation mit 9600 Baud
delay(500); // eine kleine Pause damit der Sensor sich kalibriert
pinMode(x1, OUTPUT); //Programm 105 Ausgang
pinMode(x2, OUTPUT);//Programm 106
pinMode(x3, OUTPUT);
pinMode(x4, OUTPUT);//Programm 108
pinMode(x6, OUTPUT);//FWD=Start
}

void loop()
{

lcd.setCursor(0, 0); //1. Reihe 1.Zeichen
lcd.print("Abgastemperatur"); //Schreibt das Wort
lcd.setCursor(10, 1); //2. Reihe
lcd.print("Grad");
lcd.setCursor(2, 1); //2. Reihe 4.Zeichen
lcd.print(ktc.readCelsius()); //Schreibt den Wert

digitalWrite(x6, HIGH);//Startet den Umrichter


// Lesen des Temperaturwertes in Grad Celsius
double temperatur = ktc.readCelsius();

if (temperatur > Temp1) //über 155°C

{
digitalWrite(x1, HIGH);//Ist Programm 105 soll auf 40HZ
}
else
{
digitalWrite(x1, LOW);

}

if ((temperatur < Temp2) || (temperatur > Temp1)) //über 145°, aber
//unter 150°

{
digitalWrite(x2, LOW);// Programm 106, ca 43 HZ
} else {
digitalWrite(x2, HIGH);
}
if ((temperatur < Temp3) || (temperatur > Temp2)) //über 140°, aber
//unter 145°

{
digitalWrite(x3, LOW);// Programm 106, ca 46 HZ
} else {
digitalWrite(x3, HIGH);
}
if ((temperatur < Temp4) || (temperatur > Temp3)) //über 135°, aber
//unter 140°

{
digitalWrite(x4, LOW);// Programm 106, ca 50 HZ
} else {
digitalWrite(x4, HIGH);
}
if (temperatur < Temp4) // unter 135°
{
digitalWrite(x4, HIGH);//Programm 108,weniger als 25HZ

}
else
{
digitalWrite(x4, LOW);

}
Serial.print(temperatur);
Serial.println("C");



// 500ms Pause bis zum nächsten Durchlauf
delay(1000);
}

shedepe
25.01.2019, 18:40
Wenn es schwimmt verpass ihm doch einen Tiefpassfilter z.b. in Form eines gleitenden Mittelwerts.

achso
25.01.2019, 19:14
Danke shedepe,
das ist es!
Habe ich auch gleich was drüber gefunden.
Bisher habe ich es mit Pausen versucht. Es geht fast.
Ein anderes Problem:
Der Frequenzumwandler hat auf seinen Eingängen eine Spannung von ca 16V. Wenn man diese gegen gnd legt, macht er dass, was ihm eingegeben wurde.
Aber auf den offenen Ausgängen liegt eine Restwelligkeit. Nun hatte ich schon die Ausgänge(Sind die A1-A4, D`s ist nicht frei.) mit NPN Trans. versorgt. Diese schalten gegen GND.(In meiner grenzwertigen Dösigkeit hoffte ich, dass die NPN so träge reagieren, dass das Problem weg ist. War wohl nichts.)
Trotz puffern mit 100n. Das muß doch vom flatterigen MAX6675 kommen??
Das Beste wäre wohl, ich würde Optokoppler verwenden. Dann wäre der Nano total vom Frequenzumrichter getrennt?
Heute nicht mehr.
Dankeschön!
Achim

achso
03.02.2019, 19:28
Nur noch mal als Rückmeldung.
Getestet hatte ich ja am Schreibtisch. Kurze Leitungen, Arduino auf dem Steckbrett.
Spannungsquelle USB oder auch Netzteil.
Hier schwamm die Anzeige wie beschrieben.
Dann hatte ich nur am Schluß ein 15 Sekunden Delay eingefügt und den Nano in einen DIN-A4 Blatt großen Kasten gesetzt. Hier sind noch 6 x SSD Relais, Ein Meanwell Netzteil und diverse Bauteile eng verbaut.
Dadrüber im extra Gehäuse der Frequenzumrichter. Der Fühler im Rauchrohr des Holzvergasers.
Das verückte ist, nichts schwimmt mehr. Der Nano steuert 1/4° genau, ohne zu zittern, den Umrichter.
Ich bin natürlich begeistert. Auch wenn es rätselhaft ist.
Danke für eure Hilfe.
Es ist schön, nicht alleine da stehen zu müssen.

Alles Gute und helft weiter so toll.
Achim