If you are building a wheeled robot, a linear actuator, or an automated winch, your default pick should be a 12V brushed DC (BDC) planetary gearmotor paired with a TB6612FNG driver (for loads under 1.2A) or a BTS7960 driver (for loads up to 20A). Never size a driver by the motor's continuous current rating alone; you must size it by the motor's stall current. Sizing by continuous current is the single most common reason DIY motor controllers melt on the bench.

The Core Match: Load Profile to Motor Type

Before selecting the silicon, you must confirm the motor topology fits your mechanical load. While stepper and servo motors dominate the 3D printer and CNC space, they are entirely wrong for high-speed, high-inertia traction loads. Here is how the primary DC motor types map to real-world load profiles.

Motor Type Torque Curve Control Needs Cost (Approx) Best Load Profile
Brushed DC (BDC) Maximum torque at zero RPM (stall), drops linearly as speed increases. Simple H-bridge for direction; single PWM pin for speed. $8 - $45 Heavy traction, winches, linear actuators, high starting torque.
Brushless DC (BLDC) Relatively flat torque curve across the mid-RPM range; high peak RPM. 3-phase ESC (Electronic Speed Controller) with hall sensors or sensorless back-EMF zero-crossing detection. $30 - $120+ Drones, high-speed conveyors, cooling fans, RC vehicles.
Coreless DC High torque-to-inertia ratio; extremely fast acceleration and deceleration. Standard H-bridge, but requires high-frequency PWM to avoid cogging. $15 - $60 Medical robotics, camera gimbals, precision positioning (low mass).

The Verdict: For 90% of DIY robotics and heavy-load automation, the Brushed DC gearmotor is the correct choice. It provides massive starting torque without the complex 3-phase commutation logic required by BLDC motors.

Sizing the Driver: The 2x Stall Current Rule

When sourcing a DC motor motor driver, the most common mistake is matching the driver's continuous current rating to the motor's continuous current rating. This ignores the physics of motor startup. When a DC motor is at 0 RPM (stalled or just starting), it acts as a dead short. It will pull its maximum stall current until it builds enough back-EMF to limit the draw.

The Sizing Rule of Thumb: Your motor driver's continuous current rating must be greater than or equal to the motor's stall current. If the datasheet only lists continuous current, multiply it by 2x to 3x to estimate the stall current, and size the driver for that peak.

Worked Load Example

Let's look at a standard 12V, 100 RPM planetary gearmotor (like the popular 775 or 520 form factors).

  • Free-run current: 0.4A
  • Continuous load current (rated torque): 2.0A
  • Stall current: 12.0A

If you pair this motor with the ubiquitous L298N driver module (rated for 2A continuous), the driver will instantly thermal-shutdown or melt the moment the motor starts under load. The L298N uses older bipolar junction transistor (BJT) technology, which drops about 2V across the IC and dissipates it as heat. Instead, you need a modern MOSFET-based driver like the BTS7960, which can handle 43A peak and roughly 15A-20A continuous with a heatsink.

Wiring and Terminal Identification (BTS7960)

The BTS7960 is a high-power half-bridge IC; a complete module uses two of them to form a full H-bridge. Here is the exact terminal mapping for a microcontroller (like an ESP32 or Arduino Nano):

  • B+ / B-: High-current motor power supply (e.g., 12V LiFePO4 or SLA battery). Use minimum 12 AWG silicone wire.
  • M+ / M-: Motor terminals. Keep these leads as short as possible to reduce inductive ringing.
  • VCC / GND: Logic power. Tie VCC to your microcontroller's 5V rail and GND to a common ground. Never float the ground.
  • PWM1 / PWM2: Connect to microcontroller PWM pins. Apply PWM to PWM1 for forward, PWM2 for reverse.
  • EN (Enable): Tie directly to VCC (5V) to keep the driver permanently enabled, or connect to a GPIO if you need to hard-disable the IC.

Decision Tree: Picking Your Exact DC Motor Motor Driver

