Utility Bar

TB6600 Stepper Driver Wiring Guide: DIP Switch Settings, Arduino & CNC Setup

Ethan Zaitchik |

The TB6600 is a two-phase stepper motor driver that runs NEMA 17 and NEMA 23 motors at up to 3.5A per phase from a 9-40V DC supply. This guide covers how to wire it, how to set the microstepping and current DIP switches, how to drive it from an Arduino, and how to connect it to a GRBL or Mach3 CNC controller.

The settings below match the TB6600 stepper motor driver we stock. Most generic TB6600 modules use the same layout, but always check the table printed on your driver's case before changing anything.

TB6600 Specifications

  • Supply voltage: 9-40V DC
  • Output current: 0.5-3.5A per phase (4.0A peak), 8 selectable levels
  • Microstepping: 1, 2/A, 2/B, 4, 8, 16 and 32 (up to 6400 pulses per revolution on a 1.8 degree motor)
  • Inputs: optocoupler isolated PUL, DIR and EN signals, common-anode or common-cathode wiring
  • Protection: overheat, over-current and short circuit
  • Idle current reduction: automatic, to cut heat when the motor is stationary
  • Max power: 160W
  • Operating temperature: -10 to 45°C, non-condensing
  • Dimensions: 96 x 56 x 33mm

TB6600 Pinout and Terminals

Terminal Connects to
PUL+ / PUL- Step pulse signal from your controller. One pulse moves the motor one microstep.
DIR+ / DIR- Direction signal. High or low sets the rotation direction.
EN+ / EN- Enable. Normally left unconnected. When active, the motor is released and pulses are ignored.
A+ / A- Motor coil A
B+ / B- Motor coil B
VCC Power supply positive (9-40V DC)
GND Power supply negative

Always switch the power off before making or changing any connection, and check the supply polarity before switching on. Never unplug a motor while the driver is powered.

Finding the motor coil pairs

  • 4-wire motors: set a multimeter to resistance and test pairs of wires. The two wires that read a few ohms between them are one coil. Connect that pair to A+ and A-, and the other pair to B+ and B-.
  • 6-wire motors: each coil has a centre tap. Use the two end wires of each coil and leave the centre taps unconnected and insulated.
  • 8-wire motors: wire the coils in series for more low-speed torque, or in parallel for better high-speed performance (parallel needs a higher current setting). Follow your motor's datasheet.

TB6600 DIP Switch Settings: Microstepping (S1-S3)

Switches S1 to S3 set how many pulses the driver needs for one full revolution of a standard 1.8 degree (200 step) motor.

Microstep Pulses/rev S1 S2 S3
1 200 ON ON OFF
2/A 400 ON OFF ON
2/B 400 OFF ON ON
4 800 ON OFF OFF
8 1600 OFF ON OFF
16 3200 OFF OFF ON
32 6400 OFF OFF OFF

Higher microstepping makes the motor smoother and quieter, especially at low speed, but your controller has to send more pulses per second for the same speed. 8 or 16 is a good starting point for most Arduino and CNC projects. 2/A and 2/B are both half-step modes, and either works for most builds.

TB6600 DIP Switch Settings: Current (S4-S6)

Switches S4 to S6 set the current the driver sends to each motor coil. Set it at or just below your motor's rated current per phase, which is on its label or datasheet.

Current (A) S4 S5 S6
0.5 ON ON ON
1.0 ON OFF ON
1.5 ON ON OFF
2.0 ON OFF OFF
2.5 OFF ON ON
2.8 OFF OFF ON
3.0 OFF ON OFF
3.5 OFF OFF OFF
  • NEMA 17: many are rated between 1.2A and 2.0A. For a 1.7A motor, use the 1.5A setting.
  • NEMA 23: many are rated between 2.0A and 3.0A. For a 2.8A motor, use the 2.8A setting.
  • Too low: the motor is weak and misses steps under load.
  • Too high: the motor and driver run hotter than they need to, and the driver may cut out.

Only change the DIP switches with the power off.

How to Wire the TB6600 to an Arduino

The simplest way to connect a 5V Arduino is common-cathode wiring, where the minus signal terminals share the Arduino's ground.

TB6600 terminal Arduino Uno
PUL+ D9
PUL- GND
DIR+ D8
DIR- GND
EN+ / EN- Not connected

Connect the motor to A+, A-, B+ and B-, and the power supply to VCC and GND. Power the Arduino separately over USB. Don't connect the motor supply to the Arduino: the optocouplers keep the two sides isolated, and that's what protects your board.

If you prefer common-anode wiring, connect PUL+ and DIR+ to the Arduino's 5V pin and PUL- and DIR- to D9 and D8. The signals are then inverted, so LOW is active.

12V or 24V controllers: add a 1kΩ resistor in series with each signal line at 12V, or 2kΩ at 24V. At 5V, connect directly.

3.3V boards (ESP32, Raspberry Pi Pico): the inputs are designed for 5V logic. Many TB6600s will respond to 3.3V in common-cathode wiring, but it isn't guaranteed. If the motor misses steps or doesn't respond, add a logic level shifter or a transistor on each signal line.

Arduino example code

Set S1-S3 to 8 microsteps (OFF, ON, OFF), which gives 1600 pulses per revolution. This sketch turns the motor one revolution clockwise, pauses, then one revolution back.

