Brushless Antrieb klemmt nach längerer Standzeit bzw. Mähmotor läuft nicht immer an

Ich warte und hoffe, dass es zeitnah für alle Betroffenen die versprochenen neuen BL Treiber zu einer guten Kondition gibt...
 
Schau Dir mal hier die Beiträge zu den BL Treibern ZS-X11D1 an. Diejenigen, die umgestiegen sind, sind begeistert.
Ich selbst bin bisher nur beim Mähmotor umgestiegen und kann den Treiber zumindest für den Mähmotor auch nur wärmstens empfehlen.
Ob und wann der neue Treiber im Shop kommt, steht in den Sternen. Mit besonders guten Konditionen rechne ich nicht. Und ob dieser dann wirklich einwandfrei funktioniert oder das nächste Fass aufgemacht wird, muss sich dann auch erst beweisen.
Wie gesagt: Der Umstieg meines erst Treibers war ein voller Erfolg. Und das Best an diesen Treibern: Die funktionieren auch ohne Ansteuerung über einen Mikroprozessor. Man kann diese also einfach testen mit einem Labornetzteil, dem Treiber und einem angeschlossenen Motor. Etwas was mir damals bei der Erstinbetriebnahme des Mähers völlig gefehlt/missfallen hatte.
 
Könnte es sein, dass das Klemmen der Motoren auch mit dieser Geschichte zu tun hat? Betrifft das nur User mit dem Ardafruit M4 oder auch mit dem Due?
#define SUPER_SPIKE_ELIMINATOR 1 // advanced spike elimination (experimental, comment out to disable)
or remove the timeout part.
 
Die Motoren klemmen nicht. Der Treiberchip kommt in einen nicht definierten Zustand wo die Hall Sensoren entweder alle 0 sind oder 1. Das ist lediglich in Konfiguration des Chips vorgesehen. Bewegen des Rotors löst diesen Zustand wieder. Die Hallsensoren müssten immer 001, 010 oder 100 haben. Ein reset bringt nix, stromlos machen schon. Es ist glaube ein Problem der entwickelten Platine oder der Treiber sleepfunktion.
 
Ein Relais am Hall das kurz irgendwo eine 1 oder 0 simuliert zum anlaufen würde auch gehen, oder den Chip umprogrammieren und es Software mässig lösen ginge auch, oder halt über Relais stromlos machen. Wenn man im Englisch sprachigen Raum sucht, findet man einen Beitrag der genau auf unser Problem zutrifft. Da war es irgendein Gebläse mit diesem Chip und einen Treiber von dem Hersteller des Geräts. Gelöst wurde das, indem die Software einen Hall Eingang im Falle des anlaufens kurz negiert hat.
 
Schau Dir mal hier die Beiträge zu den BL Treibern ZS-X11D1 an. Diejenigen, die umgestiegen sind, sind begeistert.
Ich selbst bin bisher nur beim Mähmotor umgestiegen und kann den Treiber zumindest für den Mähmotor auch nur wärmstens empfehlen.
Ob und wann der neue Treiber im Shop kommt, steht in den Sternen. Mit besonders guten Konditionen rechne ich nicht. Und ob dieser dann wirklich einwandfrei funktioniert oder das nächste Fass aufgemacht wird, muss sich dann auch erst beweisen.
Wie gesagt: Der Umstieg meines erst Treibers war ein voller Erfolg. Und das Best an diesen Treibern: Die funktionieren auch ohne Ansteuerung über einen Mikroprozessor. Man kann diese also einfach testen mit einem Labornetzteil, dem Treiber und einem angeschlossenen Motor. Etwas was mir damals bei der Erstinbetriebnahme des Mähers völlig gefehlt/missfallen hatte.
Hat dieser Treiber eine Strombegrenzung?
Bei dem JYQD ergärt mich das auch... Das er nicht begrenzt. Hab mittlerweile eine 7.5 A Sicherung dazwischen. Er wird in der Drehzahl kaum langsamer, und die Motorbremse kann man auch nicht benutzen weil er alles gibt was geht um zu bremsen? Hatte es garnicht Versuch... Will keine 10A oder mehr über das Board schicken .. eigentlich nicht mal 5A, lieber soll die Drehzahl zusammenbrechen und er setzt dadurch zurück oder wird entsprechend langsamer. Das hatte mit dem DRV gut geklappt.
 
Meine Versuche mit dem JYQD als Treiber waren nicht so toll. Das Fahrverhalten war zumindest am Berg sehr "hakelig". Also bin ich wieder zurück zu dem Orginaltreibern.
Mein Gedanke ist die Verwendung eines 2fach 5V Relais, das beim Wechsel von Docked auf Mow kurz die Versorgung zu den Treibern trennt und dann wider verbindet.
Verwenden wollte ich dazu den UserSwitch P40.

