Problem mit Motor und L6203

Hallo zusammen,

ich bastel immernoch an einer Truhensteuerung herum, zu der ich bereits mal eine Frage beantwortet bekam.
Tatsächlich hat alles prima funktioniert, bis sich auf einmal nichts mehr tat. Der Arduino war tatsächlich kaputt, ich schloss (auch wegen Hinweis von Uwe auf den Anlaufstrom) dass die L293 nicht stark genug für den Motor war.
Der Strom bei blockiertem Motor war schwer zu messen, da das Netzteil wohl immer wieder abschaltet bei direktem Dranhalten, doch alle Werte auf meinem Multimeter blieben knapp unter 1A.

Also hab ich mir die L6203 besorgt, wie im Datenblatt angeschlossen, aber leider funktioniert das Ganze nicht.
Ich habe dann die Outputs der L6203 auf LEDs gelegt (gelb), genauso wie das Signal am EnablePin (grün) und siehe da: Mit “fiktiv” angeschlossenem Motor über die LEDs funktioniert es wie es soll.
Sobald ich den Motor dazu anschließe aber nicht.

Ich hab mir echt schon lange den Kopf zerbrochen, im Internet gesucht, rumprobiert, aber ich finde den Fehler einfach nicht!
Auf youtube hab ich mal ein Video hochgeladen mit dem aktuellen Stand: https://youtu.be/3bXiYZTVSPM
Und ein Videoschnipsel den ich gemacht hatte, als es mit der L293 noch lief: https://youtu.be/YNquV1C7GfA

Die Funktion generell: Schalter wird umgelegt, fahren zur oberen ersten Magnetschranke, Gegenstromimpuls (als Bremse) und per PWM langsam zum Endpunkt, dort wieder kurzer Gegenimpuls. Zurückzu äquivalent.
Beim aktuellen Stand nur mit LEDs kann man dass alles schön nachvollziehen. Mit Motor sind dann beide Outputs dauerhaft auf an, die PWM Regelung funktioniert aber.

Für Hilfe bin ich echt super dankbar!
Den Schaltplan hab ich auch gezeichnet (Ich hoffe ihr könnt das lesen, ist ein bisschen klein. Wenns nicht geht lade ich noch ein Vergrößerung eines gewünschten Bereichs hoch) und das Programm häng ich auch an.

Liebe Grüße
Marlin

Code:

#include <Servo.h>
Servo Motor;
const int MagnetSensor_1 = 6;
const int MagnetSensor_2 = 9;
const int MagnetSensor_3 = 8;
const int MagnetSensor_4 = 7;
int Magnetstellung_1;
int Magnetstellung_2;
int Magnetstellung_3;
int Magnetstellung_4;
int Magnetstellung_1_alt;
int Magnetstellung_2_alt;
int Magnetstellung_3_alt;
int Magnetstellung_4_alt;
const int Schalter = 2;
int Schalterstellung;
int Schalterstellung_alt;
const int Drehrichtung_1 = 4;
const int Drehrichtung_2 = 5;
const int MotorEnable = 11;
int MotorSpeed;
int MotorSpeedBrems;
int Gegenstrom;
int Gegenstromdauer;
int Gegenstromdauer_halt;

void setup() {
  Serial.begin(9600);
  for(int PinNum = 0; PinNum < 14; PinNum++){
  pinMode(PinNum,OUTPUT);
  digitalWrite(PinNum,LOW);
  }

  Motor.attach(3);
  pinMode(MagnetSensor_1,INPUT);
  pinMode(MagnetSensor_2,INPUT);
  pinMode(MagnetSensor_3,INPUT);
  pinMode(MagnetSensor_4,INPUT);
  pinMode(Schalter,INPUT);
  Motor.write(0);
  MotorSpeed = 254; //PWM Wert
  MotorSpeedBrems = 80; //PWM Wert
  Gegenstrom = 30; //PWM Wert
  Gegenstromdauer = 200; //Mills
  Gegenstromdauer_halt = 100; //Mills
}