// TB6600 test: one revolution forward, one back
const int PUL_PIN = 9;
const int DIR_PIN = 8;
const int STEPS_PER_REV = 1600;   // 8 microsteps on a 1.8 degree motor
const int PULSE_DELAY_US = 500;   // lower = faster

void setup() {
  pinMode(PUL_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
}

void rotate(int steps, bool clockwise) {
  digitalWrite(DIR_PIN, clockwise ? HIGH : LOW);
  delayMicroseconds(10);           // give the driver time to register direction
  for (int i = 0; i < steps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(PULSE_DELAY_US);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(PULSE_DELAY_US);
  }
}

void loop() {
  rotate(STEPS_PER_REV, true);
  delay(1000);
  rotate(STEPS_PER_REV, false);
  delay(1000);
}

With a 500µs delay each step takes 1ms, so one revolution takes 1.6 seconds (about 37 RPM). Lower PULSE_DELAY_US to go faster. If the motor stalls when you start it at high speed, it needs to ramp up gradually. The AccelStepper library handles acceleration for you: AccelStepper stepper(AccelStepper::DRIVER, 9, 8);

New to Arduino? Start with our Arduino Getting Started Guide.

Using the TB6600 with GRBL and CNC Controllers

The TB6600 takes standard step and direction signals, so it works with GRBL, Mach3, LinuxCNC and most other CNC controllers. You need one driver per motor.

GRBL on an Arduino Uno

Axis Step pin (to PUL+) Direction pin (to DIR+)
X D2 D5
Y D3 D6
Z D4 D7

Connect PUL- and DIR- on every driver to the Uno's GND. Leave EN unconnected. If you do wire it to GRBL's enable pin (D8) and the motors go limp, invert the enable signal with the $4 setting.

Then set steps per mm for each axis ($100, $101, $102):

Steps per mm = (200 x microsteps) ÷ travel per motor revolution in mm

  • 8 microsteps with an 8mm lead screw: 1600 ÷ 8 = 200 steps/mm
  • 8 microsteps with a GT2 belt and 20-tooth pulley (40mm per revolution): 1600 ÷ 40 = 40 steps/mm

Mach3 and LinuxCNC breakout boards

Connect each axis's step output to PUL and its direction output to DIR. If your breakout board supplies a common 5V, use common-anode wiring (PUL+ and DIR+ to 5V). If it supplies a common ground, use common-cathode wiring (PUL- and DIR- to GND). Set steps per unit in Mach3's Motor Tuning with the same formula as above.

Choosing a Power Supply for the TB6600

  • Voltage: a higher supply voltage gives more torque at high speed. 24V is a good default, 36V suits larger NEMA 23 machines, and 12V is fine for slow NEMA 17 projects. Stay under 40V, as decelerating motors can push the supply voltage up.
  • Current: a stepper driver draws less from the supply than its current setting. As a rule of thumb, size the supply for about two-thirds of the total of all your driver current settings. Three drivers at 2.8A add up to 8.4A, so a 24V supply rated 6A or more will do, and 8A gives comfortable headroom.
  • Power limit: each TB6600 is rated to 160W.

TB6600 Troubleshooting

  • Motor vibrates or buzzes but doesn't turn: the coil pairs are usually mixed up. Re-check them with a multimeter. It can also mean the pulses are too fast for the motor to start, so slow down or add acceleration.
  • Motor doesn't move and has no holding torque: check the power supply, check EN isn't active, and check the minus signal terminals share a ground with your controller (common-cathode).
  • Motor holds firm but won't step: the step signal isn't reaching the driver. Check the PUL wiring and pin number in your code. On 3.3V boards, see the level shifting note above.
  • Turns the wrong way: flip the direction in your code or firmware, or (with power off) swap A+ and A-.
  • Misses steps or loses position: raise the current towards the motor's rating, lower the speed or add acceleration, or use a higher supply voltage. If your controller can't pulse fast enough, reduce the microstepping.
  • Driver cuts out or overheats: lower the current setting one step and improve airflow. In an enclosure, mount the heat sink fins vertically and add a fan. Stepper motors themselves normally run hot to the touch.
  • Rough or noisy at low speed: increase the microstepping to 8 or 16.

TB6600 FAQ

Can the TB6600 drive a NEMA 23 motor?

Yes. It handles NEMA 23 motors rated up to 3.5A per phase. Larger NEMA 23 or NEMA 34 motors above 3.5A need a bigger driver.

Does the TB6600 work with an ESP32 or Raspberry Pi?

An ESP32 often works with common-cathode wiring, but 3.3V logic isn't guaranteed to trigger the inputs, so a level shifter is the reliable option. A Raspberry Pi can generate step pulses, but Linux timing isn't precise, so expect uneven motion at speed. An Arduino or ESP32 gives smoother results.

Can one TB6600 run two motors?

No, use one driver per motor. For an axis with two motors, such as a dual Y gantry, use two drivers and send both the same step and direction signals.

Do I need resistors on the signal lines?

Only if your control signals are 12V (1kΩ) or 24V (2kΩ). 5V signals connect directly.

What's the difference between 2/A and 2/B?

Both are half-step modes at 400 pulses per revolution. Either works for most projects.

What does the EN terminal do?

When enable is active, the driver releases the motor so the shaft turns freely and step pulses are ignored. Most builds leave it unconnected so the motor stays powered and holds its position.

Get the Parts

The TB6600 stepper motor driver is in stock and ships from Melbourne. You'll also need a two-phase stepper motor and a DC power supply sized as above, plus an Arduino or CNC controller to send the step signals.

Leave a comment