A q-axis current that sits at exactly the same number on every axis is not a measurement of a fault. It is a saturated controller output resting against a configured limit. Forty amps on six S1 axes, together with an effective_torque_setpoint frozen at -1 Nm, says the position loop is asking for more torque than the drive is allowed to deliver and the demand is being clipped. Fix the reason the loop cannot close — commutation alignment and the static load the capstan preload applies — and the current falls back to whatever the mechanism actually needs.
40 A as a Clamp, Not a Fault Current
The number that matters is the ratio. Divide the reported torque command by the reported current: 1 Nm / 40 A = 0.025 Nm/A. That is the torque constant the drive is currently configured with, and it is the conversion the firmware uses in both directions — torque command in, Iq command out. Two readings of the same pair of numbers exist, and they are distinguished by one measurement:
- Saturation. The position controller demands more than 1 Nm, the current soft limit clips Iq at 40 A, and the reported torque setpoint is the clipped value converted back through the same 0.025 Nm/A. Confirmed if the configured current soft limit equals 40 A.
- Scaling error. The loop genuinely wants 1 Nm, but the configured torque constant is far below the motor's real value, so a modest torque request is translated into a huge current request. Confirmed by comparing the configured torque constant against 8.27 / Kv for the D5312S.
Read the current soft limit in the motor configuration first. If it reads 40 A, the axis is saturated and the question becomes why. If it reads higher than 40 A, the drive is not clipping and the torque constant is the suspect.
Setpoint Versus Measured, and the E-Stop Reading
Seeing 40 A on the setpoint with the E-stop open is not a paradox and not evidence of a short. Iq_setpoint is arithmetic: position error, velocity error, integrator state, then a divide by the torque constant. The MCU stays alive on USB or auxiliary power, the control loop keeps evaluating, and the number it publishes has no dependence on bus voltage. Nothing was flowing.
Iq_measured is different. It comes from the phase shunts through the ADC, and with the bus de-energized it must sit within a fraction of an amp of zero. That single check separates two failure classes. If measured current also holds near 40 A with no bus voltage, the current-sense zero offset is wrong and the FOC loop is regulating against a phantom DC term — the drive will push real current to make a false reading agree with a setpoint. Power-cycle the drive with the motor disconnected and re-read; the offset calibration runs at boot.
The cross-axis question answers itself once the two signals are separated. Each S1 closes its own current loop on its own shunts; one motor's bad magnet cannot lift another motor's Iq. What six axes do share is the command source — one Teensy issuing the same position targets over the same link — and the same DC bus. Six axes saturating together points at the commands or the supply, not at one magnet.
Torque per Amp and Where the Heat Goes
This is heat, not logic. Field-oriented control only produces torque proportional to Iq when the electrical angle used for the Park transform matches the rotor's true electrical position. With an angle error θe, useful torque scales as cos(θe) while copper loss scales with the full current squared. At 90° of error the axis draws its entire current limit and produces no torque at all — every watt lands in the windings.
Copper dissipation, with Iq as the q-axis amplitude and R as per-phase resistance:
P_cu = 1.5 x Iq^2 x R_phase
At Iq = 40 A:
P_cu = 1.5 x 1600 x R_phase = 2400 x R_phase [W]
Read R_phase from the motor calibration result on each axis. Ten milliohms puts 24 W into a small outrunner; fifty puts 120 W. That is the whole explanation for one motor cooking while the other five run warm: the five have workable commutation and are converting most of that 40 A into holding torque against the capstan preload, and the sixth has an angle error large enough that its current does nothing but heat copper. Compare per-axis position error while saturated — the hot axis will show error that never shrinks.
An inverted commutation direction is the same failure at its extreme. The loop pushes, the rotor moves the wrong way, error grows, the integrator winds to the limit within milliseconds, and the axis rails on every enable. If Iq jumps to the clamp the instant closed-loop control is entered, before any motion command, treat direction as the primary suspect.
Diagnostic Sequence
| Quantity | Expected value / limit | Where to read it |
|---|---|---|
| Current soft limit | Compare against the observed 40 A clamp | Motor configuration |
| Configured torque constant | Should match 8.27 / Kv for the D5312S; 1 Nm / 40 A implies 0.025 Nm/A | Motor configuration |
Iq_measured with bus de-energized |
Within a fraction of an amp of zero | Live telemetry, motor disconnected |
| Position error while saturated | Shrinking toward zero; a fixed non-zero error means the loop cannot close | Position estimate vs. position command |
| Phase resistance | Matched within a few percent across all six axes | Motor calibration result |
| Copper loss at clamp | 1.5 x 40^2 x R_phase watts | Calculated |
| Winding temperature | Below the motor's insulation class rating | Thermistor reading or direct probe |
| Bus voltage under load | Stable across all six axes at once | Bus voltage telemetry, all axes armed |
- Disarm every axis. Confirm
Iq_measureddrops to zero on all six whileIq_setpointholds its stale value. This separates arithmetic from current. - Arm one axis alone, in position control, with the position command set equal to the present position estimate. If Iq still climbs to the clamp with zero commanded motion, the fault is in commutation or the current-sense offset, not in the trajectory.
- Command a slow, small rotation and watch the sign of the resulting motion against the sign of the command. Reversed motion is inverted commutation direction.
- Compare phase resistance and inductance across all six axes. An outlier flags a wiring, connector, or winding problem on that axis specifically.
- Record the steady-state Iq required to hold position with the capstan wire tensioned to its working preload. That number is the real static load, and the current limit must exceed it with margin.
Recalibration and Load-Path Correction
Calibration with the capstan still bolted to the shaft and the wire only partially relieved is the flaw that reproduces across all six builds, because the same assembly procedure was followed on all six. Residual cable tension applies a position-dependent restoring torque during the encoder offset sweep. The drive learns an electrical offset biased by that torque, and the bias is systematic — the same wrap direction on every capstan produces the same sign of error on every axis.
- Fully release the capstan wire, or unbolt the capstan, so the rotor turns freely by hand with no detent beyond magnetic cogging. Free-spinning is not a judgement call; if you can feel a preferred position from the cable, it is not free.
- Run motor calibration, then encoder offset calibration, on one axis. Record the resulting phase resistance, inductance, and offset.
- Repeat on all six and compare offsets. Values that cluster within a few electrical degrees of each other across identical assemblies are credible; a scattered set means something is moving during the sweep.
- Re-tension the capstan wire to the working preload, then re-read the holding current at rest. It should land well below the clamp.
- If the offset drifts between two consecutive calibrations on the same axis, the magnet or its housing is moving relative to the rotor. Verify the glue joint and the screw retention on the magnet housing before spending more time in software.
Where the load is genuinely large, raise the current soft limit only after confirming the thermal path can absorb 1.5 × I² × R_phase continuously. Raising a limit to escape saturation without fixing the alignment converts a warm motor into a burnt one.
Verification, Recurring Pitfalls, and Escalation
The system is fixed when three things hold simultaneously on every axis: holding current at rest is a small fraction of the soft limit, position error decays to near zero after a step command instead of parking at a fixed value, and winding temperature stabilises rather than climbing. Run all six axes together for at least one full thermal soak — twenty to thirty minutes at working preload — and re-read temperatures. Copper resistance rises roughly 0.4 % per kelvin, so an axis with marginal commutation gets worse as it warms, and short tests hide it.
Pitfalls that recur on multi-axis cable-driven builds: calibrating with the transmission attached and calling it free-spinning; a shared host that issues a position step far outside the current envelope and holds every axis in saturation indefinitely; a torque constant left at a default that does not correspond to the fitted motor, so every torque number in the API is fiction; and a DC supply sized for one axis at limit rather than six, where bus sag under simultaneous demand pushes all axes into their own saturation. Read the setpoint and the measured value as separate quantities every time — conflating them sends people hunting shorts in a control box that has none.
Escalate when calibration is repeatable and clean, phase resistance and inductance match across axes, and a single axis still rails to the current limit with the transmission fully disconnected. At that point the fault is inside the drive's current sensing or the motor's magnetic assembly, and neither is resolved by further configuration work. Package the calibration values, the live Iq and position-error traces, and the motor part number for ODrive Robotics support through their official channel.
Frequently Asked Questions
What happens if I raise the current limit to stop the Iq saturation?
The axis stops clipping and draws more current, dissipating 1.5 x Iq^2 x R_phase in the windings continuously. If the underlying cause is a commutation offset error, none of that extra current becomes torque and the motor reaches its insulation limit faster.
What happens if I calibrate the encoder with the capstan still tensioned?
The cable applies a restoring torque during the offset sweep, so the learned electrical offset is biased. Because every axis is assembled the same way, the same bias appears on every axis — which is why six drives show identical symptoms rather than one.
What happens to Iq setpoint when the E-stop opens the DC supply?
It keeps whatever value the control arithmetic last produced, because the setpoint is computed from position error and the MCU stays powered over USB. Measured Iq is the one that must fall to near zero; if it does not, the current-sense zero offset is wrong.
Can one badly calibrated motor push the other five axes to 40 A?
Not through the current loops — each drive closes FOC on its own shunts. Shared failure paths are the common command source issuing the same saturating position targets and a DC bus that sags when all six draw at limit simultaneously.