Wo im Programmablauf würde man idealerweise eingreifen? In MowOp.cpp?

Viele Grüße,
Jürgen
 
Svolo hatte da schon mal eine lösung, du musst den ganzen Treiber stromlos machen. Es gibt irgendwo einen langen Thread wo er das beschrieben hatte. Ich würde das im opDock bzw. undock einbauen. Möglicherweise auch in die map.cpp oder direkt in die Robot.cpp. Ein anderer workaround wäre ein schalter über die GPS Zeit. Immer bei voller Stunde den retouch charger verwenden, also die Funktion nutzen das er 2 cm zurückfährt und wieder vor, wenn die Treiber nämlich regelmäßig bewegt werden, kommt der Fehler glaube nie zustande.
 
Hi,
ja, ich kenne den Thread und die Analyse ist ja auch richtig. Leider ist die Zeit bis der Fehler eintritt ziemlich unbestimmt. Da kann eine Stunde schon zu lang sein.
Andererseits hieße das 0 Umbau im Mower. Hmmm eigentlich sympatisch. Ich glaub, das probier ich mal.
In welcher Datei wird der retouch charger getriggert?

Viele Grüße,
Jürgen
 
Wenn du dir die ChargeOp ansiehst im src ordner.. kommst du über die Suche von den einzelnen Funktionen an einige Codestellen im sunray. Aber ich denke an dieser Stelle im ChargeOp wäre es mit wenig aufwand zu lösen:

void ChargeOp::run(){

if ((retryTouchDock) || (betterTouchDock)){
if (millis() > retryTouchDockSpeedTime){
retryTouchDockSpeedTime = millis() + 1000;
motor.enableTractionMotors(true); // allow traction motors to operate
motor.setLinearAngularSpeed(0.05, 0);
}
if (retryTouchDock){
if (millis() > retryTouchDockStopTime) {
motor.setLinearAngularSpeed(0, 0);
retryTouchDock = false;
CONSOLE.println("ChargeOp: retryTouchDock failed");
motor.enableTractionMotors(true); // allow traction motors to operate
maps.setIsDocked(false);
changeOp(idleOp);
}
} else if (betterTouchDock){
if (millis() > betterTouchDockStopTime) {
CONSOLE.println("ChargeOp: betterTouchDock completed");
motor.setLinearAngularSpeed(0, 0);
betterTouchDock = false;
}
}
}


Wenn hier ein neues if konstrukt alá charger reconnect mit einem reverse und rereverse nach gps zeit eingefügt wird... also jede stunde für eine sekunde rückwärts mit 0.05 und dann vorwärts bis chargerconnected true sollte es funktionieren? Falls du erfolg hast würde ich das dann gerne in meine modfunktion einbauen... nice wäre es wenn du das ganze if konstrukt gleich mit config.h define aktivier bzw. deaktivierbar machst. Zb. #define CHARGERRECONNECT true und dann noch #define RECONNECTPERIOD oder so ....

Man kann natürlich auch die normale millis() funktion nehmen, geht genauso und lääst sich besser einstellen. Im begin würde ich einen bool und long unsigned float für die initiale chargerconnected true zeit anlegen, der bool wird dann immer true nach ablauf eines einstellbaren timers im run segment. wenn dann die if funktion triggert wird der bool resettet und der timer bei erfolgreichem chargerconnected true aktualisiert. Der bool wäre dann sowas wie reconnectDock. Am ende mit dem reset vom bool und dem aktualisieren des Timers dann noch einen Consolenoutput im programmierstil.

Den bool könnte man wahrscheinlich weglassen, der ist aber hilfreich um die if funktion aktiviert zu lassen, bis das rückwärts... vorwärts bis charger connected true wieder eintritt um dann alles zu resetten.
 
Zuletzt bearbeitet:
Hi,

eins hab ich noch nicht verstanden:
Wenn onBadChargingContactDetected, dann wird betterTouchDock = true;
In ChargeOp::run() wird dann eine Zeit lang motor.setLinearAngularSpeed(0.05, 0);
->Der Mower bewegt sich. Langsam.
Nach betterTouchDockStopTime wird motor.setLinearAngularSpeed(0, 0);
-> Der Mower steht wieder

Sollte er nicht hin und her fahren, oder bedeutet onBadChargingContactDetected er hat sich aus dem Charger herausbewegt, muss also nur wieder hinein gefahren werden?
Falls ja, in diesem unseren Fall müsste man erst kurz herausfahren, wäre das motor.setLinearAngularSpeed(-0.05, 0); oder so was wie motor.setLinearAngularSpeed(0.05, 180);?

Danke für Deinen Input!

Viele Grüße, Jürgen
 
Ja das muss neu programmiert werden, ein neues if konstrukt beim bestehenden code mit rein. Der better touchdock ist halt die better touchdock funktion und nicht die noch nicht existente chargerreconnect funktion die du bauen willst ;)
zurück ist minus, richtig. angular brauchst du nicht! immer 0 lassen! Sonst dreht er sich ja, und mit dem wert 180 würde der mower zum hubschrauber :D
 