void loop() {
  /*
  Serial.print("Schalterstellung: ");
  Serial.print(Schalterstellung);
  Serial.print("     Magnetstellung_1: ");
  Serial.print(Magnetstellung_1);
  Serial.print("     Magnetstellung_2: ");
  Serial.print(Magnetstellung_2);
  Serial.print("     Magnetstellung_3: ");
  Serial.print(Magnetstellung_3);
  Serial.print("     Magnetstellung_4: ");
  Serial.println(Magnetstellung_4);
  */
  Schalterstellung = digitalRead(Schalter);
  Magnetstellung_1 = digitalRead(MagnetSensor_1);
  Magnetstellung_2 = digitalRead(MagnetSensor_2);
  Magnetstellung_3 = digitalRead(MagnetSensor_3);
  Magnetstellung_4 = digitalRead(MagnetSensor_4);
  
  //Hochfahrstart
  if(Schalterstellung != Schalterstellung_alt && Schalterstellung == HIGH){
    digitalWrite(Drehrichtung_1,HIGH);
    digitalWrite(Drehrichtung_2,LOW);
    analogWrite(MotorEnable,MotorSpeed);
  }
  //Bremsen in oberer Position
  if(Schalterstellung == HIGH && Magnetstellung_3 == HIGH && Magnetstellung_3 != Magnetstellung_3_alt){
    analogWrite(MotorEnable,Gegenstrom); //Gegenstrombremsen
    digitalWrite(Drehrichtung_1,LOW);
    digitalWrite(Drehrichtung_2,HIGH);
    delay(Gegenstromdauer);
    analogWrite(MotorEnable,MotorSpeedBrems);//Schleichfahrt
    digitalWrite(Drehrichtung_1,HIGH);
    digitalWrite(Drehrichtung_2,LOW);
  }
  //Oberer Stop
  if(Magnetstellung_4 == HIGH && Schalterstellung == HIGH){
    if(Magnetstellung_4 != Magnetstellung_4_alt){
      Motor.write(90);
      analogWrite(MotorEnable,Gegenstrom);//Gegenstrombremsen
      digitalWrite(Drehrichtung_1,LOW);
      digitalWrite(Drehrichtung_2,HIGH);
      delay(Gegenstromdauer_halt);
    }
    digitalWrite(MotorEnable,LOW);//Stehen
    digitalWrite(Drehrichtung_1,LOW);
    digitalWrite(Drehrichtung_2,LOW);
  }
  //Runterfahrstart
  if(Schalterstellung != Schalterstellung_alt && Schalterstellung == LOW){
    if(Magnetstellung_4 == HIGH){
      digitalWrite(Drehrichtung_1,HIGH);//Haltemoment vergrößern
      digitalWrite(Drehrichtung_2,HIGH);
      digitalWrite(MotorEnable,HIGH);
      Motor.write(0);
      delay(350); 
    }
    analogWrite(MotorEnable,MotorSpeed);
    digitalWrite(Drehrichtung_1,LOW);
    digitalWrite(Drehrichtung_2,HIGH);
  }
    //Bremsen in unterer Position
  if(Schalterstellung == LOW && Magnetstellung_2 == HIGH && Magnetstellung_2 != Magnetstellung_2_alt){
    analogWrite(MotorEnable,Gegenstrom);//Gegenstrombremsen
    digitalWrite(Drehrichtung_1,HIGH);
    digitalWrite(Drehrichtung_2,LOW);
    delay(Gegenstromdauer);
    analogWrite(MotorEnable,MotorSpeedBrems);//Schleichfahrt
    digitalWrite(Drehrichtung_1,LOW);
    digitalWrite(Drehrichtung_2,HIGH);
  }
  //Unterer Stop
  if(Magnetstellung_1 == HIGH && Schalterstellung == LOW){
    if(Magnetstellung_1 != Magnetstellung_1_alt){
      analogWrite(MotorEnable,Gegenstrom);//Gegenstrombremsen
      digitalWrite(Drehrichtung_1,HIGH);
      digitalWrite(Drehrichtung_2,LOW);
      delay(Gegenstromdauer_halt);
    }
    digitalWrite(MotorEnable,LOW);//Stehen
    digitalWrite(Drehrichtung_1,LOW);
    digitalWrite(Drehrichtung_2,LOW);
  }
  Schalterstellung_alt = Schalterstellung;
  Magnetstellung_1_alt = Magnetstellung_1;
  Magnetstellung_2_alt = Magnetstellung_2;
  Magnetstellung_3_alt = Magnetstellung_3;
  Magnetstellung_4_alt = Magnetstellung_4;
}

