Pages: [1]   Go Down
Author Topic: Fehler bei Änderung einer Variable wo ist der Fehler  (Read 573 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin
Logged

twitter: @darktom

Tirol
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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....

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Rechtschreibfehler sind raus, geht leider immer noch nicht:

Code:
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
}
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dein Problem ist das "int statusKlappe = 1" bzw. "int statusKlappe = 0"
Beispiel:
Code:
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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21277
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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







« Last Edit: January 20, 2012, 01:17:40 pm by uwefed » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

Pages: [1]   Go Up
Jump to: