Pulse width motor control is the backbone of modern motion systems, replacing wasteful linear voltage dropping with high-efficiency switching. By rapidly toggling the power supply to the motor windings, you dictate the average voltage—and therefore the speed and torque—while keeping the power electronics relatively cool. But simply feeding a 5V microcontroller PWM signal into a massive inductive load is a fast track to melted silicon. Effective pulse width motor control requires matching the motor’s torque curve to the correct driver topology, sizing the MOSFETs for stall conditions, and managing the inductive kickback that tries to destroy your circuit the moment the switch opens.
Which Motor Type Fits Your Load Profile?
Before selecting a driver, you must define the mechanical load. Different motors react to PWM in fundamentally different ways. A common mistake among hobbyists is treating all DC motors the same, or worse, assuming stepper motors and servos are interchangeable. They are not: a stepper requires a constant-current chopper drive to maintain holding torque, while a standard hobby servo only expects a low-power 50Hz positional pulse, not a power-stage PWM signal.
The table below breaks down how the four primary motor families respond to pulse width motor control, helping you match the right electromechanical actuator to your specific application.
| Motor Type | Torque Curve Profile | PWM Control Needs | Typical Cost (10-50Nm range) |
|---|---|---|---|
| Brushed DC | High starting torque, drops linearly as speed increases. | Simple 1-channel PWM for speed; H-bridge for direction. Frequency: 1kHz–20kHz. | $15 – $45 |
| Brushless DC (BLDC) | Flat, high-efficiency torque curve across a wide RPM band. | 3-phase Electronic Speed Controller (ESC) with Hall sensors or sensorless FOC commutation. | $60 – $150 |
| Stepper | Massive holding torque at zero RPM, falls off sharply at high speeds. | Constant-current chopper drives (PWM regulates current, not voltage). Microstepping required for smooth motion. | $35 – $90 |
| AC Induction | Low starting torque, peaks near synchronous speed. | Variable Frequency Drive (VFD) using complex 3-phase space vector PWM (SVPWM). | $180 – $350+ |
Sizing the Driver: Rules of Thumb and Worked Examples
The most frequent cause of driver failure in DIY pulse width motor control projects is undersizing the MOSFETs based on the motor’s nominal continuous current rather than its stall current. When a motor starts from a dead stop, or jams against a mechanical limit, it acts like a short circuit. The current spikes to the stall limit, limited only by the winding resistance and the power supply.
The Sizing Rule of Thumb: Size the driver’s continuous current rating to at least 1.5× the motor’s expected continuous operating load, and ensure the driver’s absolute peak current limit exceeds the motor’s stall current by at least 20%. According to Texas Instruments' motor drive design guidelines, accounting for thermal derating in enclosed spaces is critical, as a driver rated for 10A on an open bench may only safely handle 6A inside a sealed project box.
Worked Load Example: Sizing for a Mabuchi RS-550
Let’s size a driver for a standard 12V brushed DC Mabuchi RS-550 motor, commonly used in power tools and robotics.
- Nominal Voltage: 12V DC
- Continuous Current: 4.5A (under typical mechanical load)
- Stall Current: 18A (calculated from winding resistance of ~0.66Ω)
Applying our rule of thumb:
Continuous Requirement: 4.5A × 1.5 = 6.75A minimum continuous driver rating.
Peak Requirement: 18A × 1.2 = 21.6A minimum peak driver rating.
A popular hobby module like the Cytron MD10C (10A continuous, 30A peak) is an excellent fit here. It comfortably exceeds the 6.75A continuous requirement and handles the 21.6A startup spike. However, if you were using a cheaper L298N dual H-bridge (rated for only 2A continuous per channel), the motor would instantly trigger the chip's thermal shutdown—or melt the silicon—on the very first startup.
Wiring and Terminal Identification
When wiring a high-power brushed DC driver (like the BTS7960 or Cytron MD10C), proper terminal identification prevents catastrophic ground loops. Here is the standard pinout for a high-current PWM motor controller:
| Terminal Label | Function | Wiring Spec / Notes |
|---|---|---|
| B+ / VCC | Main Power Input | Connect to battery/supply positive. Use wire gauge rated for stall current (e.g., 12 AWG for 20A). |
| B- / GND | Power Ground | Must share a common ground with the microcontroller. Use thick wire to prevent ground bounce. |
| M+ / M- | Motor Output | Connect to motor brushes. Polarity dictates default forward direction. |
| PWM | Speed Control Signal | Logic level (3.3V or 5V). Do NOT connect to main power. |
| DIR | Direction Control | Logic HIGH for forward, LOW for reverse (on H-bridge topologies). |
| EN | Enable / Chip Select | Usually pulled HIGH internally. Pull LOW to put the driver in sleep mode. |
Failure Signatures: Hum, Overheat, and Stall
Motors and drivers communicate their distress through distinct physical signatures. Recognizing these early saves you from replacing fried MOSFETs and rewinding burnt armatures.
The Audible Hum (Acoustic Noise)
If your motor emits a loud, high-pitched whine or hum during operation, your PWM frequency is likely too low. When pulse width motor control operates between 50Hz and 500Hz, the rapid expansion and contraction of the motor windings' magnetic fields vibrate the stator laminations at an audible frequency.
The Fix: Increase the PWM frequency to at least 16kHz to 20kHz. This pushes the switching noise above the human hearing range. Note that going above 25kHz increases switching losses in the MOSFETs, so 16kHz–20kHz is the ideal sweet spot for brushed DC motors.
Driver Overheat (Thermal Runaway)
If the driver’s heatsink becomes too hot to touch within minutes, but the motor current is well within the rated limits, you are likely suffering from slow gate switching. Microcontroller GPIO pins (like those on an Arduino Uno or ESP32) can only source about 20mA to 40mA. This is barely enough to charge the gate capacitance of a large power MOSFET. The MOSFET spends too much time lingering in its "linear region" (partially on), where it acts as a high-value resistor and dissipates massive amounts of heat.
The Fix: Never drive high-power discrete MOSFETs directly from a microcontroller. Use a dedicated gate driver IC (like the IR2104 or TC4420) between your PWM pin and the MOSFET gate to provide the 1A–2A peak current needed to snap the MOSFET fully on and off in nanoseconds.
Stall and Sudden Death (Inductive Kickback)
If the motor jams, stalls, or is suddenly reversed, and the driver instantly dies (often with a cracked IC package or a shorted output), you have been killed by inductive kickback. Motor windings are inductors. When you interrupt current flow through an inductor, it generates a massive reverse voltage spike ($V = -L \frac{di}{dt}$) to keep the current moving. This spike can easily exceed 100V, punching through the 30V $V_{DS}$ rating of your driver’s MOSFETs.
The Fix: Ensure your driver module has integrated flyback diodes. If building a custom H-bridge, place fast-recovery Schottky diodes (like the SS34 or MBRS340) across the motor terminals and from the motor terminals to the power rails. Standard 1N4007 rectifier diodes are too slow to clamp the spike before the MOSFET fails.
Matching the Controller to the Drive Demands
The final piece of the puzzle is ensuring your microcontroller can actually generate the pulse width motor control signals the driver demands. Not all PWM outputs are created equal.
For basic brushed DC speed control, an Arduino’s analogWrite() function (which defaults to ~490Hz on most pins) is adequate for prototyping, but you must manually reconfigure the hardware timers to push the frequency to 16kHz to avoid the acoustic hum mentioned earlier.
For BLDC and stepper motors, the demands are much stricter. A BLDC requires three distinct, phase-shifted PWM signals with "dead-time" insertion—a microsecond delay where both the high-side and low-side MOSFETs are off to prevent shoot-through (a direct short from VCC to GND). Generating this reliably in software is nearly impossible without jitter. Instead, rely on microcontrollers with dedicated hardware motor-control peripherals, such as the STM32 Advanced Control Timers or the ESP32’s MCPWM (Motor Control Pulse Width Modulation) peripheral. These hardware modules handle dead-time insertion and fault-braking automatically, ensuring your pulse width motor control remains stable even if your main code loop experiences a watchdog reset or interrupt delay.
By respecting the torque curves, sizing for stall conditions, and managing the high-frequency switching physics, you transition from simply spinning a motor to engineering a reliable, efficient motion system.






