Go Down

Topic: Fehler bei Änderung einer Variable wo ist der Fehler (Read 661 times) previous topic - next topic

joh371

Hallo Gemeinde,

ich habe eine Motorsteuerung Programmiert die ab einer bestimmten Temperatur einen Spindelmotor ansteuert. Wenn dieser am Ende ist soll durch den größeren Stromfluss gemessen über Spannungsteiler der Motor stehen bleiben und einen Wert setzten um nicht immer wieder anzulaufen. Funtioniert soweit Temperatur hoch Motor läuft, Strom hoch Motor steht aber die statusKlappe wird nicht geändert dadurch läuft der Motor immer wieder an und bleibt stehen und so weiter
Wie sorge ich dafür das sich der Wert von Statusklappe ändert.

hier der code:

Code: [Select]

int abgasTemperatur = 3;      //Temp Sensor Abgas an Pin 3

//Klappensteuerung
int klappenSteuerung1 = 11;    //H rechts, L links
int klappenSteuerung2 = 12;    //L rechts, H links
int freigabeKlappe = 13;       // Freigabe Motorsteuerung
int klappenmotorSensor = 1;    // Motorstrom
int statusKlappe = 1;           // Klappe auf, 0 Klappe zu erhält wert 1



void setup ()
{
Serial.begin(9600); //initialisieren serielle Schnittstelle auf 9600 Baud
Serial.println("Start");


pinMode(klappenSteuerung1, OUTPUT);
pinMode(klappenSteuerung2, OUTPUT);
pinMode(freigabeKlappe, OUTPUT);

// Anheizklappe definiert
digitalWrite (freigabeKlappe, HIGH);      //Klappensteuerung freigegeben
digitalWrite (klappenSteuerung1, LOW);    // beide je L Motor steht
digitalWrite (klappenSteuerung2, LOW);    // beide je L Motor steht

}

void loop()
{
//Abgastemperatur einlesen 
int sensorLesen0 = analogRead(abgasTemperatur); //lesen den Sensorwert in Pin A3 ein
float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35); //Umrechnung in Grad Celsius bei Betriebsspannung von 5 Volt, -35 Korrektur des Meßwertes

//Stromaufnahme Klappenmotor einlesen
int strom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein


// Ausgabe  Seriell
Serial.print("Abgastemperatur ist: "); //Ausgabe auf serieller Konsole
Serial.print(temperatur);// oder temperatur
Serial.print(" C  ");
Serial.print("Strom ist: ");
Serial.print(strom);
Serial.print(" A  ");
Serial.print("Status Klappe= ");
Serial.println(statusKlappe);
delay (1000);// zum testen die Steuerung ausgebremst kommt wenns funktioniert weg



//Steuerung Klappenmotor nach Abgastemperatur
if (temperatur >= 250 && statusKlappe == 1)
      {
          digitalWrite (klappenSteuerung1, HIGH); // Temperatur >250 Motor läuft
      }
    if (strom >= 250)                              // Motor steht Strom größer 250( nicht A sondern wert!)
      {
        digitalWrite (klappenSteuerung1, LOW);    //Motor steht
        digitalWrite (klappenSteuerung2, LOW);    //wieder
        int stausKlappe = 0;                      // Status der Klappe
      }

if (temperatur <= 50 && statusKlappe == 0)
      {
          digitalWrite (klappenSteuerung2, HIGH);
      }
    if (strom >= 250)
      {
        digitalWrite (klappenSteuerung2, LOW);
        digitalWrite (klappenSteuerung1, LOW);
        int stausKlappe = 1;
      }   
   
   
   
//Ende
}



vielen Dank vorab an die Helfer

nachtaktiv68

Ich sehe nur, dass zweimal einer Variable "stausKlappe" entweder 0 oder 1 zugewiesen wird. Da hast Du Dich vertippt. Der Sketch kann so eigentlich gar nicht compiliert werden? Deklariert ist sie als "statusKlappe". Guck nochmal :D
twitter: @darktom

fatzgenfatz

Ich sehe hier zwei mal den selben Tippfehler: StausKlappe statt StatusKlappe.

joh371

mmh ich sehs nicht aber ich denke das isch da grundsätzlich was falsch habe...

also mal meine Gedanken:

ganz am Anfag vor Setup die statusKlappe auf 1

dann in der 1. Schleife die statusKlappe abgefragt und nach Strom erhöhung soll die nun 0 sein

und dann halt andersrum....


joh371

Rechtschreibfehler sind raus, geht leider immer noch nicht:

Code: [Select]

int abgasTemperatur = 3;      //Temp Sensor Abgas an Pin 3

//Klappensteuerung
int klappenSteuerung1 = 11;    //H rechts, L links
int klappenSteuerung2 = 12;    //L rechts, H links
int freigabeKlappe = 13;       // Freigabe Motorsteuerung
int klappenmotorSensor = 1;    // Motorstrom
int statusKlappe = 1;           // Klappe auf, 0 Klappe zu erhält wert 1



