Wanted some more details on why stalls happen and how to decrease number of occurrences.
I found that if the driver stalls, calling the reset method to clear status and reset the settings ends up resolving the stalling problem and allows the motor to continue running.
Would really appreciate some insight into how to help improve this. Utilizing the driver with an Arduino Nano Every and a NEMA 34 motor that can use up to 4.2 Amps (I have set the current limit to 4A). Also some advice on how to best utilize the STALL or BEMF ports would be great. Thanks!
Below is my reset() method:
// Reset the driver to its default settings and clear latched status
// Select auto mixed decay. TI's DRV8711 documentation recommends this mode
// for most applications, and we find that it usually works well.
// Set the current limit. You should change the number here to an appropriate
// value for your particular system.
// Set the number of microsteps that correspond to one full step.
// Enable the motor outputs.
The fault detection on the driver’s IC should not interrupt the driving of the motor, so if you have to reset it, you might actually be dealing with a driver fault or some other error. Could you check the nFAULT pin to see if that is the case?
Additionally, could you post pictures of your setup that show all of your connections, as well as information about your power supply?
Thanks for your reply Brandon. Wanted to ask a follow-up question regarding the BEMF pin. I was reading through the DRV8711 driver documentation and saw that utilizing Back EMF could be a good method of stall detection.
Would appreciate some clarity on how it would actually be implemented? Are there any Arduino program examples of this in use?
Unfortunately, we have not done much with the stall detection on that driver, so we cannot offer any specific advice, but the DRV8711 datasheet has some information about the internal stall detection on page 24. There are a few considerations mentioned there; for example, the time between step inputs must be greater than the SMPLTH time, the motor must be moving at some minimum speed, it does not work in full-step mode, and you will probably need to find the correct setting of the SDTHR bits for your setup experimentally. We do not have any specific examples for configuring or using the stall detection, but you can use the functions in our High-Power Stepper Motor Driver library for Arduino to read and write to the appropriate registers.
I am implementing Stall detection. I have the stall pin triggering an interrupt (I’ll describe setup and settings below for those who are also looking to implement SD). There are two problems that are interrelated:
It seems that the clearStatus() function is not not clearing the latched STDLAT bit(7).
A byproduct of this is that the STALLn/BEMFVn pin stays low (multi-meter pin reading) and this is destabilizing the whole board - causing the USB link to crash. Resetting the Arduino does not clear the latched STALLn bit. Recovery requires removing power from the DRV8711 board, unplugging the Arduino USB, re-plugging, hitting reset, then re-connecting the motor PS.
Also I’m activating the SLEEP pin to stop the motor at stall. The datasheet states:
In sleep mode, the motor driver circuitry is disabled, the gate drive regulator and charge pump are disabled, and all analog circuitry is placed into a low power state. The digital circuitry in the device still operates, so the device registers can still be accessed via the serial interface.
SETUP and SETTINGS
motor: NEMA 23, bipolar
current: 500mA (easier to stall by hand)
step period: 2000
Board: nano 33 IoT
CTRL: The default CTRL (0xC10) already has internal STALL enabled
STALL: 0x402, VDIV bit 10 is set, SDTHR bit 2 is set
TORQUE: 0x1FF (default)
Any ideas why the status reg isn’t clearing?
The datasheet for the DRV8711 on the 36v4 stepper driver says:
“The STALLn/BEMFVn pin will deassert and the STD bit will automatically clear at the next zero-current step if a stall condition is not detected, while the STDLAT bit will remain set until a 0 is written to it.”
Since the clearStatus() function clears the entire STATUS register, that should include clearing the STDLAT bit. So if it is not clearing for you, that does seem strange along with the STALLn/BEMFVn pin staying low, and it suggests either the driver is immediately detecting another stall again or the stall indication is not clearing properly.
Are you putting the driver to sleep after detecting a stall or as a means to create a stall for testing? If you power cycle can you reliably re-trigger the stall detection every time you try? Could you post pictures of your setup that show all connections including soldering?