Sleep is the default
An unconnected SLP pin is not floating and occasionally lucky. A 500 kilohm pulldown inside the chip holds it low, so the driver arrives asleep — with the red power LED lit, looking ready.
Low by design, not by accident
SLP is active low, which by itself would mean an unconnected pin is undefined. It is not undefined here. The chip has a 500 kΩ pulldown on that pin, and this board fits no pull-up, so an unwired SLP is a definite, repeatable low on every board you will ever pick up. The back of the board says so in capitals: SLP MUST BE HIGH TO ENABLE IC.
The consequence is the most common support question about this part: a correctly wired board with nothing on SLP does nothing at all. No sound, no twitch. Every other pin is connected, every voltage is right, and the driver is asleep.
The LED is not a ready light
The red LED on the board sits across VM through a 5.1 kΩ resistor. It is lit whenever VM is present, and it knows nothing about SLP. A lit LED proves the supply arrived; it does not prove the driver is awake.
It also means an asleep board is not drawing the chip's 1.6 µA sleep current. Worked out rather than measured, the LED alone takes about 0.6 mA at 5 V and about 1.7 mA at 10.8 V. If a parked robot has to last on a battery, sleeping the driver saves the chip's share and not the LED's.
The threshold is the second trap
SLP is only sure to read high at 2.5 V, and only sure to read low at 0.5 V. AIN1, AIN2, BIN1 and BIN2 read high at 2.0 V.
A 3.3 V GPIO clears both, and that is the normal case. The trap is a signal in the band between 2.0 and 2.5 V, which drives the motor inputs correctly and may leave SLP reading low. (1.8 V logic is not that trap: it is below 2.0 V and fails every input.)
Wire it, or tie it through a resistor
Drive SLP from a GPIO, set it high in setup(), and allow up to 1 ms before the
first motor command. That version gives you a way to switch the outputs off in
one instruction, which is useful in a fault handler.
If the design never needs to sleep the driver, tie SLP to VM through a 20 to 75 kΩ resistor, never a bare wire. The pin clamps itself at 6.5 V and more than 250 µA into it can damage it; the resistor is TI's recommendation for exactly this. On a low supply, pick the low end of that range: the resistor and the 500 kΩ pulldown form a divider, and at VM 2.7 V a 75 kΩ resistor leaves SLP at about 2.35 V, short of 2.5 V. What you cannot do is leave it unconnected and expect the board to behave as though you had wired it.
The code
The smallest sketch that proves the board works, on an ESP32-S3. It wakes the driver, turns Motor A one way for a second, then the other, and prints what it is doing so a silent motor can be told apart from a sketch that is not running.
// DRV8833 wiring for this sketch (ESP32-S3).
//
// GND -> GND common with the motor supply's ground
// VM -> 2.7-10.8 V motor supply. There is no logic supply pin.
// SLP -> GPIO 4 high to run; pulled low in the chip, so not optional
// AIN1 -> GPIO 5 channel A
// AIN2 -> GPIO 6 channel A
// Motor A across AOUT1 and AOUT2.
//
// Arduino IDE, Tools menu (esp32 core 3.x):
// Board ESP32S3 Dev Module
// USB CDC On Boot Enabled (Disabled if your USB goes through a
// USB-serial chip)
// Flash Size 16MB (128Mb)
// PSRAM OPI PSRAM
// Serial Monitor at 115200. No library needed.
const int SLP = 4;
const int AIN1 = 5;
const int AIN2 = 6;
void setup() {
Serial.begin(115200);
pinMode(SLP, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
// Nothing below this line does anything until the driver is awake.
digitalWrite(SLP, HIGH);
delay(1); // tWAKE: up to 1 ms
Serial.println("SLP high - driver awake");
}
void loop() {
Serial.println("forward");
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
delay(1000);
Serial.println("coast");
digitalWrite(AIN1, LOW);
delay(500);
Serial.println("reverse");
digitalWrite(AIN2, HIGH);
delay(1000);
Serial.println("coast");
digitalWrite(AIN2, LOW);
delay(500);
}If the serial output steps through and nothing turns, the problem is downstream of SLP — supply, wiring or the motor itself. If the output does not appear at all, the sketch is not running and the driver is not the suspect.
When it does not work
This is what an asleep driver looks like. The LED only needs VM, so it lights whether the chip is asleep or not, and it draws far more than the chip's own 1.6 microamp sleep current, so a meter on the supply will not show you the difference either. Check that SLP is actually high at the pin, with a meter, not in the code.
SLP needs 2.5 V to be sure of reading high, where AIN1, AIN2, BIN1 and BIN2 need 2.0 V. A 3.3 V pin clears both. A signal that lands between 2.0 and 2.5 V, such as the output of a divider somebody added to be careful, drives the motor inputs correctly and may leave the driver asleep.
Check that SLP is driven rather than left as an input after a reset, and that nothing else in the sketch reconfigures that pin. The internal pulldown is only 500 kilohm, but it does not need to be strong to win against a pin that is not driving anything.
With the driver awake, each channel reads its two inputs as a pair. Four combinations, two of which stop the motor in different ways, and two ways to put PWM on the rest.
The four states →Edit this page — content/books/drv8833/sleep-is-the-default.mdx
Questions about this product
See what other owners have asked, and read their solutions.
DRV8833 Dual Motor Driver
Loading discussions…
Discuss this article
Ask about this page. The answer stays here, on the page it belongs to, for whoever hits the same wall next.