while Schleife in Void Setup funktioniert nicht?

Hallo Gemeinde,

zuerst eine kurze Beschreibung

ich betreibe einen 12V Spindelantrieb über eine Motorsteuerung mit dem L289. Die Stromaufnahme des Motors messe ich über einen 0,5 Ohm /20W Wiederstand am analog Eingang, auf der Achse des Motors sitzt ein Drehgeber den ich an einem weiteren analog Eingang angeschlossen habe um die Stellung zu erfassen.

Der Antrieb steuert in mehreren Umdrehungen eine Klappe um jeweils 20cm auf/zu.

Damit ich die Klappe ordentlich ansprechen kann benötige ich die beiden Endwerte der Klappe, hierzu wird die Klappe auf eine definierte Stellung gefahren bis der Motorstrom zu hoch wird und der Drehgeberwert wird gespeichert. Am Ende sollen die beiden Drehgeber Werte in den Variablen stehen und die Klappe geöffnet sein.

Die Hardware funktioniert soweit. Motor lässt sich hin und her fahren mit dem entsprechenden H/L wechsel, der Strom wird richtig gemessen und auch der Drehgeber liefert seine Werte.

leider funktioniert es nicht, der Motor läuft nicht los und in den Variablen werden jeweils die Werte der derzeitigen Stellung gespeichert.

Hier der Sketch, was mach ich falsch?

char versionsText [] = "Version_1.0";  //für Ausgabe auf Display welche Version läuft

#include <LiquidCrystal_I2C.h>
#include <Wire.h>


LiquidCrystal_I2C lcd(0x27,20,4);  // setzen der LCD Adresse auf0x27, 20 Zeichen und 4 Zeilen


int klappenmotorSensor = 1;    // Motorstrom an Pin A1
int klappenStellungsensor = 2; // Klappenstellungs Sensor an PIN A2
int klappenSteuerung1 = 11;    // Pin 11 H und Pin 12 L dann Motor zu
int klappenSteuerung2 = 12;    // Pin 11 L und Pin 12 H dann Motor auf


int sensorStrom;               // Stromaufnahme Klappenmotor
int stellungKlappe_auf;        //Stellung der Klappe Wert
int stellungKlappe_zu;         //Stellung der Klappe Wert
float strom;		       // max. 3A	


void setup()
{
 pinMode(klappenSteuerung1, OUTPUT);
 pinMode(klappenSteuerung2, OUTPUT);

  
  
 // Motor steht
 digitalWrite (klappenSteuerung1, LOW);    		// beide je L Motor steht
 digitalWrite (klappenSteuerung2, LOW);   		// beide je L Motor steht
 
 // Variablen auf 0 setzen
 strom = 0;
 stellungKlappe_auf = 0;
 stellungKlappe_zu = 0;
 
 // Klappe zu fahren um den Start zu definieren, wenn schon zu dann Abschaltung ohne fahrt
 while (strom == 2.5)
 {   
   digitalWrite (klappenSteuerung1, LOW);
   digitalWrite (klappenSteuerung2, HIGH);
   sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
   strom =(sensorStrom / 100);
 }
   digitalWrite (klappenSteuerung2, LOW); // Motor stopp
   digitalWrite (klappenSteuerung1, LOW);// Motor stopp
   
 
 // Klappe auf und Wert für Klappensensor abfragen
 while (strom == 2.5)
 {   
   digitalWrite (klappenSteuerung1, HIGH);
   digitalWrite (klappenSteuerung2, LOW);
   sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
   strom =(sensorStrom / 100);
 }
   digitalWrite (klappenSteuerung2, LOW); // Motor stopp
   digitalWrite (klappenSteuerung1, LOW);// Motor stopp
   stellungKlappe_auf = analogRead(klappenStellungsensor); // einlesen Klappensensor Stellung auf
   
   
   
// Klappe zu und Wert für Klappensensor abfragen
 while (strom == 2.5)
 {   
   digitalWrite (klappenSteuerung1, LOW);
   digitalWrite (klappenSteuerung2, HIGH);
   sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
   strom =(sensorStrom / 100);
 }
   digitalWrite (klappenSteuerung2, LOW); // Motor stopp
   digitalWrite (klappenSteuerung1, LOW);// Motor stopp
   stellungKlappe_zu = analogRead(klappenStellungsensor); // einlesen Klappensensor Stellung zu
   
   
// Klappe wieder auf zum starten der Steuerung im Loop
while (stellungKlappe_auf == klappenStellungsensor)
  {
     digitalWrite (klappenSteuerung1, HIGH);
     digitalWrite (klappenSteuerung2, LOW);
     analogRead(klappenStellungsensor); // einlesen Klappensensor Stellung auf
     sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
     strom =(sensorStrom / 100);
     
     //Schutz falls der Geberwert nicht funktioniert erolgt hier eine Abschaltung 
     if (strom > 3.0)
       {
        digitalWrite (klappenSteuerung1, LOW);    		// beide je L Motor steht
        digitalWrite (klappenSteuerung2, LOW);   		// beide je L Motor steht
        break;                                              // Schleife verlassen
       }
  }
/////////////////   initialisieren serielle Schnittstelle auf 9600 Baud    /////////////////
Serial.begin(9600);
Serial.println(versionsText);

/////////////////   initialisiere lcd    /////////////////
lcd.init();                      
lcd.backlight();
lcd.clear();

lcd.setCursor(0, 0);
lcd.print(versionsText);


lcd.setCursor(0, 2);
lcd.print("Klappe auf ");
lcd.setCursor(11,2);
lcd.print(stellungKlappe_auf);

lcd.setCursor(0, 3);
lcd.print("Klappe zu ");
lcd.setCursor(11,3);
lcd.print(stellungKlappe_zu);

  
} //Setup Ende
  
