Stallguard Headaches & Multiple Shorts to Vin
-
First, my Duet 3 Mini 5+ has lost two of its 2209 drivers to shorts, and I cannot identify the cause. I'm reliably getting "Phase A/B short to VIN" and unresponsive behaviors from drivers 0 and 3. I have ordered a replacement board, but I'm afraid I will ruin another driver or that the drivers were faulty.
The culprit printer is a Cartesian machine using a meanwell 24V supply (23.5V). Pictures of the wiring and the printer are attached. The motors are as follows:
X axis: Moons MS17HA2P4100 (11.2mH inductance: set to 800mA, rated for 1A)
Y axis: StepperOnline 17HS19-2004S1 (3mH inductance: set to 1200mA, rated for 2A) <axis that is shorting
Z axis: Moons unlabeled (integrated leadscrew motor from ~2014) (~9mH inductance: set to 600mA, don't know rating)
E axis: Revo Hemera XS (pancake motor I'm assuming from LDO) (? inductance: set to 500mA, don't know rating)I printed for a while with zero issues using spreadcycle (was noisy) and stealthchop (was quietish). In the process of setting up sensorless homing/tuning stealthchop and stallguard, I shorted the first driver (3; Y axis). I don't know how I did it, but here is the gcode (y axis homing) that ran immediately before that short:
G91 ; relative motion ; Stealthchop Tuning M18 Y ;y off M569 P0.3 S1 D2 ;> spreadcycle G4 P200 ;wait M569 P0.3 S1 D3 V0 ;> stealthchop M400 ; (clear) M913 Y100 ;> full current M17 Y ;y on G4 P200 ;wait to allow driver to initialize parameters ; G1 H2 Y-0.1 F1000 ;tiny move w report G4 P200 ;wait 200ms (>140ms) G1 H2 Y-18 F4800 ;medium velocity move to y-18 w report G4 P200 ;wait ; Homing M400 M913 Y50 ;lower current to y M201 Y500 ;lower acceleration M566 Y60 ;lower jerk M915 Y S-10 F0 H200 R2 ;set high sensitivity ; G4 P200 ;wait G1 H1 Y180 F5000 ;move to Y axis endstop w report G92 Y170 ;set coordinate to Y max M400 G90 ;absolute motion G1 H2 Y165 F1200 ;move away from max to allow X movements ; Restore Settings M400 M913 Y100 ;% current M201 Y9000 ;acceleration M566 Y900 ;jerk M915 Y S10 F1 H400 R0 ;set sensitivity & disable reports
Here is the relevant bit of my config file for motors and such:
; Drives M569 P0.2 S0 D3 V0 ; physical drive 0.2 goes forwards M569 P0.3 S1 D3 V0 ; physical drive 0.0 goes backwards M569 P0.4 S0 F12 Y5:0 D3 V80 ; physical drive 0.4 goes forwards M569 P0.1 S0 ; physical drive 0.1 goes forwards M584 X0.2 Y0.3 Z0.4 E0.1 ; set drive mapping M350 X16 Y16 Z16 E16 I1 ; configure microstepping with interpolation M92 X177.78 Y177.78 Z400.00 E397 ; set steps per mm M566 X900.00 Y900.00 Z1200.00 E120.00 ; set maximum instantaneous speed changes (mm/min) M203 X19200.00 Y19200.00 Z2400.00 E2400.00 ; set maximum speeds (mm/min) M201 X9000.00 Y9000.00 Z2400.00 E250.00 ; set accelerations (mm/s^2) M906 X800 Y1200 Z600 E500 I10 ; set motor currents (mA) and motor idle factor in per cent M84 S1 ; Set idle timeout ; Axis Limits M208 X0 Y0 Z-3.5 S1 ; set axis minima M208 X301 Y171 Z180 S0 ; set axis maxima ; Endstops M574 X2 S3 ; configure sensorless endstop for high end on X M574 Y2 S3 ; configure sensorless endstop for high end on Y M574 Z1 S3 ; configure sensorless endstop for low end on Z M915 X S3 F1 H400 R2 ;set sensitivity M915 Y S10 F1 H400 R2 ;set sensitivity M915 Z S3 F1 H400 R2 ;set sensitivity
After I started getting the "Phase B short to Vin" warning, I suspected the motor and immediately ordered a replacement motor. After getting the replacement, I set up the Y axis on driver 0.0, which was the unoccupied driver. This motor has an integrated harness, so the wires were new too, and I test each harness before connecting to the duet. Same thing happened - that homing code fried the Y axis driver after 3 or 4 runs (motor moved fine).
Second, I have figured out the hard way that the 2209's do NOT like my (relatively) high inductance moons motors on spreadcycle. They are noisy and no set of hysteresis, blanking time, or other variables has rendered them silent. For others who may read this: it is probably best to avoid high inductance motors if you want to print fast and quiet on the 2209's. I have also had a lot of trouble with stallguard with this particular printer; I'm guessing sensitivity settings vary depending on Vin. Maybe the spreadcycle-dependent stallguard on the 2660s (Duet 2) is more resilient to fluctuations induced by loads like a bed heater?
Here is the homing code for the X axis, which has the highest inductance motor: (please note the high sensitivity and low current that I have to use)
G91 ; relative motion ; Stealthchop Tuning M18 X ;x off M569 P0.2 S0 D2 ; > spreadcycle G4 P200 ; wait M569 P0.2 S0 D3 V0 ; > stealthchop M400 ; (clear) M913 X100 ; > full current M17 X ; x on G4 P200 ; wait to allow driver to initialize parameters ; G1 H2 X-0.1 F1000 ; tiny move G4 P200 ; wait >140ms G1 H2 X-18 F4800 ; medium velocity move to y-20 The move needs to be >400steps made at a "medium speed", I think RPM > 10 G4 P200 ; Homing M400 M913 X10 ;lower current to x M201 X500 ;lower acceleration M566 X50 ;lower jerk ;M350 X16 I0 M915 X S-50 F0 H200 R2 ;set high sensitivity ; G4 P200 ;wait G1 H1 X330 F6000 ;home G92 X300 ;set x coordinate to max ; Restore Settings M400 M913 X100 ;> full current M201 X9000 ;acceleration M566 X900 ;jerk M915 X S3 F1 H400 R0 ;set sensitivity and disable reports
4 questions:
-
Any ideas on what shorted the Y axis twice?
-
How can I avoid unreliable stallguard behaviors on the 2209's? (re: current & sensitivity settings in the x homing code)
-
How can I use spreadcycle quietly with a moons motor like the MS17HA2P4100? (spreadcycle is noisy)
-
Can the spreadcycle performance of the 2209 (duet 3 mini 5) not match the performance of the 2660 (duet 2) in noise?
-
-
-
Just replicated the "short to vin" with a new motor and board using the same y axis home code. I immediately reset the machine, and the driver seems to be ok. The best hypothesis I had was static from belts, but I couldn't measure more than a mV rise with my multimeter on any motor component.
-
Hi had some issues with my D3 mini5 with sensorless homing , it was for a core xy and steppers not as high inductance as yours , but i attached my files to see if its any help.
;Config.g G90 ; send absolute coordinates... M83 ; ...but relative extruder moves M550 P"3030" ; set printer name name.local M669 K1 ; core xy ; Network M552 S1 ; enable network M586 P0 S1 ; enable HTTP M586 P1 S0 ; disable FTP M586 P2 S0 ; disable Telnet ; Drives M569 P0.0 S1 D2 ; physical drive 0 goes forwards M569 P0.1 S1 D2 ; physical drive 1 goes forwards M569 P0.2 S1 ; physical drive 2 goes forwards ( blown needs replacing) M569 P0.3 S0 ; physical drive 3 extruder M569 P0.4 S1 D2 ; physical drive 4 goes forwards D3=stealthchop M569 P0.5 S0 D2 ; physical drive 5 goes backwards M569 P0.6 S1 D2 ; physical drive 6 goes forwards M584 X0.1 Y0.0 Z0.4:0.5:0.6 E0.3 ; set drive mapping FL,FR,RC M350 X16 Y16 I1 ; configure microstepping with interpolation M350 Z16 E16 I1 ; configure microstepping with interpolation M92 X80.00 Y80.00 Z320.00 E562.00 ; set steps per m M566 X800.00 Y800.00 Z5.00 E400 P1 ; set maximum instantaneous speed changes (mm/min) jerk M203 X24000.00 Y24000.00 Z1500.00 E1200 ; set maximum speeds (mm/min) M201 E2000 ; set accelerations (mm/s^2) M201.1 X2200.00 Y2200.00 Z20.00 ; set accelerations (mm/s2) ;Set Currents M906 X1000 Y1000 Z1000 E750 I100 ; set motor currents (mA) and motor idle factor in per cent M84 X Y S20 ; Set idle timeout sec ; Axis Limits M208 S1 X0 Y0 Z0 ; set axis minima "Travel Area" set in tool.g M208 S0 X300 Y300 Z310 ; set axis maxima "Travel area" set in tool.g ; Endstops M574 X1 S3 ; configure sensorless endstop, 1 = low end, 2 = high end. s3 = single motor, S4 multipule motors M574 Y2 S3 ; configure switch-type (e.g. microswitch) endstop for low end on Y via pin io1.in M574 Z2 S4 ; configure sensorless endstop for high end on Z, 1 = low end, 2 = high end.S3= single motor, S4 multipule motors ;ball joints 3PL M671 X10:310:150 Y5:0:290 S25 ; leadscrews at front left,front right, rear Center s= max correction factor must be in same order as M584 ; inductive sensor M558 P8 C"!io3.in" H10 F1500 T20000 R0 A10 S0.03 ; set Z probe type to unmodulated and the dive height + speeds, !=inverted signal ;nozzel offset G31 P500 Z0.0 ; set Z probe trigger value, offset and trigger height bigger the posative number the closer to the bed set in Tool.g G31 P500 X0 Y0 ; set x,y trigger value, offset and trigger height set in tool.g M557 X0:300 Y0:300 S30 ; define mesh grid ; Heaters + temperature sensors ;Bed M308 S0 P"temp0" Y"thermistor" T100000 B3950 A"Bed T °C" ; configure sensor 0 as thermistor on pin bedtemp M950 H0 C"out2" T0 Q10 ; create bed heater output on bedheat and map it to sensor 0 M307 H0 R0.838 K0.331:0.000 D3.08 E1.35 S0.90 B0 ; PDI info for 8mm aluminium bed 700w Heater NTC 100K 3950 M140 H0 ; map heated bed to heater 0 M143 H0 S130 ; set temperature limit for heater 0 to max C ;extruder M308 S1 P"temp1" Y"pt1000" A"Extruder T °C" ; configure sensor 1 as PT1000 M950 H1 C"out1" T1 ; create nozzle heater output M307 H1 R4.449 K0.705:0.000 D6.21 E1.35 S1.00 B0 V23.8 ; PDI M570 H1 P10 T20 ;P = heater fault timer sec ,T= temperature excursion deg C M143 H1 S360 ; set temperature limit for heater 1 to max C ;Chamber M308 S2 P"temp2" Y"thermistor" T100000 B4267 A"Chamber T °C" ; configure sensor 2 as thermistor on pin temp2 ;M950 H2 C"out5" T2 ; create chamber heater output on 1.out0 and map it to sensor 2 M307 H2 B0 S1.00 ; disable bang-bang mode for the chamber heater and set PWM limit M141 H2 ; map chamber to heater 2 M143 H2 S100 ; set temperature limit for heater 2 to 280C ;DHT Sensor on IO4 on Duet 3 Mini 5+ ; drybox M308 S4 P"io4.out+io4.in" Y"dht22" A"Drybox[C]" M308 S5 P"S4.1" Y"dhthumidity" A"Dry box Hum[%]" ;Dry box fan or ssr ;M950 H3 C"out2" T2 ; create chamber heater output on duex.e2heat and map; it to sensor 3 ;M307 H3 B1 S1.00 ; disable bang-bang mode for the chamber heater and set PWM limit ;M141 H3 ; map chamber to heater 3 ;M143 H3 S80 ; set temperature limit for heater 3 to 280C M308 S10 Y"mcu-temp" A"MCU" ; defines sensor 10 as MCU temperature sensor M308 S11 Y"drivers" A"Duet stepper drivers" ; defines sensor 11 as stepper driver temperature sensor ; Fans M950 F0 C"out6" Q250 ; create fan 0 on pin fan0 and set its frequency M106 P0 S0 H-1 C"Part Fan" ; set fan 0 value. Thermostatic control is turned off M950 F1 C"out3" Q250 ; create fan 1 on pin fan1 and set its frequency M106 P1 S1 H1 T35 C"Extruder Fan" ; set fan 1 value. Thermostatic control is turned on ;Filter fan 12 v M950 F2 C"out0" Q250 ; create fan on output, set its frequency M106 P2 S0 H-1 C"Filter Fan" ; set fan value. Thermostatic control is turned on ;ROS M591 P1 C"io6.in" S1 D0 ; filament monitor ;Tools M563 P0 D0 H1 F0 ; define tool 0 G10 P0 X0 Y0 Z0 ; set tool 0 axis offsets G10 P0 R0 S0 ; set initial tool 0 active and standby temperatures to 0C T0 ; Custom settings are not defined M98 P"/macros/home_max_Z" M98 P"/sys/tool.g" ; sets z offset echo"tool" ;External Buttons M950 J1 C"!io2.in" ;config input pin switch NO connected to io2 and Gnd M581 P1 T0 C0 ;T0 = emergency stop on trigger; T1 = pause print; T{N} = runs the macro "sys/trigger{N}.g", rising edge S1 falling edge S0 ;M581 P1 T4 c0 ;run a macro trigger4.g M582 T0 ; Check External Trigger ;Global varibles Drybox global preSpoolWeight = 0 global emptySpoolWeight = 0 global totalWeight= 0 global filamentWeight =0 global dryBoxTC = 0 global dryBoxRH = 0 global calWeight =0 global instructions = "No Message" global extruderName = "No extruder"
; homeall.g echo "Home All.g " M98 P"/sys/homey.g" ;P define the parameter and is not part of the name M98 P"/sys/homex.g" ;P define the parameter and is not part of the name M98 P"/macros/ProbePickUp" ; probe pick up; absolute positioning M98 P"/sys/homez.g" ;P define the parameter and is not part of the name M98 P"/macros/3PL" ; 3 point leveling M98 P"/macros/3PL" ; 3 point leveling M98 P"/sys/homez.g" ;P define the parameter and is not part of the name ;Absolute mode M98 P"/macros/ProbeDropOff" ; probe pick up; absolute positioning
; homex.g echo "start" M569 P0.0 ; Check status in console M569 P0.1 ; Check status in console G91 ; relative positioning M569 P0.0 S1 D3 V10 ; set to stealth chop M569 P0.1 S1 D3 V10 ; set to stealth chop M915 P0.0 S10 F0 R1 H350 ; Configure Z-Axis Stall Detection M915 P0.1 S10 F0 R1 H350 ; Configure Z-Axis Stall Detection echo "stall detection setup" M17 X Y ; Check status in console G1 P140 ;pause to allow the drivers to characterise the motor G1 H1 X-0.2 F3000 ; move a little for cal of sensorless homing / not stalled ;G1 H1 Y-0.2 F3000 ; move a little for cal of sensorless homing / not stalle echo "lower motor current" M913 X75 Y75 ; Lower motor current % G4 P150 ; wait 150ms M574 X1 Y2 S3 ; Configure Z-Axis stall detection homing M569 P0.0 ; Check status in console M569 P0.1 ; Check status in console echo "home x" G1 H1 X-350 F6000 G1 H2 X10 Y10 G1 H1 X-350 F6000 ; Home Z-Axis actuators independently M569 P0.0 ; Check status in console M569 P0.1 ; Check status in console G90 ; absolute positioning G1 X150 F6000 ; move to center of bed ;revert back echo "after revert back" M915 P0.0 S60 F0 R1 H550 ; Configure Z-Axis Stall Detection M915 P0.1 S60 F0 R1 H550 ; Configure Z-Axis Stall Detection M913 X100 Y100 ; Reset motor current % M569 P0.0 S1 D2 ; reset motors back to spread cycle, M569 P0.1 S1 D2 ; reset motors back to spread cycle, M569 P0.0 ; Check status in console M569 P0.1 ; Check status in console
-
Quick update - I tried decreasing the speed of homing on the Y axis, and so far, no more short reports. A sharp stall paired with the Y being a high current 1.8 degree motor that is geared down 1:2 leads me to believe I was back-emf spiking the 2209, causing a short detection. This is mentioned as a concern on page 45/end of section 6.5 in the 2209 datasheet as a possible problem. The motor was set to home at F6000, which would make for I believe 17k usteps/s. To me, this seems like more than is expected for a stallguard 4.0 move. Switching it to half that (F3000) has prevented further short notifications. If another short occurs, I'll follow up.
-
Update 2. I was fine for a while, but I just swapped in a large motor and set the Y axis driver to 1900 mAmps - and I think I fried the stepper driver, or part of it - stealthchop doesn't work while spreadcycle does. I had zero issues moving the motor around in stealthchop a few times, and found that I needed a very low sensitivity to avoid false stall reports w/ stallguard. I cannot figure out what I'm doing wrong, but I feel like I'm missing something obvious. This is a different duet 3 mini 5+ from the original board (w/ 2 fried drivers). Any input here is greatly appreciated.
XY motors are now both < 3mH inductance
When I tried a 0.7mH motor on the X, it reported a short notification immediately - motor was fine via my fluke multimeter. I can't explain this either. Ditched that motor for a 2.8mH SanMotion 0.9 stepper that has given me zero issues.
I'm running 3.5 rc2
Here's the homing gcode that I think killed the stepper driver:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Homing G91 ; relative motion M400 M913 Y50 ; CURRENT <<< M201 Y600 ; acceleration M566 Y5 ; jerk M915 P0 S80 F0 H200 R2 ; SENSITIVITY <<< M400 ; G1 H1 Y180 F1600 ; home M18 Y ; y off ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Stealthchop Tuning M569 P0 D2 ; > spreadcycle G4 P400 ; wait M569 P0 D3 V0 ; > stealthchop M400 ; (clear) M913 Y100 ; > full current M201 Y3000 M566 Y5 M17 Y ; y on G4 P400 ; wait to allow driver to initialize parameters ; G1 H2 Y-0.1 F600 ; tiny move G4 P200 ; wait >140ms G1 H2 Y-18 F4000 ; medium velocity move to y-20 The move needs to be >400steps made at a "medium speed", I think RPM > 10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Restore Settings M400 M913 Y100 ; > full current M201 Y12000 ; accel M566 Y600 ; jerk M915 Y S80 F1 H400 R0 ; set sensitivity and enable reports M400 G4 P200 ; wait G92 Y145 ; set y coordinate
-
@tjhinton above 1400mA or so the drivers need active cooling; is that the case in your setup?
-
@tjhinton I think this may be due to the mix of high inductance, high speed and high current causing back EMF and destroying the stepper driver. See https://docs.duet3d.com/User_manual/Connecting_hardware/Motors_choosing
Inductance section: https://docs.duet3d.com/User_manual/Connecting_hardware/Motors_choosing#inductanceIan
-
This and the previous board were/are active cooled with a noctua fan that's blowing directly across the back and front of the driver side of the motherboard.
The stepper driver has never reported an overtemp, but I agree - it's a lot to be using. Either way, I had the same issue with lower current motors.
My current suspicion is that I'm damaging the 2209's stallguard circuitry or putting it in a state where it cannot be used for a while.
-
I suspected as much, but I've had this issue with very low inductance motors too (still high current, but less than 2A). Here is an example of one such motor:
WO-417-15-08. Inductance is <1mH, and it has an extremely low detent torque, meant for silent operation.
-
@tjhinton is there continuity between the stepper body and ground? Is the negative pole of the printers power supply tied to a mains electricity protective earth?
You mentioned static on the belt as a suspected cause. I will check my steppers to see if there is continuity between the axle and the stepper body. Antistatic belts are probably available if the gates belts aren't already so, although I do note you did check for charge build up.
-
Does look like there is a Gates Carbon/Volt antistatic range. Guess you have to brush a rotary part at some point to to reliably ground the rotating components. Not looked in to it propoperly yet as you can tell!
-
Board is grounded along with the frame, but the culprit stepper hasn't ever been truly connected to ground or strapped to the case. I have tried to see a rise in voltage across the motor shaft and frame(ground), and I cannot. For what it's worth, the air in the room is usually >50% RH.
-
One thing I have found that helps (prevent "short to vin" or "short to ground") is to raise the current of the offending axis slowly before sending any movements. So, for example, I have placed a 200 ms dwell/pause/wait after adjusting it to ~50%, then raising it to 80-100% with another pause after). Still not a explanation/solution, but it works better than anything else I've come up with.