Hi,

ich hab jetzt mal folgendes geschrieben:

C:
void ChargeOp::run(){

    if (MOVE_REGULARLY){

        if (millis() > nextMoveTime){

            movingTime= 200;

            nextMoveTime = millis() + MOVE_AGAIN_AFTER * 60 * 1000;

            motor.enableTractionMotors(true); // allow traction motors to operate                               

            motor.setLinearAngularSpeed(-0.05, 0); //move out of docking station

            CONSOLE.println("------->Mower moved backwards");

            delay(movingTime);

            motor.setLinearAngularSpeed(0,0, false);

            motor.setLinearAngularSpeed(0.05, 0); //move in docking station again

            CONSOLE.println("------->Mower moved forward");            delay(movingTime);

            motor.setLinearAngularSpeed(0,0, false);

            motor.setMowState(false);     

            motor.enableTractionMotors(false); // keep traction motors off (motor drivers tend to generate some incorrect encoder values when stopped while not turning)                 



        }

    }



Da wird auch reingesprungen, ich sehe meinen Output in der Konsole:

Code:
==> changeOp:Charge(initiatedByOperator 0)

OP_CHARGE dockOp.initiatedByOperator=1 dockReasonRainTriggered=0

------->Docking started: 715961

enableCharging 1

dumpState:  X=-21.77 Y=-0.40 delta=-0.52 mapCRC=-281255 mowPointsIdx=0 dockPointsIdx=4 freePointsIdx=4 wayMode=2 op=2 sensor=0 sonar.enabled=0 fixTimeout=0 absolutePosSource=1 lon=8.74 lat=47.87 pwmMaxMow=150 finishAndRestart=0 motorMowForwardSet=1

save state... ERROR opening file for writing

Info - LoopTime: 3 - 2 - 2.89 - 10ms

0:11:0 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.70,0.000(0.49) chg=27.81,0(1.57) diff=1.548 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397234000 lon=8.73907185 lat=47.86839815 h=630.6 n=-8.69 e=-16.49 d=4.42 sol=2 age=0.91

0:11:5 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.82,0.005(0.47) chg=27.51,0(2.02) diff=1.036 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397239000 lon=8.73907161 lat=47.86839811 h=630.6 n=-8.70 e=-16.49 d=4.43 sol=2 age=0.80

batTemp=998  cpuTemp=43

WARN: PID unmet cycle time Ta=0.14 TaMax=0.10

WARN: PID unmet cycle time Ta=0.14 TaMax=0.10

GPS time (UTC): dayOfWeek=thu  hour=14

AUTOSTOP: timetable is disabled

AUTOSTART: not defined DOCK_AUTO_START

Info - LoopTime: 3 - 2 - 3.52 - 105ms

0:11:10 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20000094 bat=26.83,0.005(0.45) chg=27.54,0(2.01) diff=0.828 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397244000 lon=8.73907185 lat=47.86839815 h=630.6 n=-8.69 e=-16.49 d=4.42 sol=2 age=0.99

0:11:15 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.84,0.005(0.44) chg=27.53,0(2.00) diff=0.749 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397249000 lon=8.73907162 lat=47.86839813 h=630.5 n=-8.70 e=-16.49 d=4.43 sol=2 age=0.98

Info - LoopTime: 3 - 2 - 2.90 - 12ms

0:11:20 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20000094 bat=26.84,0.005(0.43) chg=27.53,0(1.93) diff=0.713 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397254000 lon=8.73907191 lat=47.86839810 h=630.6 n=-8.70 e=-16.49 d=4.43 sol=2 age=0.95

0:11:25 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.85,0.005(0.43) chg=27.54,0(1.92) diff=0.700 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397259000 lon=8.73907160 lat=47.86839815 h=630.6 n=-8.69 e=-16.49 d=4.43 sol=2 age=1.86

Info - LoopTime: 3 - 2 - 2.89 - 9ms

0:11:30 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.86,0.005(0.43) chg=27.54,0(1.91) diff=0.686 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397264000 lon=8.73907191 lat=47.86839841 h=630.6 n=-8.69 e=-16.49 d=4.43 sol=2 age=0.95

0:11:35 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.80,0.005(0.43) chg=27.43,0(1.47) diff=0.664 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397269000 lon=8.73907171 lat=47.86839811 h=630.6 n=-8.70 e=-16.48 d=4.43 sol=2 age=0.01

GPS time (UTC): dayOfWeek=thu  hour=14

AUTOSTOP: timetable is disabled

AUTOSTART: not defined DOCK_AUTO_START

Info - LoopTime: 3 - 2 - 2.90 - 9ms

0:11:40 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20000094 bat=26.81,0.005(0.44) chg=27.44,0(1.57) diff=0.649 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397274000 lon=8.73907191 lat=47.86839812 h=630.6 n=-8.70 e=-16.49 d=4.42 sol=2 age=1.91

0:11:45 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.82,0.005(0.44) chg=27.46,0(1.57) diff=0.641 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397279000 lon=8.73907164 lat=47.86839811 h=630.6 n=-8.70 e=-16.49 d=4.42 sol=2 age=1.92

Info - LoopTime: 3 - 2 - 2.90 - 11ms

0:11:50 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.83,0.005(0.44) chg=27.48,0(1.62) diff=0.648 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397284000 lon=8.73907192 lat=47.86839834 h=630.6 n=-8.70 e=-16.49 d=4.42 sol=2 age=0.85

0:11:55 ctlDur=0.02 op=Charge(initiatedByOperator 0) freem=216859 sp=20001874 bat=26.82,0.005(0.44) chg=27.45,0(1.53) diff=0.644 tg=-22.21,-0.15 x=-21.77 y=-0.40 delta=-0.52 tow=397289000 lon=8.73907162 lat=47.86839835 h=630.6 n=-8.70 e=-16.49 d=4.43 sol=2 age=0.90

------->Mower moved backwards

------->Mower moved forward

traction motors disabled

WARN: PID unmet cycle time Ta=0.44 TaMax=0.10

WARN: PID unmet cycle time Ta=0.44 TaMax=0.10



Es bewegt sich aber leider nix. Irgendwo hab ich noch einen Denkfehler.



Viele Grüße,

Jürgen
 
Du kannst nicht das delay verwenden. Das hält den Code an. Das siehst du auch, weil die pid Controller danach meckern das sie ihre cycletime überschritten haben.
 
Ich denke, Was bei dir passiert ist, er fährt durch den Code... setzt die variable in Motor. ... hält den Code an .. setzt eine andere geschw. In Motor.... wartet wieder.. und setzt dann eine null. Der Code im motor.cpp kommt garnicht dazu, weiter ausgeführt zu werden. Vllt irre ich mich aber auch.
 
Hi,

ich dachte, ich mach's mit mit der Verwendung von delay einfacher.

Was mir inzwischen aufgefallen ist:
Die Konsole schreibt gegen Ende "traction motors disabled". Das kommt aus der motor.cpp
Warum kommt aber kein "traction motors enabled" aus der motor.cpp, als ich zu Beginn
Code:
motor.enableTractionMotors(true); // allow traction motors to operate
setze??

Wie würdest Du delay vermeiden? Den Cycle laufen lassen (dauert bei mir so um die 10 ms) und messen bis die gewünschte Bewegungszeit um ist (millis() > millis() + movetime) und dann die Bewegung stoppen?

Viele Grüße,
Jürgen
 
Ich glaube das enable ist nicht in der Konsole?
Bin mir nicht sicher. Ich habe mich auch an einen Versuch gemacht. Das ist in der modding Spielwiese. Da hab ich es direkt in Motor cpp geschrieben, dort wird aber nur ein kleiner pwm Wert geschrieben für ein paar iterationen.. bisher nicht getestet.
 
Hi,
die Unterfunktion in motor.cpp ist recht kurz:
Code:
void Motor::enableTractionMotors(bool enable){
  if (enable == tractionMotorsEnabled) return;
  if (enable)
    CONSOLE.println("traction motors enabled");
  else
    CONSOLE.println("traction motors disabled");
  tractionMotorsEnabled = enable;
}
Deswegen versteh ich nicht, warum das "traction motors enabled" nicht geworfen wird.
Und wenn die Motoren nicht enabled sind, ist auch nicht verwunderlich, dass nix dreht.
Ich versuch trotzdem mal, auf das delay zu verzichten.

Viele Grüße,
Juergen
 
Nun, dann sind die tractionmotors nicht abgeschaltet gewesen, und das Return am Anfang greift. Deshalb keine änderung und keine Ausgabe.
 
Das wird auch so sein, denn wenn er bei mir im Dock steht .. dann ziehe ich ihn da nur mit widerstand von den Motoren raus. Die sind dann also noch an. Vllt sollten wir auch mal ein disable probieren, im Dock... das könnte vllt gegenüber unserem Problem auch eine Änderung bringen?
 
Oben