void loop()
{
}

Du setzt die Variable auf
strom = 0;
und fragst dann

while (strom == 2.5)

du kommst doch nie in die Schleife da strom = 0 und nicht 2.5
und die variable wird außerhalb der Schleifen auch nicht geändert...

ja klar jetzt wo Du mich draufstubst
blöd :*
ich änder das gleich mal und melde mich

mmh Schade das wars leider nicht.....

die Variable strom kann doch den Wert 0 haben, auch denke ich erfolgt der Eintritt in die Schleife weil dieser Wert 0 ist die Änderung des Wertes erfolgt doch innerhalb der Schleife und wenn dann 2.5 erreicht ist erfolgt der Austritt?

nein dann bräuchtest du ne endgeprüfte schleife also

do{
}while(strom == 2.5)

dann wird die schleife mind. Einmal durchlaufen sonst nicht!

Edit: das wäre aber wenn du willst das die Schleife läuft solange strom = 2.5

so wie du es jetzt geschrieben hast willst du ja das es läuft solang strom nicht 2.5

also müstest du:

do{
}while(strom != 2.5)

wobei es dann egal ist dann geht auch

while(strom != 2.5){
}

schließlich haben wir ja 0 und kommen so oder so in die schleife

ich hab den Fehler gefunden

  1. wird wahrscheinlich der absolute Wert vom Strom von ==2.5 nicht getroffen deshalb habe ich die Abfrage auf <3.00 gesetzt
  2. ist der Anlaufstrom zu hoch wenn auch nur extrem kurz nur der Arduino ist schneller deshalb wurde vor der Stromabfrage ein delay(100)
    hinzugefügt
  3. nach jeder Schleife muß die Variable strom wieder auf 0 gesetzt werden sonst ist ja die Bedingung schon erfüllt

die LCD ausgaben dienten dem debuggen

jetzt funktioniert es einwandfrei und die beiden Variablen stehen im loop zu Verfügung, dank an die Helfer

Grüße
Jörg

hier der geänderte Sketch für alle Interessierten

char versionsText [] = "Version_1.1";  //für Ausgabe auf Display welche Version läuft

#include <LiquidCrystal_I2C.h>
#include <Wire.h>


LiquidCrystal_I2C lcd(0x27,20,4);  // setzen der LCD Adresse auf0x27, 20 Zeichen und 4 Zeilen


int klappenmotorSensor = 1;    // Motorstrom an Pin A1
int klappenStellungsensor = 2; // Klappenstellungs Sensor an PIN A2
int klappenSteuerung1 = 11;    // Pin 11 H und Pin 12 L dann Motor zu
int klappenSteuerung2 = 12;    // Pin 11 L und Pin 12 H dann Motor auf


int sensorStrom;               // Stromaufnahme Klappenmotor
int stellungKlappe_auf;        //Stellung der Klappe Wert
int stellungKlappe_zu;         //Stellung der Klappe Wert
float strom;		       // max. 3A	


