The most efficient way to control the speed of a DC motor is by using Pulse Width Modulation (PWM) to switch a MOSFET on and off at high frequency, rather than dropping voltage linearly. By rapidly toggling the power supply, you dictate the average voltage the motor sees without burning the excess energy as heat. For a standard 12V brushed DC motor, a 50% PWM duty cycle effectively delivers 6V to the armature, yielding roughly half the no-load speed while maintaining high torque capability.

But picking the right driver IC, sizing it for stall conditions, and matching it to your specific motor topology is where most DIY builds fail. Below is the decision-forward guide to selecting your motor, sizing the silicon, and wiring it without frying your microcontroller.

The Core Method: PWM vs. Linear Voltage Control

Before selecting hardware, we must eliminate a common beginner mistake: using a potentiometer or a linear voltage regulator (like an LM317) to control motor speed.

Bench Rule: Never use linear resistance to control a motor drawing more than 50mA. A motor is not a static resistor; its current draw scales with mechanical load. If you use a linear regulator to drop 12V to 6V at 2A, the regulator must dissipate 12W of heat ($P = V_{drop} \times I$). It will trigger thermal shutdown in seconds.

PWM bypasses this by operating the switching MOSFETs in either the fully-on (low resistance) or fully-off (zero current) states. The transition between these states happens in nanoseconds. The motor's internal inductance smooths the pulsed DC into a continuous current flow. According to SparkFun's PWM guidelines, the ideal frequency for small-to-medium DC motors is between 1kHz and 20kHz. Frequencies below 500Hz cause visible cogging and torque ripple, while frequencies above 20kHz increase switching losses in the MOSFETs without providing mechanical benefit.

Motor Type Comparison: Which DC Motor Fits Your Load?

Not all "DC motors" are driven the same way. The controller you buy depends entirely on the commutation method inside the motor casing. Here is how the three primary DC motor types compare for speed control applications.

Motor Type Torque Curve & Profile Control Hardware Needed Relative Cost Best Application
Brushed DC (BDC) High starting torque; speed drops linearly as load increases. H-Bridge or Half-Bridge IC (PWM to gate). $ (Low) Wheeled robots, winches, linear actuators.
Brushless DC (BLDC) Flat torque curve; highly efficient at high RPMs. 3-Phase ESC (Electronic Speed Controller) with Hall sensors or FOC. $$$ (High) Drones, high-speed spindles, e-bikes.
Coreless DC Extremely low rotor inertia; near-instant acceleration/deceleration. High-frequency H-Bridge (requires fast PWM switching). $$ (Medium) RC servos, precision optics, medical robotics.

If your load requires high holding torque at zero speed or precise open-loop step counting, you are looking for a stepper motor, not a standard DC motor. Steppers and servos demand entirely different pulse-and-direction or closed-loop feedback architectures and should never be treated as interchangeable with standard BDC or BLDC motors in your driver selection.

Sizing the Driver: A Worked Load Example

The most frequent cause of melted motor driver modules is sizing the IC based on the motor's nominal running current rather than its stall current. When a motor starts from a dead stop, or hits a mechanical bind, it draws stall current—often 4 to 6 times higher than its running current.

The Sizing Rule of Thumb

Driver Continuous Current Rating $\ge$ 1.5 $\times$ Motor Stall Current.

Let's work through a real-world example using a common Mabuchi RS-550 12V brushed DC motor:

  • Nominal Running Current: 3.0A
  • Stall Current: 15.0A
  • Required Driver Capacity: 15.0A $\times$ 1.5 = 22.5A minimum continuous rating.

If you buy a standard L298N dual H-bridge (rated for 2A continuous, 3A peak), it will instantly overheat and trigger its internal thermal shutdown the moment the RS-550 tries to start under load. You need a high-power module like the BTS7960.

Wiring and Terminal Identification (BTS7960 Module)

For high-current brushed DC applications, the BTS7960 half-bridge module (typically sold as a dual-board H-bridge kit) is the workhorse. Here is the exact terminal mapping you need to wire it to a microcontroller and power supply:

Terminal Label Connection Target Function & Notes
B+ / B- Power Supply (e.g., 12V Battery) Main high-current input. Use 10 AWG wire for loads >15A.
M+ / M- DC Motor Terminals Motor output. Keep leads short to minimize EMI.
VCC / GND Microcontroller 5V/3.3V & GND Logic power for the optocouplers. Must share GND with MCU.
R_EN / L_EN MCU Digital Pins (or jumper to VCC) Enable pins for Right/Left half-bridges. Pull HIGH to enable.
R_PWM / L_PWM MCU Hardware PWM Pins Speed and direction control via duty cycle.
R_IS / L_IS MCU Analog (ADC) Pins (Optional) Current sense output. Outputs ~10mV per Amp for stall detection.

Decision Tree: Picking the Exact Driver IC

Don't waste time guessing which silicon to buy. Use this decision matrix to select the exact motor driver IC based on your motor's stall current and topology. According to Texas Instruments' motor driver topology guides, matching the driver's current capability to the motor's inductive kickback limits is critical for long-term reliability.

If Your Motor Stall Current Is... And Your Motor Type Is... Then Select This Driver IC / Module Typical Cost (2026)
< 1.2A Brushed DC (Dual Motor) TB6612FNG (Breakout board) $4 - $7
1.2A - 5A Brushed DC (Single Motor) DRV8871 or Pololu VNH5019 $6 - $12
5A - 25A Brushed DC (Single Motor) BTS7960 (43A peak module) $8 - $15
> 25A or 3-Phase BLDC / High-Power BDC VESC 6.6 or Discrete IRFB4427 H-Bridge $120+
The Default Pick: If you are building a standard 12V or 24V DIY robotics project, RC car, or automated gate using a brushed DC motor, buy the BTS7960 module. It handles up to 43A peak, features built-in flyback diodes, includes opto-isolation to protect your Arduino/ESP32 from voltage spikes, and costs roughly $10. It is the undisputed best-value driver for mid-power hobbyist loads.

Failure Signatures: Diagnosing Hum, Overheat, and Stall

When your motor drive system fails, it will usually tell you why through physical symptoms before the silicon actually melts. Here is how to read the failure signatures on the bench.

1. The Audible Hum or Whine

Symptom: The motor emits a high-pitched whine or low buzzing sound when holding position or moving slowly, even when unloaded.
Cause: Your PWM frequency is too low (typically below 16kHz). The motor windings and laminations act as a speaker cone, vibrating at the PWM switching frequency due to magnetostriction.
Fix: Increase the hardware timer frequency on your microcontroller. On an Arduino Uno, change the PWM timer prescaler to push Pin 9 and 10 to ~31kHz. On an ESP32, configure the LEDC peripheral to 16kHz or higher.

2. Driver Overheat and Thermal Shutdown

Symptom: The motor runs fine for 10 seconds, then stops. The driver IC is too hot to touch. It resumes after cooling down.
Cause: You are either undersizing the driver for the stall current, or you have introduced "shoot-through" in a custom H-bridge. Shoot-through occurs when both the high-side and low-side MOSFETs are on simultaneously for a fraction of a microsecond during switching, creating a dead short across the power supply.
Fix: Verify your driver's continuous rating against the 1.5x stall rule. If building a discrete H-bridge, ensure your gate driver IC (like an IR2110) has adequate dead-time insertion (typically 200ns - 500ns) to prevent cross-conduction.

3. Stall and Breakdown Torque Deficit

Symptom: The motor hums, draws massive current, but the shaft refuses to turn under load. The driver does not overheat immediately.
Cause: The PWM duty cycle is too low to overcome the static friction and breakaway torque of the load. DC motors require maximum voltage (100% duty cycle) to start moving heavy inertial loads, after which the PWM can be dialed back to maintain speed.
Fix: Implement a "soft start" routine in your code that ramps the PWM from 100% down to your target cruising speed over 200-500ms. Additionally, use the current sense (IS) pins on your driver to monitor for sustained stall conditions and cut power programmatically to prevent winding burnout.