void setup ()
{
Serial.begin(9600); //initialisieren serielle Schnittstelle auf 9600 Baud
Serial.println("Start");


pinMode(klappenSteuerung1, OUTPUT);
pinMode(klappenSteuerung2, OUTPUT);
pinMode(freigabeKlappe, OUTPUT);

// Anheizklappe definiert
digitalWrite (freigabeKlappe, HIGH);      //Klappensteuerung freigegeben
digitalWrite (klappenSteuerung1, LOW);    // beide je L Motor steht
digitalWrite (klappenSteuerung2, LOW);    // beide je L Motor steht

}

void loop()
{
//Abgastemperatur einlesen 
int sensorLesen0 = analogRead(abgasTemperatur); //lesen den Sensorwert in Pin A3 ein
float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35); //Umrechnung in Grad Celsius bei Betriebsspannung von 5 Volt, -35 Korrektur des Meßwertes

//Stromaufnahme Klappenmotor einlesen
int strom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein


// Ausgabe  Seriell
Serial.print("Abgastemperatur ist: "); //Ausgabe auf serieller Konsole
Serial.print(temperatur);// oder temperatur
Serial.print(" C  ");
Serial.print("Strom ist: ");
Serial.print(strom);
Serial.print(" A  ");
Serial.print("Status Klappe= ");
Serial.println(statusKlappe);
delay (1000);



//Steuerung Klappenmotor nach Abgastemperatur
if (temperatur >= 250 && statusKlappe == 1)
      {
          digitalWrite (klappenSteuerung1, HIGH); // Temperatur >250 Motor läuft
      }
    if (strom >= 250)                              // Motor steht Strom größer 250( nicht A sondern wert!)
      {
        digitalWrite (klappenSteuerung1, LOW);    //Motor steht
        digitalWrite (klappenSteuerung2, LOW);    //wieder
        int statusKlappe = 0;                      // Status der Klappe
      }

if (temperatur <= 50 && statusKlappe == 0)
      {
          digitalWrite (klappenSteuerung2, HIGH);
      }
    if (strom >= 250)
      {
        digitalWrite (klappenSteuerung2, LOW);
        digitalWrite (klappenSteuerung1, LOW);
        int statusKlappe = 1;
      }   
   
   
   
//Ende
}

mkl0815

Dein Problem ist das "int statusKlappe = 1" bzw. "int statusKlappe = 0"
Beispiel:
Code: [Select]

if (temperatur <= 50 && statusKlappe == 0)
      {
          digitalWrite (klappenSteuerung2, HIGH);
      }
    if (strom >= 250)
      {
        digitalWrite (klappenSteuerung2, LOW);
        digitalWrite (klappenSteuerung1, LOW);
        int statusKlappe = 1;
      }   


Durch das "int" vor dem Namen deklarierst Du eine lokale Varibale, welche die globale "überdeckt". Die lokale Variable ist aber bei jedem Durchlauf deiner loop-Funktion wieder "0". Lass das "int" weg und Du verwendest die globale Variable. Damit sollte es gehen.

uwefed

#6
Jan 20, 2012, 07:15 pm Last Edit: Jan 20, 2012, 07:17 pm by uwefed Reason: 1
2 Sachen:

Das Erreichen der beiden Endposition würde ich über Endschalter realisieren, nicht durch die Strommessung. Zur Sicherheit 2 Endschalter: einen für die Positionsmeldung an die Elektronik und einen 2. der später betätigt wird, um die Stromversorgung des Motors zu unterbrechen (Nothalt der manuell resetiert werden muß).
Nach der Kontrolle des Kodes hier ein bißchen ein "Flußdiagramm"

Temperatur hoch und Motor erreicht endposition un bleibt stehen:
Code: [Select]

float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35);
int strom = analogRead(klappenmotorSensor);
...
if (strom >= 250)                              // Motor steht Strom größer 250( nicht A sondern wert!)
     {
       digitalWrite (klappenSteuerung1, LOW);    //Motor steht
       digitalWrite (klappenSteuerung2, LOW);    //wieder
       int statusKlappe = 0;                      // Status der Klappe
     }
...  
if (strom >= 250)
     {
       digitalWrite (klappenSteuerung2, LOW);
       digitalWrite (klappenSteuerung1, LOW);
       int statusKlappe = 1;
     }  


um dann beim nächsten loop() -Durchlauf:
Code: [Select]

float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35);
int strom = analogRead(klappenmotorSensor);
...
//Steuerung Klappenmotor nach Abgastemperatur
if (temperatur >= 250 && statusKlappe == 1)
     {
         digitalWrite (klappenSteuerung1, HIGH); // Temperatur >250 Motor läuft
     }

den Motor wieder zu starten un dann im nächsten Loop() Durchlauf wieder zu stoppen ...

Grüße Uwe








joh371

Hallo Uwefed

Endlagenschalte sind wegen der Einbausituation fast unmöglich

habe die Schleifen geändert nun geht es

ich habe auch eine Stromabfrage für einen größeren Stron eingebau die generell abschaltet und "händisch" wieder zugeschaltet werden muß
bringt eventuell mehr sicherheit für Motor und Endstufe

Ich schalte zur Zeit regulär bei 2,5A ab und Sicherheitsschaltung bei 3,5A die Endstufe kann 5A Belastung vertragen

ich finde halt die Abschaltung kontaktlos auch besser....

Danke an alle :)

Go Up