DC motor speed control is achieved by varying the average voltage applied to the armature using Pulse Width Modulation (PWM). Unlike simple linear voltage reduction—which starves the motor of current and causes it to stall under load—PWM switches the full supply voltage on and off rapidly. This maintains the motor’s torque curve while adjusting RPM, making it the undisputed standard for everything from 5V Arduino robotics to 48V electric vehicle drivetrains.
Getting the speed right is only half the battle. If the motor is undersized for the load, or the driver lacks the thermal mass to handle stall currents, your system will fail. Here is how to match the motor, size the driver, and wire it without burning up your bench.
Matching the Motor to the Load Profile
Not every motor responds to PWM the same way. Selecting the right motor topology dictates your control complexity, cost, and torque delivery. Below is a benchmark comparison for a typical 200W (approx. 1/4 HP) continuous duty application.
| Motor Type | Torque Curve | Control Needs | Typical Cost (200W) |
|---|---|---|---|
| Brushed DC | High starting torque; linear drop-off as speed increases. | Simple 2-wire PWM via H-bridge or half-bridge MOSFET. | $15 – $40 |
| Brushless DC (BLDC) | Flat torque curve across mid-range; high efficiency. | 3-phase Electronic Speed Controller (ESC) with sensorless or Hall-sensor commutation. | $40 – $120 |
| Stepper | Massive holding torque at zero speed; drops sharply at high RPM. | Step/Direction pulse driver (e.g., TMC2209) with microstepping. | $25 – $60 |
| Servo (AC/DC) | Precise positional and velocity control; high dynamic response. | Dedicated servo drive with built-in encoder feedback loop. | $150 – $300+ |
For high starting torque and simple brushed DC driver integration, a standard brushed motor wins. If you need high efficiency and continuous duty without brush wear, step up to a BLDC, but expect to write or configure complex commutation logic.
Sizing Rule of Thumb and Worked Example
The Rule: Size your motor for 150% of the calculated continuous running torque. This margin absorbs startup inertia, voltage sag, and transient mechanical spikes without pushing the motor into its thermal limit.
Worked Example: You are building a small winch to lift a 20 kg (44 lb) payload on a drum with a 0.05m radius at a line speed of 0.5 m/s.
- Calculate Force: 20 kg × 9.81 m/s² = 196.2 N.
- Calculate Continuous Torque: 196.2 N × 0.05 m = 9.81 Nm.
- Apply 150% Sizing Rule: 9.81 Nm × 1.5 = 14.7 Nm required continuous torque.
- Calculate Target RPM: Drum circumference = 2 × π × 0.05m = 0.314m. Line speed (0.5 m/s) / 0.314m = 1.59 rev/s = 95 RPM.
- Calculate Mechanical Power: Torque × Angular Velocity = 14.7 Nm × (95 × 2π / 60) = 146 Watts.
The Selection: You need a ~200W motor. Because 95 RPM is too slow for a raw motor, select a 24V brushed DC motor paired with an integrated 50:1 planetary gearbox. Running the motor at 24V gives you headroom to use PWM to dial back the speed if the payload is lighter, while the gearbox multiplies the torque to handle the 14.7 Nm requirement.
Wiring, Terminals, and PWM Driver Selection
A microcontroller GPIO pin outputs roughly 40mA at 3.3V or 5V. Your 200W winch motor at 24V will pull over 8 Amps continuously, and up to 40 Amps at startup. You need a high-power H-bridge driver, like the widely available BTS7960 (rated for 43A peak), to isolate the logic from the power stage.
BTS7960 & Brushed DC Motor Terminal Identification
| Terminal Label | Function | Connection Target |
|---|---|---|
| M+ / M- (or A1/A2) | Motor Armature Output | Brushed DC motor brushes (polarity dictates direction) |
| B+ / B- | High-Power Supply Input | 24V DC power supply and main battery bank |
| VCC | Logic Level Supply | Arduino/ESP32 5V or 3.3V pin |
| GND | Common Ground | Must be tied to microcontroller GND |
| PWM / EN | Speed & Enable Logic | Microcontroller hardware PWM pin (Enable tied HIGH) |
| IS | Current Sense Output | Analog input (outputs voltage proportional to motor current) |
Bench Tip: Flyback Protection. While modern MOSFET H-bridges include internal body diodes, highly inductive loads (like winch motors with heavy gearboxes) generate massive voltage spikes when the PWM switches off. Always wire an external Schottky diode (e.g., 100V, 10A) in reverse parallel across the M+ and M- terminals to clamp inductive kickback and save your driver from catastrophic failure.
Diagnosing Failure Signatures: Hum, Overheat, and Stall
When a DC speed control system fails, it rarely does so silently. The physical symptoms tell you exactly where the electrical or mechanical mismatch lies.
1. The Audible Hum or Whine
Symptom: The motor emits a high-pitched whine or low buzz that scales with the PWM duty cycle.
Cause: Your PWM frequency is set within the human hearing range (typically between 1kHz and 16kHz). The rapid magnetic expansion and contraction of the stator laminations (magnetostriction) acts as a speaker cone.
Fix: Increase the PWM base frequency in your microcontroller code to at least 20 kHz (e.g., using Timer1 prescalers on an Arduino AVR or the LEDC API on an ESP32). This pushes the switching noise above human hearing.
2. Chronic Overheating at Low Speeds
Symptom: The motor casing becomes too hot to touch when running at 20% speed under load, even though the current draw seems nominal.
Cause: Most standard brushed DC motors rely on a shaft-mounted fan for cooling. When you use PWM to drop the speed to 20%, the fan spins at 20%, destroying the motor's forced-air cooling capacity while the copper windings still dissipate I²R heat.
Fix: If your application requires continuous high-torque operation at low RPM, you must either add an external blower fan for independent cooling, or derate the motor's continuous torque specification by 40-50% for low-speed duty.
3. Hard Stall and Driver Trip
Symptom: The motor stops abruptly, the driver shuts down, or the power supply voltage sags heavily.
Cause: The mechanical load exceeded the motor's breakdown torque. At a stall, the back-EMF drops to zero, and the only thing limiting current is the armature's internal resistance ($I_{stall} = V_{supply} / R_{armature}$). This causes a massive current spike.
Fix: Verify your driver has hardware Overcurrent Protection (OCP) configured below the motor's thermal damage threshold. If the stall is a normal part of the operation (like a winch hitting the top limit), implement a current-sense feedback loop using the driver's IS pin to cut the PWM duty cycle to zero when stall current is detected.
DC Motor Speed Control FAQ
How does PWM affect DC motor speed control torque at low RPM?
Unlike a linear voltage regulator, which reduces both voltage and available current (killing your torque), PWM delivers the full supply voltage in rapid pulses. Because motor torque is directly proportional to the average armature current, and the inductance of the motor windings smooths out the current pulses, a PWM-driven motor maintains near-maximum torque even at 10% duty cycle. This is why PWM is vastly superior to resistive or linear voltage dropping for speed control.
Can I use an AC TRIAC dimmer for DC motor speed control?
No. Standard AC light dimmers use TRIACs, which rely on the AC sine wave crossing zero volts 120 times a second to naturally commutate (turn off). DC voltage never crosses zero. If you trigger a TRIAC with a DC source, it will latch permanently ON, sending full unregulated voltage to the motor and likely destroying the dimmer switch due to overcurrent. Always use MOSFET-based H-bridges or buck converters for DC control.
What is the difference between open-loop and closed-loop DC motor speed control?
Open-loop control blindly sends a fixed PWM duty cycle to the motor. If the mechanical load increases, the motor slows down. Closed-loop control adds an encoder or tachometer to measure actual shaft RPM. A PID controller on your microprocessor constantly compares the target RPM to the actual RPM, dynamically increasing or decreasing the PWM duty cycle to maintain a constant speed regardless of load variations. Closed-loop is mandatory for applications like conveyor synchronization or CNC spindle drives.
Why does my microcontroller reset when the DC motor starts up?
This is a classic brownout caused by poor power isolation. When a DC motor starts, it pulls stall current (often 5x to 10x its running current). If the motor and the microcontroller share the same power supply without adequate decoupling, this massive current draw causes the supply voltage to sag below the microcontroller's minimum operating threshold (e.g., dropping a 5V rail to 3V). Fix this by powering the motor and logic from separate voltage regulators, or by adding a large bulk capacitor (e.g., 2200µF) directly across the motor driver's B+ and B- terminals to supply the transient startup surge.