Use this decision matrix to terminate your component search and pick a specific, proven module. This path assumes a standard brushed DC motor operating between 6V and 24V.

Load Profile (Current Draw) If your motor's Stall Current is... Then pick this exact Driver IC / Module Why this wins
Micro-loads
(Small servos, light pan/tilt)
< 3.2A Peak
(< 1.2A Cont.)
TB6612FNG
(e.g., Pololu #713)
Ultra-low MOSFET on-resistance (0.5Ω). Dual-channel in a tiny footprint. Vastly superior to the L293D.
Medium-loads
(Desktop rovers, 5kg arms)
3.2A - 10A Peak DRV8871
(e.g., Pololu #2961) or VNH5019
Texas Instruments DRV8871 handles up to 3.6A continuous with excellent thermal pad dissipation. VNH5019 handles up to 9A continuous.
Heavy-loads
(10-20kg rovers, winches)
10A - 43A Peak BTS7960
(Infineon based modules)
Massive current handling. Built-in overcurrent and overtemperature shutdown. Requires a heatsink and active airflow for >15A.
Extreme-loads
(E-bikes, large traction)
> 43A Peak Sabertooth 2x32
(Dimension Engineering)
Closed-loop thermal management, regenerative braking, and packetized serial control. Expensive (~$140), but bulletproof.

Failure Signatures: Reading Hum, Heat, and Stall

When your motor system fails, the physical symptoms will tell you exactly which subsystem is bottlenecking. Do not blindly swap parts; read the signatures.

  • Signature 1: Audible Humming or Buzzing Without Movement.
    Cause A: Your PWM frequency is too low (e.g., default Arduino analogWrite() is ~490Hz). The motor coils are physically vibrating at the switching frequency. Fix: Change the hardware timer registers to push PWM to 8kHz - 16kHz (ultrasonic range).
    Cause B: The driver is entering "hiccup mode" due to overcurrent protection tripping at startup. Fix: Implement a soft-start in code (ramp the PWM duty cycle from 0 to target over 500ms) to limit inrush current.
  • Signature 2: Driver Overheating (Too Hot to Touch).
    Cause: You are using a BJT-based driver (L298N/L293D) at currents above 1A, or you are operating a MOSFET driver without adequate heatsinking at high PWM frequencies. High PWM frequencies increase switching losses in the MOSFETs. Fix: Switch to a modern MOSFET driver (like the DRV8871) and ensure the logic ground and power ground share a low-impedance path to prevent ground bounce from partially opening the MOSFET gates.
  • Signature 3: Microcontroller Brownout / Reset on Motor Start.
    Cause: When the motor hits stall current, it drags the entire 12V battery rail down. If your microcontroller's 5V regulator is fed from that same sagging rail, the logic drops below 3.3V and resets. Fix: Use a dedicated UBEC (Universal Battery Elimination Circuit) or a buck converter to feed the microcontroller. Additionally, solder a 2200µF electrolytic capacitor directly across the M+ and M- terminals on the driver to act as a local energy reservoir during inrush.
Safety Caveat: When working with high-current DC motor motor driver setups (especially >20A), a dead short can instantly weld tools to terminals and ignite wire insulation. Always install an automotive-style blade fuse or an Anderson Powerpole inline fuse rated slightly above your continuous draw (e.g., 15A fuse for a 10A continuous load) on the positive battery lead. Never rely solely on the driver's internal thermal shutdown to protect your wiring.

The Default Recommendation: If you are starting a mid-sized DIY robotics project (a 10kg to 15kg rover) and need a reliable baseline, buy two 12V 100RPM BDC planetary gearmotors (rated ~2A continuous, ~12A stall) and wire them to two BTS7960 modules. Power the logic with a standalone 5V buck converter, put a 30A fuse on the main battery line, and run your PWM at 16kHz. This specific combination provides the best balance of cost, torque, and thermal headroom available on the hobbyist market today.