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.
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 ArduinoanalogWrite()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.
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.






