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.
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+ |
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.






