TMC2209 VREF & UART Current Calculator
Enter the motor phase-current rating and your driver RSENSE value to get a standalone VREF setting plus UART IRUN and IHOLD register values. The result also shows the rounded current the driver can actually produce.
Standalone VREF1.2
- Target run current (RMS)
- 0.85
- Target peak current
- 1.2
- Recommended UART run setting
- VSENSE 0.180 V, IRUN 27
- Achieved UART run current (RMS)
- 0.86
- UART current error
- 0.96%
- Recommended IHOLD setting
- VSENSE 0.180 V, IHOLD 13
- Maximum RMS current at this RSENSE
- 1.77
Uses the TMC2209 current equations with the entered effective RSENSE value plus the 0.020 ohm internal sense offset.
How to use this calculator
- Enter the motor current printed on the label or listed in the motor datasheet.
- Choose whether that current is a peak/nameplate value or already an RMS value.
- Set the run-current percentage you want to use while the axis is moving.
- Enter the effective sense-resistor value for your TMC2209 carrier board.
- Set the hold-current percentage to size the UART IHOLD register.
How the TMC2209 current values are calculated
The TMC2209 can be set two different ways. In standalone mode, the analog VREF pin sets the current limit. In UART mode, firmware writes current-scale register values such as IRUN and IHOLD. Both methods depend on the driver board's effective sense resistance, so the same motor can need different settings on different carrier boards.
The calculator first converts the motor rating into the RMS run current target. If the motor rating is entered as peak or nameplate current, it divides by sqrt(2). If the rating is already RMS, it leaves it alone. It then applies the selected run-current percentage:
Irun,rms = motor current × run percent
For a peak/nameplate rating, the motor current term in that formula is M ÷ sqrt(2). For an RMS rating, it is simply M. The matching peak target is Irun,peak = Irun,rms × sqrt(2).
Standalone VREF is solved from the analog-current equation:
VREF = 2.5 × Irun,rms × sqrt(2) × (RSENSE + 0.020) ÷ 0.325
The 0.020 ohm term is the internal sense-path offset used by the Trinamic equation. If the result is above 2.5 V, the requested current is beyond the analog full-scale range for that RSENSE value.
How IRUN and IHOLD are chosen
For UART current, the calculator tries the lower full-scale sense voltage first, VFS = 0.180 V, because it gives finer resolution when the target fits. It computes the raw current scale as:
CSraw = 32 × sqrt(2) × I × (RSENSE + 0.020) ÷ VFS − 1
If that value is at most 31, the calculator uses VSENSE 0.180 V. Otherwise it switches to VSENSE 0.325 V and recalculates. The register value is the nearest integer from 0 through 31. After rounding, the achieved RMS current is recalculated as:
Ia = ((CS + 1) ÷ 32) × (VFS ÷ (RSENSE + 0.020)) ÷ sqrt(2)
That is why the achieved current can differ from the requested current, especially at very low currents where register 0 is still a nonzero current scale. IHOLD is calculated the same way from the requested hold current, using the same VSENSE range as the run-current setting.
What matters most
The RSENSE value moves every result. A board using 0.110 ohm sense resistors will not match a board using 0.150 ohm or 0.075 ohm resistors. The peak-versus-RMS choice also matters: applying the peak-to-RMS conversion to a value that is already RMS will under-set current by about 29%.
What this calculator leaves out
The math is only the current-scaling side of setup. It does not model board cooling, airflow, heatsinks, connector ratings, supply voltage, motor inductance, microstep mode, stealthChop behavior, or extra current reduction done by firmware. Treat the result as a starting point, then confirm the driver and motor temperatures under a representative print.
Worked example
Suppose a stepper motor is labeled 1.5 A per phase, treated as a peak/nameplate rating. With an 80% run-current target and a 0.110 ohm sense resistor, the RMS target is (1.5 ÷ sqrt(2)) × 0.80 = 0.849 A. The target peak current is 1.200 A.
The standalone equation gives VREF = 2.5 × 0.849 × sqrt(2) × (0.110 + 0.020) ÷ 0.325 = 1.200 V. UART mode fits in the lower sense range, so the run setting is VSENSE 0.180 V, IRUN 27, which gives about 0.857 A RMS after rounding. With hold current at 50%, the calculator reports IHOLD 13.
Common questions
Is a stepper motor's nameplate current peak or RMS?
Many small stepper motor labels list a per-phase current without saying peak or RMS, and motor vendors are not perfectly consistent. If the datasheet clearly says RMS, select RMS. If it is a conventional nameplate phase-current value and you want the common 3D-printer current-limit treatment, select peak/nameplate so the calculator converts it to RMS before applying the run percentage.
What RSENSE value does my TMC2209 module use?
Use the effective sense resistance from the carrier-board schematic when you can. Many modules are around 0.110 ohm, but boards can use other values and some published setup guides assume a specific carrier. If you only have the board in hand, check the resistor markings and the module documentation before trusting a default.
What is the difference between VREF, IRUN, and run_current?
VREF is the analog voltage used when the driver is configured without UART current control. IRUN is the TMC2209 current-scale register used in UART mode. Firmware settings such as Klipper run_current or Marlin current commands are usually user-facing current values that firmware translates into driver register settings.
Should TMC2209 current be set to 80% of the motor rating?
Eighty percent is a common starting point, not a rule. Lower current reduces heat and may still hold position on lightly loaded axes. Higher current can improve torque but needs enough driver cooling, motor cooling, and power-system margin.
Why does the calculated UART current differ from the requested current?
IRUN and IHOLD are integer register values from 0 through 31, so the driver cannot represent every possible current exactly. The calculator rounds to the nearest available register value and then reports the achieved RMS current from that rounded value. The difference is most visible at low current targets.
How low should IHOLD be set on a 3D printer?
IHOLD should be low enough to reduce stationary heat but high enough that the axis does not move when idle. Values around 30% to 60% of run current are common starting points, but Z axes, heavy beds, and belt tension can change what is safe. Remember that IHOLD 0 is still the lowest current-scale register, not a guarantee of zero coil current.