To achieve precise DC motor speed control, you must match the motor type to a dedicated driver using Pulse Width Modulation (PWM), sizing the driver for at least 1.5x the motor's continuous current and 1x its stall current. Simply applying a lower voltage via a resistor or linear regulator will burn up your components; switching the full supply voltage on and off at high frequencies is the only efficient way to manage speed and torque on the bench.

The Core DC Motor Types and Their Control Demands

Before wiring up a microcontroller, you need to know which motor type fits your load profile. Stepper and servo motors are designed for discrete positioning and closed-loop angular accuracy, not continuous variable-speed rotation. For continuous speed control, you are choosing between Brushed DC (BDC), Brushless DC (BLDC), and Coreless DC motors.

DC Motor Comparison for Speed Control Applications
Motor Type Torque Curve Profile Control Complexity Typical Cost (Unit) Best Load Profile
Brushed DC (BDC) Linear drop from stall to no-load Low (1 PWM pin + H-bridge) $5 – $25 Conveyors, winches, high starting torque
Brushless DC (BLDC) Flat torque up to base speed High (3-phase commutation + ESC) $30 – $120+ Drones, cooling fans, continuous high-RPM
Coreless DC High torque-to-inertia ratio Medium (PWM + encoder feedback) $15 – $60 Robotics joints, rapid acceleration/deceleration

Brushed motors are the workhorses of DIY speed control. You apply PWM to the gate of a MOSFET, and the speed scales linearly with the duty cycle. BLDC motors, however, demand an Electronic Speed Controller (ESC) or a dedicated 3-phase gate driver (like the TI DRV8312) to electronically commute the stator windings. If your load requires high efficiency and runs 24/7, pay the premium for BLDC. If you just need to spin a gearbox for a DIY automated blind, a BDC motor with a TB6612FNG driver is all you need.

Wiring, Terminals, and Sizing Your DC Drive

Getting the control logic right means nothing if your power stage melts. Let us break down terminal identification and the golden rule of driver sizing.

Terminal Identification

  • Brushed DC: Terminals are typically labeled A1/A2, M+/M-, or simply B+ and B-. Polarity dictates direction; swapping them reverses rotation.
  • Brushless DC: Power phases are labeled U, V, W (or A, B, C). If the motor has internal Hall effect sensors for commutation timing, you will also see Hall A, B, C plus VCC and GND for the sensor logic (usually 5V).

The Sizing Rule of Thumb

Never size a motor driver based on the motor's rated running current. When a motor starts, or when it hits a mechanical snag, it draws stall current. Your driver must survive this spike.

Sizing Formula:
Driver Continuous Current ≥ 1.5 × Motor Rated Current
Driver Peak Current ≥ Motor Stall Current

Worked Load Example

Suppose you are building an automated pet feeder using a 12V brushed DC gearmotor. The datasheet specifies a rated running current of 2.0A and a stall current of 8.0A.

  • Continuous Requirement: 1.5 × 2.0A = 3.0A minimum continuous rating.
  • Peak Requirement: 8.0A minimum peak rating.

If you choose a generic L298N driver (rated 2A continuous per channel), it will thermally shut down or melt the internal bipolar junction transistors the moment the auger jams. Instead, select a modern MOSFET-based driver like the Cytron MD10C (10A continuous, 30A peak) or the Pololu VNH5019 (6A continuous, 30A peak). Both will handle the 8A stall spike without breaking a sweat, and the MOSFETs will run cool at the 2A continuous load without needing a massive heatsink.

Reading Failure Signatures: Hum, Overheat, and Stall

When a DC speed control circuit fails, the motor and driver will usually tell you what went wrong before they die. Here is how to read the physical symptoms on the bench.

The Audible Hum or Buzz

If your motor emits a high-pitched whine or buzz that scales with speed, your PWM frequency is too low. Human hearing caps out around 16kHz to 20kHz. If your microcontroller is outputting a 1kHz or 4kHz PWM signal (the default on many Arduino analogWrite pins), the motor windings act as a speaker cone, vibrating at the switching frequency. The fix: Reconfigure your microcontroller's hardware timers to output a 20kHz to 25kHz PWM signal. This pushes the switching noise above the audible range and often results in smoother low-speed operation.

Driver or Motor Overheat

Overheating manifests in two distinct ways:

  1. Motor Overheat at Low Speeds: If you run a BDC motor at a 20% PWM duty cycle under heavy load, the effective RMS voltage is low, but the current remains high to satisfy the load torque. The motor's internal cooling fan (if equipped) is spinning too slowly to dissipate the I²R heat in the windings. The motor bakes from the inside out.
  2. Driver Overheat: If your MOSFET H-bridge gets too hot to touch, check your gate drive voltage. Logic-level MOSFETs need 5V to 10V on the gate to fully turn on. If you are driving a standard MOSFET directly from a 3.3V ESP32 GPIO pin, it may only partially turn on, operating in its linear (high-resistance) region. This turns your expensive driver board into a space heater. Always use a dedicated gate driver IC or a logic-level MOSFET module.

Hard Stall and Magic Smoke

A stall occurs when the mechanical load exceeds the motor's maximum torque, dropping the RPM to zero. When RPM hits zero, Back-EMF drops to zero, and the only thing limiting current is the tiny DC resistance of the copper windings. Current instantly spikes to the stall value. If your driver lacks overcurrent protection (OCP) and is undersized, the silicon die inside the MOSFET will exceed its thermal junction limit in milliseconds, resulting in a short circuit and visible magic smoke. Always use drivers with built-in OCP or add a fast-blow fuse on the main power feed.

DC Motor Speed Control FAQ

Can I use a potentiometer directly for DC motor speed control?

No. Wiring a potentiometer in series with a DC motor to drop the voltage is a recipe for a melted knob. A standard 10kΩ or even 100Ω potentiometer cannot dissipate the wattage generated by motor current. For example, dropping 6V across a pot at 2A requires the pot to dissipate 12W of heat; standard pots are rated for 0.1W to 0.5W. Instead, wire the potentiometer to an analog input pin on your microcontroller, read the voltage, and map that value to a PWM duty cycle output sent to a proper motor driver.

Why does my sensorless BLDC motor stutter at low speeds?

Sensorless Brushless DC controllers determine rotor position by reading the Back-EMF zero-crossing on the unenergized phase. At very low RPMs, the Back-EMF voltage is too weak and noisy for the controller's comparators to read accurately, causing the commutation timing to slip and the motor to stutter or stall. If your application requires smooth, high-torque operation at low RPMs (like a camera gimbal or a robotic arm joint), you must use a sensored BLDC motor with Hall effect sensors, or switch to a FOC (Field Oriented Control) driver that uses high-resolution current sensing instead of Back-EMF.

How do I choose the right PWM frequency for a brushed DC motor?

The sweet spot for most brushed DC motors is between 16kHz and 25kHz. Going below 16kHz introduces audible acoustic noise and can cause cogging at low speeds. Going above 30kHz increases switching losses in your MOSFETs, requiring heavier heatsinks and potentially causing EMI (Electromagnetic Interference) issues with nearby radios or sensors. Stick to 20kHz as your baseline; it is silent to human ears and highly efficient for standard logic-level MOSFETs.