

The PCA9685 is a 16-channel, 12-bit PWM (Pulse Width Modulation) controller designed for applications requiring precise control of multiple outputs. It is commonly used for controlling servos, LEDs, and other devices that require PWM signals. The PCA9685 communicates via the I2C protocol, making it easy to interface with microcontrollers such as Arduino, Raspberry Pi, and others. Its ability to control up to 16 channels simultaneously makes it ideal for robotics, lighting systems, and other multi-output applications.








The PCA9685 offers robust features for PWM signal generation. Below are its key technical specifications:
| Parameter | Value |
|---|---|
| Operating Voltage | 2.3V to 5.5V |
| Logic Voltage | 3.3V or 5V (I2C logic level compatible) |
| PWM Resolution | 12-bit (4096 steps) |
| Number of Channels | 16 |
| Maximum Output Current | 25mA per channel |
| Maximum Frequency | 1.6 kHz |
| Communication Protocol | I2C |
| Default I2C Address | 0x40 (configurable via address pins) |
| Operating Temperature | -40°C to +85°C |
The PCA9685 is typically available in a 28-pin package. Below is the pin configuration:
| Pin Name | Type | Description |
|---|---|---|
| VCC | Power | Power supply input (2.3V to 5.5V) |
| GND | Ground | Ground connection |
| SDA | Input/Output | I2C data line |
| SCL | Input | I2C clock line |
| OE | Input | Output enable (active low) |
| A0–A5 | Input | I2C address selection pins |
| LED0–LED15 | Output | PWM output channels |
| EXTCLK | Input | External clock input (optional) |
| V+ | Power | External power for driving LEDs or servos |
The PCA9685 is straightforward to use in a circuit. Below are the steps and considerations for using it effectively:
Below is an example of how to control a servo motor using the PCA9685 and Arduino UNO:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// Create an instance of the PCA9685 driver
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
void setup() {
// Initialize I2C communication
pwm.begin();
// Set the PWM frequency to 50 Hz (common for servos)
pwm.setPWMFreq(50);
}
void loop() {
// Set servo on channel 0 to a specific position
// 0 corresponds to 0 degrees, 4095 corresponds to 180 degrees
int servoMin = 150; // Minimum pulse length for 0 degrees
int servoMax = 600; // Maximum pulse length for 180 degrees
// Move servo to 90 degrees
int pulseLength = (servoMin + servoMax) / 2;
pwm.setPWM(0, 0, pulseLength);
delay(1000); // Wait for 1 second
}
No Response from PCA9685
PWM Outputs Not Working
Overheating
Flickering LEDs
Can I use multiple PCA9685 modules in one system?
What is the maximum number of servos I can control?
Can I use the PCA9685 with a 3.3V microcontroller?
What is the default I2C address of the PCA9685?
By following this documentation, you can effectively integrate the PCA9685 into your projects for precise PWM control.