When makers search for a 'PWM electric motor,' they are usually looking for a motor that can be speed-controlled via Pulse Width Modulation from a microcontroller. The motor itself doesn't care about PWM; it just sees an averaged DC voltage. The magic happens in the driver circuit that chops your battery or power supply voltage into high-frequency pulses based on your ESP32 or Arduino's logic signals.
If you need a direct answer for a general-purpose, high-torque DIY project (like a conveyor, a winch, or a heavy-duty robotic chassis): use a 12V RS-775 Brushed DC motor paired with a BTS7960 43A motor driver. This combination costs under $30, handles massive stall currents without frying, and interfaces directly with 3.3V or 5V logic. Below is the exact engineering framework to verify this pick for your specific load, wire it safely, and troubleshoot it when it inevitably misbehaves on the bench.
Motor Type Comparison: Brushed DC vs. BLDC vs. Stepper
Before sizing, you must lock in the motor topology. Steppers and servos are fundamentally different beasts and are not interchangeable with standard DC traction motors. Here is how the three main embedded-controlled motors stack up in 2026.
| Motor Type | Torque Curve | Control Needs | Typical Cost (2026) | Best Application |
|---|---|---|---|---|
| Brushed DC (e.g., 775) | Maximum torque at 0 RPM (stall), drops linearly as speed increases. | Simple H-Bridge or half-bridge. 1x PWM pin for speed, 2x GPIO for direction. | $12 - $25 (motor + driver) | Winches, conveyors, drive trains where high starting torque is needed. |
| Brushless DC (BLDC) | High peak torque, flat mid-range, drops at high RPM. Highly efficient. | 3-Phase ESC or custom FOC (Field Oriented Control) driver. Requires hall sensors or sensorless back-EMF zero-cross detection. | $45 - $90 (motor + ESC) | Drones, high-speed RC vehicles, cooling fans, high-RPM spindles. |
| Stepper (e.g., NEMA 23) | High holding torque at 0 RPM, torque drops off sharply above 1000 RPM. | Step/Dir pulses. Requires a dedicated chopper driver (e.g., TB6600) to manage coil current decay. | $35 - $60 (motor + driver) | CNC routers, 3D printers, precision linear actuators. |
Sizing Rule of Thumb and Worked Load Example
Do not size a motor by 'horsepower' or 'watts' without knowing your load's torque requirement. Power is just torque multiplied by speed. If you pick a high-speed, low-torque motor for a heavy load, it will stall and burn out.
The Sizing Rule of Thumb: Calculate your required stall torque, add a 50% safety margin for startup inertia and friction, and select a motor whose stall torque (or geared output torque) exceeds that number.
Worked Example: 5kg Mass on a 10cm Pulley
Let's say you are building a small belt-driven conveyor to move 5kg (approx. 11 lbs) of material, driven by a pulley with a 5cm (0.05m) radius.
- Calculate Force (F): Mass × Gravity = 5 kg × 9.81 m/s² = 49.05 Newtons.
- Calculate Required Torque (T): Force × Radius = 49.05 N × 0.05 m = 2.45 Nm.
- Apply Safety Margin: 2.45 Nm × 1.5 = 3.67 Nm required at the shaft.
A bare 12V RS-775 motor produces about 0.3 Nm of stall torque at 12,000 RPM. This is useless for our conveyor. However, if we buy an RS-775 with an integrated 36:1 planetary gearbox, the output speed drops to ~330 RPM, but the torque multiplies to roughly 10.8 Nm (accounting for ~90% gearbox efficiency). This easily clears our 3.67 Nm requirement, leaving plenty of overhead for belt tension and bearing friction.
Wiring, Terminals, and Driver Selection
To drive a high-current brushed DC motor with PWM, you need a motor driver capable of handling the stall current. The BTS7960 (often sold as the IBT-2 module) is the undisputed king of DIY high-current motor control. It handles up to 43A continuous and costs about $12.
Terminal Identification and Wiring
| BTS7960 Pin | Connection | Notes & Edge Cases |
|---|---|---|
| B+ / B- | 12V or 24V Power Supply | Use at least 10 AWG wire for the main power feed. A 12V 775 can pull 20A+ at stall. |
| M+ / M- | Motor Terminals | Keep these wires short and thick. Solder directly to the motor tabs; spade connectors will vibrate loose. |
| VCC / GND | 5V / GND from MCU | Powers the optocouplers on the board. Must share a common ground with your ESP32/Arduino. |
| R_PWM / L_PWM | MCU PWM Pins | R_PWM controls clockwise speed, L_PWM controls counter-clockwise. Feed a 1kHz - 5kHz PWM signal here. |
| R_EN / L_EN | MCU GPIO or tied to VCC | Enable pins. Tie them to 5V if you don't need to disable the driver via code. |
For the microcontroller code, the ESP32's LEDC (LED Control) peripheral is ideal for generating hardware PWM. According to the official Espressif LEDC documentation, you should configure the PWM frequency to at least 1000 Hz to avoid audible whining from the motor windings, but keep it below 20 kHz to prevent excessive switching losses and heating in the MOSFETs.
Failure Signatures: Hum, Overheat, and Stall
When your PWM electric motor setup fails, it rarely just 'stops working.' It gives you physical and electrical symptoms. Here is how to read them.
- Symptom: Loud Humming / Whining without Rotation.
Cause 1: Your PWM frequency is too low (e.g., 50 Hz - 500 Hz). The motor windings are physically vibrating at the switching frequency. Fix: Increase PWM frequency to 2 kHz.
Cause 2: Static friction (stiction) of your load is higher than the motor's starting torque. The motor is in a stalled state, drawing maximum current. Fix: Implement a 'kickstart' routine in code: apply 100% duty cycle for 200ms to break static friction, then drop to your target PWM speed. - Symptom: Motor Overheating at Low Speeds.
Cause: Most 775 and similar brushed DC motors rely on a fan attached directly to the rotor shaft for cooling. If you run the motor at a 20% PWM duty cycle, the fan is also spinning at 20%, providing almost zero airflow while the windings are still dissipating $I^2R$ heat. Fix: Add an external 12V PC fan blowing directly on the motor casing, or use a higher gear reduction so the motor spins faster internally for the same output speed. - Symptom: Sudden Shutdown / Driver Clicking.
Cause: The BTS7960 has built-in thermal shutdown and overcurrent protection. If the motor stalls mechanically, current spikes to 30A+, triggering the protection circuit. Fix: Read the IS (current sense) pin on the BTS7960 with your microcontroller's ADC. If the voltage exceeds 2.5V, immediately set PWM to 0 in software to prevent hardware damage.
The Decision Tree: Picking Your Exact Motor and Driver
Use this decision matrix to finalize your Bill of Materials. Do not overcomplicate the drive system if a simpler topology meets your torque and speed requirements.
| If your project requires... | Then choose this Motor Type | And this Driver / Controller |
|---|---|---|
| High starting torque, continuous rotation, simple speed control, budget < $30. | 12V Brushed DC with Planetary Gearbox (e.g., RS-775 36:1) | BTS7960 (IBT-2) 43A Half-Bridge Driver |
| High RPM (10,000+), lightweight, high efficiency, battery-powered RC/drone. | 2212 or 2306 Brushless DC (BLDC) Outrunner | 30A - 40A Brushless ESC (Electronic Speed Controller) |
| Precise open-loop positioning, holding torque at 0 RPM, low speed (< 1000 RPM). | NEMA 23 Bipolar Stepper Motor | TB6600 Microstepping Driver (set to 1/8 or 1/16 stepping) |
| Closed-loop absolute positioning, dynamic load changes, high-speed precision. | AC or DC Servo Motor with Encoder | Dedicated Servo Drive (e.g., ODrive or M5Stack Servo Kit) |
The Default Concrete Pick
If you are building a general-purpose automated mechanism—like an automated pet feeder, a motorized camera slider, or a small winch—and you are paralyzed by choice, buy the 12V RS-775 Brushed DC Motor (with a 10:1 to 36:1 gearbox depending on your speed needs) and the BTS7960 driver module.
This specific combination is the most thoroughly documented, forgiving, and robust PWM electric motor setup in the maker ecosystem. The BTS7960 will easily survive the inevitable wiring mistakes and stall conditions that occur during prototyping, and the 775 motor provides more than enough mechanical grunt to move real-world loads without requiring complex 3-phase commutation code or expensive FOC drivers. Wire it up, set your ESP32 LEDC peripheral to 2000 Hz, and start tuning your PID loops.