void setup()
{
 /////////////////   initialisiere lcd    /////////////////
 lcd.init();                      
 lcd.backlight();
 lcd.clear();

 lcd.setCursor(0, 0);
 lcd.print(versionsText);
  
 pinMode(klappenSteuerung1, OUTPUT);
 pinMode(klappenSteuerung2, OUTPUT);

  
  
 // Motor steht
 digitalWrite (klappenSteuerung1, LOW);    		// beide je L Motor steht
 digitalWrite (klappenSteuerung2, LOW);   		// beide je L Motor steht
 
 // Variablen auf 0 setzen
 strom = 0;
 stellungKlappe_auf = 0;
 stellungKlappe_zu = 0;
 
 // Klappe zu fahren um den Start zu definieren, wenn schon zu dann Abschaltung ohne fahrt
 while (strom < 3.00)
{
   digitalWrite (klappenSteuerung1, LOW);
   digitalWrite (klappenSteuerung2, HIGH);
   delay(100);
   sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
   strom =(sensorStrom / 100);
   lcd.setCursor(0,1);
   lcd.print(strom);
 }
   digitalWrite (klappenSteuerung2, LOW); // Motor stopp
   digitalWrite (klappenSteuerung1, LOW);// Motor stopp
   strom = 0;
   
 
 // Klappe auf und Wert für Klappensensor abfragen
 while (strom < 3.00)
 {   
   digitalWrite (klappenSteuerung1, HIGH);
   digitalWrite (klappenSteuerung2, LOW);
   delay(100);
   sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
   strom =(sensorStrom / 100);
   lcd.setCursor(6,1);
   lcd.print(strom);
 }
   digitalWrite (klappenSteuerung2, LOW); // Motor stopp
   digitalWrite (klappenSteuerung1, LOW);// Motor stopp
   strom = 0;
   stellungKlappe_auf = analogRead(klappenStellungsensor); // einlesen Klappensensor Stellung auf
   
   
   
// Klappe zu und Wert für Klappensensor abfragen
 while (strom < 3.00)
 {   
   digitalWrite (klappenSteuerung1, LOW);
   digitalWrite (klappenSteuerung2, HIGH);
   delay(100);
   sensorStrom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
   strom =(sensorStrom / 100);
   lcd.setCursor(11,1);
   lcd.print(strom);
 }
   digitalWrite (klappenSteuerung2, LOW); // Motor stopp
   digitalWrite (klappenSteuerung1, LOW);// Motor stopp
   strom = 0;
   stellungKlappe_zu = analogRead(klappenStellungsensor); // einlesen Klappensensor Stellung zu
   
/////////////////   initialisieren serielle Schnittstelle auf 9600 Baud    /////////////////
Serial.begin(9600);
Serial.println(versionsText);




lcd.setCursor(0, 2);
lcd.print("Klappe auf ");
lcd.setCursor(11,2);
lcd.print(stellungKlappe_auf);

lcd.setCursor(0, 3);
lcd.print("Klappe zu ");
lcd.setCursor(11,3);
lcd.print(stellungKlappe_zu);

delay(10000);
} //Setup Ende
  
void loop()
{
}

Ich weiss nicht genau, wie und wo du den Strommesswiderstand auswertest, aber wenn der Motor vorwärts oder rückwärts läuft, änder sich auch die Stromrichtung im Motor.
Das könnte sogar negative Werte am Shunt ergeben, was der Analogeingang nicht mag.

Einzig richtiger Platz für den Shunt wäre vor der H-Brücke.
Das weisst du bestimmt selbst, ich schreibs nur mal für alle 'Nachbauer' :wink:
Olaf

ok genau

das Datenblatt ist hier:

auf Seite 7 ist die von mir Verwendete Schaltung um den Strom des 12V Motors zu leisten. Der Wiederstand ist an PIN 15 und Pin 1. Ich habe 0,5 Ohm genommen damit fallen 1V über dem Wiederstand ab und zwar imm gleichgepolt. Wenn der Motor an seine Endlagen kommt läuft der "schwerer",theoretisch bis Stillstand was Kurzschluß bedeuten würde. Beim "schwerer Laufen" benötigt der Motor mehr Strom was zu einer Spannungsverschiebung im Teiler führt. Diese Verschiebung habe ich auf den Arduino gelegt und die Digits mit einem Ampere Meter verglichen um auf die Werte zu kommen.
Natürlich muß der Wiederstand auch die Amperzahlen des Motors können bzw mehr. Ich habe hier 2x 1 Ohm 20W parallel geschalten.

Wie gesagt die Schaltung funktioniert bisher sehr zuverlässig, ich hatte in dem oben genannten Problem nur den Anlaufstrom der zwar sehr kurz ist aber eben vom Arduino erkannt wir vernachlässigt und mit delay die Messung verzögert.

Im Loop wird dann vom gemessenen Wert des Drehgebers noch 10 abgezogen und dieser Wert zur Abschaltung verwendet und die Strom erfassung nur als 2. Nothalt. Zum Schutz des ganzen ist noch eine 6A Sicherung in Reihe der Gesamtschaltung an Pin 4.

Grüße
Jörg

o_lampe:
Ich weiss nicht genau, wie und wo du den Strommesswiderstand auswertest, aber wenn der Motor vorwärts oder rückwärts läuft, änder sich auch die Stromrichtung im Motor.
Das könnte sogar negative Werte am Shunt ergeben, was der Analogeingang nicht mag.

Einzig richtiger Platz für den Shunt wäre vor der H-Brücke.
Das weisst du bestimmt selbst, ich schreibs nur mal für alle 'Nachbauer' :wink:
Olaf

Der L298 hat den negativen Pol der H- Brücke herausgeführt (pin 1 für die erste H-Brücke und pin 15 für die zweite H-Brücke) und kann zur Strommessung über je einen Widerstand pro H-Brücke auf Masse gelegt werden. So erhält man eine massebezogene Spannung die proportional zum Strom ist.
Die Stromrichtung am Strommeßwiderstand ändert sich nicht.
Grüße Uwe