TMC2208 Silent Stepper Motor Driver – Wiring, Arduino, Current Setup & UART
The TMC2208 is a low-noise driver for one 2-phase bipolar stepper motor. It supports normal STEP/DIR control for use with 3D-printer, CNC and microcontroller systems, together with a single-wire UART interface for software configuration and diagnostics.
This guide covers the AuscomTech TMC2208-LA StepStick-style module shown with the supplied aluminium heatsink. The carrier PCB does not identify a specific board revision, so follow the labels printed on your module rather than relying on the physical layout of another manufacturer’s TMC2208 board.
TMC2208 Overview
In standalone mode the TMC2208 MS1 and MS2 pins select 1/2, 1/4, 1/8 or 1/16 input microstepping. The MicroPlyer interpolator can smooth these input steps internally to 1/256 resolution. UART configuration can also select higher native microstep resolutions up to 1/256.
The TMC2208 IC is designed for approximately 1.2A RMS per coil continuously, with higher currents dependent on duty cycle and thermal conditions. The small carrier PCB, heatsink installation, airflow, ambient temperature and motor supply voltage all affect the practical limit. Do not plan on maximum-current operation without checking driver temperature.
Connections & Pin Functions
The module uses a StepStick-style two-row header arrangement, but physical orientation must be checked against the labels on the actual module and the socket it is being installed into. Never insert the module only by comparing component positions with an A4988, DRV8825 or another TMC carrier.
| Label | Function |
|---|---|
| VM | Motor power supply input |
| VIO | 3.3V or 5V logic supply |
| GND | Power and logic ground |
| M1A / M1B | First stepper-motor winding |
| M2A / M2B | Second stepper-motor winding |
| STEP | A rising edge advances the motor by one selected step or microstep |
| DIR | Selects motor direction |
| EN | Motor-output enable; LOW enables the driver and HIGH disables it |
| MS1 | Standalone microstep configuration input |
| MS2 | Standalone microstep configuration input |
| PDN_UART | Combined power-down control and single-wire UART signal |
| CLK | Optional external clock input; normally the internal clock is used |
The TMC2208 IC has one combined PDN_UART signal. Some carrier boards use solder pads, jumpers or differently labelled connection points to route this signal. Do not assume two labels marked PDN and UART represent two independent IC pins.
Standalone Microstep Selection
| MS2 | MS1 | STEP Input Resolution |
|---|---|---|
| LOW | LOW | 1/8 step |
| LOW | HIGH | 1/2 step |
| HIGH | LOW | 1/4 step |
| HIGH | HIGH | 1/16 step |
Arduino UNO Wiring – Standalone STEP/DIR Test
This test does not require a library or UART connection. Use a separate motor power supply suitable for the stepper motor. A 12V supply is convenient for many bench tests, but the correct supply depends on the complete motor and motion-control system.
| TMC2208 | Arduino UNO / Supply | Function |
|---|---|---|
| VIO | 5V | Logic supply |
| GND | Arduino GND + motor supply negative | Common ground |
| VM | External motor supply positive | Motor power |
| EN | D7 | Driver enable |
| DIR | D8 | Direction |
| STEP | D9 | Step pulses |
| MS1 | GND | Select 1/8 step |
| MS2 | GND | Select 1/8 step |
| M1A / M1B | Stepper winding A | One complete motor coil |
| M2A / M2B | Stepper winding B | The other motor coil |
One complete winding must connect between M1A and M1B and the other winding between M2A and M2B. Do not connect one wire from each coil to the same output pair. For an unknown 4-wire motor, use a multimeter in resistance or continuity mode to find the two wire pairs belonging to each winding.
Interrupting a stepper winding while current is flowing can produce voltage transients capable of damaging the driver. Switch off motor power before changing the motor, moving the driver or rewiring the output connections.
Supply Decoupling
For a standalone bench setup, fit a low-ESR electrolytic capacitor of at least 100µF between VM and GND close to the driver. A 3D-printer or CNC controller board may already provide suitable bulk capacitance near its driver sockets.
Setting the Motor Current
The onboard potentiometer controls the analogue VREF setting when the TMC2208 is being used in its normal standalone analogue-current mode. Current must be adjusted for the connected motor rather than simply turning the potentiometer to its maximum position.
TMC2208 current calculation depends on the fitted sense resistors, the analogue VREF setting and internal current-control configuration. Different carrier boards can therefore give different motor current for the same measured VREF.
The module shown for this product has current-sense resistors marked R110, indicating nominal 0.11Ω sense resistors. If the markings on the module you receive are different, use the values on that module rather than assuming 0.11Ω.
Recommended Setup Procedure
- Check the motor manufacturer’s rated phase current.
- Install the heatsink and arrange airflow before extended operation.
- Switch motor power off before connecting the motor or moving the driver.
- Start with a conservative current setting rather than maximum adjustment.
- If a labelled VREF test point is available, measure VREF relative to GND while carefully adjusting the potentiometer with an insulated tool.
- If the carrier has no documented VREF test point or current conversion, use a verified UART current setting instead of guessing a VREF formula.
- During initial testing, check both the motor and driver temperature and increase current only when the application requires more torque.
A stepper motor’s rated phase current is not the same as the DC current drawn from the motor power supply. Do not attempt to set TMC2208 phase current by measuring only the total current at the power supply input.
Arduino STEP/DIR Proof-of-Operation
No additional Arduino library is required for this basic test. Upload the sketch after checking the motor coil pairs and setting a conservative motor current.
const byte EN_PIN = 7;
const byte DIR_PIN = 8;
const byte STEP_PIN = 9;
void moveSteps(unsigned long steps, bool direction) {
digitalWrite(DIR_PIN, direction);
delayMicroseconds(10);
for (unsigned long i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(500);
}
}
void setup() {
pinMode(EN_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
// Keep the driver disabled while outputs are initialised.
digitalWrite(EN_PIN, HIGH);
digitalWrite(DIR_PIN, LOW);
digitalWrite(STEP_PIN, LOW);
delay(100);
// EN is active LOW.
digitalWrite(EN_PIN, LOW);
}
void loop() {
moveSteps(800, LOW);
delay(750);
moveSteps(800, HIGH);
delay(1500);
}
Expected Result
The motor should rotate smoothly in one direction, pause, then rotate back in the opposite direction. The exact angle travelled depends on the motor’s full-step count and the selected microstep resolution.
If the motor vibrates without rotating, switch off power and re-check that each output pair is connected to one complete motor winding. If it turns in the opposite physical direction to the one required by your mechanism, reverse the DIR setting in software or swap both wires of one motor winding while power is off.
Optional UART Configuration
UART is not required for ordinary STEP/DIR operation. It is useful when firmware needs to configure motor current, microstepping, chopper behaviour or read diagnostic information.
TMC2208 carriers are made in several layouts. Some route PDN_UART directly to a header while others require a solder bridge or jumper. This module does not carry a clearly identified carrier revision, so do not copy another manufacturer’s solder-jumper instructions without first confirming the PCB connection.
Arduino Library
In the Arduino IDE, open Library Manager, search for TMCStepper by Teemu Mäntykallio and install it before compiling the UART example.
Single-Wire UART Connection
For bidirectional UART, the TMC2208 uses the same PDN_UART line for transmit and receive. A common microcontroller connection uses the receive pin directly and feeds the transmit signal through a 1kΩ series resistor.
| Connection | Arduino UNO |
|---|---|
| PDN_UART | D4 directly for software RX |
| PDN_UART | D5 through 1kΩ for software TX |
| GND | GND |
| EN | D7 |
| DIR | D8 |
| STEP | D9 |
The following example assumes the module has R110 / 0.11Ω sense resistors as shown on the product module. Check your module before using this value.
#include <TMCStepper.h>
const byte SW_RX = 4;
const byte SW_TX = 5;
const byte EN_PIN = 7;
const byte DIR_PIN = 8;
const byte STEP_PIN = 9;
constexpr float R_SENSE = 0.11f;
// Start conservatively and change this to suit the motor.
// TMCStepper specifies rms_current() in milliamps RMS.
const uint16_t MOTOR_CURRENT_MA = 400;
TMC2208Stepper driver(SW_RX, SW_TX, R_SENSE);
void moveSteps(unsigned long steps, bool direction) {
digitalWrite(DIR_PIN, direction);
delayMicroseconds(10);
for (unsigned long i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(500);
}
}
void setup() {
Serial.begin(115200);
pinMode(EN_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
digitalWrite(EN_PIN, HIGH);
digitalWrite(STEP_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
driver.begin();
// Configure PDN_UART for UART operation.
driver.pdn_disable(true);
// Use register-controlled current rather than the analogue VREF input.
driver.I_scale_analog(false);
driver.rms_current(MOTOR_CURRENT_MA);
driver.microsteps(16);
driver.pwm_autoscale(true);
driver.toff(3);
uint8_t result = driver.test_connection();
if (result == 0) {
Serial.println("TMC2208 UART connection OK");
digitalWrite(EN_PIN, LOW);
} else {
Serial.print("TMC2208 UART connection failed, code ");
Serial.println(result);
digitalWrite(EN_PIN, HIGH);
}
}
void loop() {
if (driver.test_connection() != 0) {
digitalWrite(EN_PIN, HIGH);
delay(1000);
return;
}
moveSteps(800, LOW);
delay(750);
moveSteps(800, HIGH);
delay(1500);
}
Expected UART Result
Open the Serial Monitor at 115200 baud. A successful bidirectional connection should display TMC2208 UART connection OK, after which the motor should move backwards and forwards.
If the UART check fails but ordinary STEP/DIR operation works, concentrate on the PDN_UART route, solder jumper or UART wiring rather than the motor outputs.
Power, Cooling & Installation
Fit the heatsink correctly
The module uses the PCB copper and thermal vias to move heat away from the TMC2208. Fit the supplied aluminium heatsink to the intended thermal area without allowing the heatsink or adhesive to short exposed electrical pads.
Provide airflow at higher current
A heatsink alone does not guarantee maximum current capability. Enclosed 3D-printer and CNC electronics may require a fan to keep the driver within a reasonable temperature range.
Do not work close to the voltage limit unnecessarily
Stepper wiring and supply leads can generate voltage spikes. Leave useful voltage margin below the TMC2208 maximum and use suitable bulk decoupling close to the driver.
Troubleshooting
Motor only vibrates or locks in place
- Switch off power and identify the two motor winding pairs again.
- Connect one complete winding to M1A/M1B and the other to M2A/M2B.
- Check that the motor current is not set too low.
- Reduce STEP frequency for the first test.
Motor does not energise
- Confirm motor voltage is present between VM and GND.
- Confirm VIO is supplied with a valid 3.3V or 5V logic voltage.
- Confirm Arduino and motor-supply grounds are common.
- Check that EN is LOW.
- Check that the module has not been inserted into its socket backwards.
Motor moves but has very little torque
- Check the motor’s rated phase current and the driver current setting.
- Confirm the supply voltage is suitable for the motor and application.
- Check for excessive mechanical load or binding.
- Do not compensate for a mechanical problem by immediately turning the current adjustment to maximum.
Driver becomes very hot or stops intermittently
- Reduce the motor current.
- Check that the heatsink is fitted to the correct thermal area.
- Add airflow across the driver.
- Check for a shorted motor winding or incorrect coil pairing.
- Allow the module to cool before further testing if thermal protection has operated.
UART communication does not work
- First confirm that STEP/DIR control works normally.
- Confirm the actual carrier’s PDN_UART routing or solder-jumper requirement.
- Check the common ground connection.
- For bidirectional operation, check the RX connection and the 1kΩ resistor in the TX path.
- Confirm the TMCStepper library is installed and the sketch is using TMC2208Stepper rather than TMC2209Stepper.
Motor direction changed after replacing another driver
Different driver families and controller firmware configurations can produce the opposite physical direction for the same DIR logic level. Correct the direction in firmware where appropriate, or switch off power and reverse both wires of one motor winding.
This product uses a TMC2208-LA driver IC on an unmarked StepStick-style carrier. Carrier-board pin routing, UART solder-jumper arrangements, potentiometer calibration and thermal performance can vary between manufacturers. Always follow the markings on the module being used, confirm socket orientation before applying power, set motor current conservatively and never connect or disconnect the motor while the driver is powered.