Why idle current is lower than expected?
-
My config has this line:
M906 X1200 Y1200 Z1200 E600 I45 ; X: 1.2A peak, 0.45% idle.
When the X motor moves it sees 1.2A peak (good). However, when it idles, the current is not 1.2A x 45% = 0.55A as expected but only 0.38A.
Is this intentional? Since 0.55A DC is below the RMS of 1.2A peak, is there a need to lower the idle current below the expected 0.55A?
-
@zapta there are two idle current reduction mechanisms on some boards:
- RRF has an idle current reduction mechanism controlled by M906. By default, all motor currents are reduced to 30% of normal when all motors have been inactive for 30 seconds.
- The drivers on all Duet 3 boards and on Duet Maestro have a standstill current reduction facility, which reduces motor currents when the motor is at standstill or moving very slowly. You can control the amount of current reduction using M917. We set this to 70% by default.
Therefore, if you have set the idle current in M905 to 45% and you are using the default 70% standstill current, you will get 45% * 70% = 31.5% of the normal current= 0.378A which agrees with your measurement
-
Thanks @dc42, I indeed observed the standstill reduction to 0.86A shortly after the motor stops.
I guess my question is, why is the idle factor applied to the the standstill (0.86A) rather than directly the peak current (1.2A) as intuitively expected?
If the goal is to prevent the per coil idle power, the idle factor can be capped at 1/sqrt(2) or the standstill factor.
-
@zapta the idle current reduction was implemented before we had drivers that implement standstill current reduction, and hasn't been updated since. I will be reworking that area in RRF 3.5 to support idle current percentage per axis and extruder, so I'll look at accounting for standstill current reduction then.
-
Thanks @dc42.
-
BTW, the current measurement method I use is I = sqrt(I1^2 + I2^2).
It's agnostic to microstep position, it estimates the per coil peak current, is independent of run vs stop states, and it determines the overall stepper power/heat: P = R * I^2, where R is coil resistance. Very handy.
I think I replicates the internal values that the stepper motor uses before applying the sine/cosine functions for the two coils.