"geht nicht" ist nicht sehr hilfreich, was genau passiert dann?

Welches Gehäuse hat der Treiber? Mir fehlt ein zweiter Gnd Anschluß bzw. Sense Widerstand am Treiber.

Hi,

geht nicht bedeutet der Motor läuft nicht. Die LEDs machen deutlich warum: Beide Outputs liefern 12V, sobald einer geschaltet wird. Das ist sehr merkwürdig, da -wenn ich den Motor trenne und die Outputs weiter über die LEDs ausgebe- korrekt geschaltet wird. Korrekt bedeutet: Einer HIGH, der andere LOW. In dem Video das ich hochgeladen habe (der Link ist im ersten Post) kann man dass gut sehen.

Das Gehäuse ist das Multiwatt-11. Hier der Link zum Produkt: L 6203: DMOS-Vollbrückentreiber, 12 - 48V, 60V - 4A, Multiwatt-11 bei reichelt elektronik

Zum Sense Widerstand: Ich dachte der wäre dafür da wenn ich den Strom steuern will? In der Beispielschaltung vom Datenblatt ist ein Sense Widerstand in Kombination mit dem IC "L6506" zu sehen, aber ich steuere ja direkt vom Arduino an ohne dass ich den Strom steuern will, von daher schloss ich dass ich diesen nicht bräuchte.

Falls er doch nötig ist, wie schließe ich ihn dann an?

Alle anderen Pins die direkt oder über Kondensator sowie Diode auf GND gehen, habe ich auf GND gelegt.

Der gesamte Motorstrom fließt über den Sense-Pin nach Masse - man muß ihn nur fließen lassen! Fehlt diese Verbindung, dann können die Ausgänge nur nach + durchschalten, und weil der Motor einen kleinen Widerstand hat, liegt dann an beiden Polen + an. Bei den LED merkt man das nicht, weil immer nur eine nach + durchgeschaltet wird, und Du die Kathode vermutlich an Gnd gelegt hast.

Will man den Strom nicht messen, den Sense Pin einfach auf Gnd legen. Andernfalls einen passenden Widerstand (<= 1 Ohm) nach Gnd schalten, an dem sich der Motorstrom messen läßt (I=U/R).

Genial, 1000 Dank! Diese eine Verbindung hat mich locker >10h Zeit gekostet, aber so ist das wohl am Anfang.

Beim Durchmessen vorhin hab ich den Treiber leider versehentlich kurzgeschlossen sodass nur noch ein Output schaltet, aber in diese Richtung dreht sich endlich der Motor! Ich bin guter Dinge wenn der neue Treiber da ist, dass es auch in die andere funktioniert...

Also echt nochmal ein dickes Dankeschön! :slight_smile:

Wenn Dir jemand weitergeholfen hat, dann darfst Du ihm auch einen Karma-Punkt spendieren, das kommt immer gut an :slight_smile:

Top, hast du bekommen, wusste ich einfach nicht thumbs up

Kurzes Update: ES FUNKTIOIERT!

Tatsächlich funktioniert auch noch der totgeglaubte Treiber!

Hab mir nicht nur einen neuen Treiber, sondern auch ein Labornetzgerät besorgt, damit konnte ich interessante Dinge beobachten. Die Lösung des zweiten Problems, nach der Verbindung von sense mit gnd ist schon eher peinlich: Das Netzteil war einfach zu schwach...

Ich dachte ich schreibs nochmal hin, falls jemand anderes mal ein ähnliches Problem hat.

Schalgwörter wären: 12V DC Motor; H Brücke; schaltet nicht korrekt / spinnt; nur ein Ausgang; nur in eine Richtung;