AW2013 LED驱动芯片 工作方式介绍
单通道最大恒流输出:15mA,支持 4 级可调(0 / 5 / 10 / 15 mA)每通道 256 级 PWM 控制亮度PWM控制模式:MCU 定时写寄存器调节亮度一次性编程(One Shot Programming)模式:芯片自动跑呼吸灯动画支持 Fade in/out(亮度平滑过渡)支持中断 INTN(低电平有效)内部集成振荡器和LDO供电:VCC = 2.5V ~ 3.3VI2C 最高频率
根据您上传的 AW2013 芯片手册,我将为您分三个部分详细解读:
一、芯片简介(AW2013 概述)
AW2013 是一款 3 通道的 I²C 控制恒流 LED 驱动芯片,支持以下功能:
-
单通道最大恒流输出:15mA,支持 4 级可调(0 / 5 / 10 / 15 mA)
-
每通道 256 级 PWM 控制亮度
-
两种控制模式:
- PWM控制模式:MCU 定时写寄存器调节亮度
- 一次性编程(One Shot Programming)模式:芯片自动跑呼吸灯动画
-
支持 Fade in/out(亮度平滑过渡)
-
支持中断 INTN(低电平有效)
-
内部集成振荡器和LDO
-
供电:VCC = 2.5V ~ 3.3V
-
I2C 最高频率:400kHz
-
默认地址:
0x45(可配置)
二、实用配置流程
以配置 LED0 为呼吸灯效果,频率 2Hz,占空比 80% 为例,推荐使用 One Shot Programming 模式:
1. 上电初始化(必要)
write_reg(0x00, 0x55); // Soft Reset
write_reg(0x01, 0x01); // GCR: ENABLE = 1
2. 配置 LED0 通道工作模式
// 设置 LED0 为 One Shot 模式 + 最大电流(15mA)
write_reg(0x31, 0b00010011); // LCFG0: MD=1, IMAX=11
3. 设置呼吸灯节奏(T0~T4 时间)
呼吸灯周期:T1 + T2 + T3 + T4,设置为约 0.5s(约2Hz频率)
// LED0T0: T1=001(0.26s), T2=001(0.26s)
write_reg(0x37, (1 << 4) | 1);
// LED0T1: T3=000(0.13s), T4=000(0.13s)
write_reg(0x38, (0 << 4) | 0);
// LED0T2: T0=0000(0s), REPEAT=0000(无限循环)
write_reg(0x39, 0x00);
4. 使能 LED0 输出
write_reg(0x30, 0x01); // LCTR: LE0=1
三、寄存器总结与地址映射
| 地址 | 寄存器名 | 说明 |
|---|---|---|
00h |
RSTR |
写入 0x55 触发软件复位 |
01h |
GCR |
全局控制(ENABLE 开启芯片) |
02h |
ISR |
中断状态(如呼吸结束、上电) |
30h |
LCTR |
各通道开关(LE0 ~ LE2) |
31h~33h |
LCFGx |
模式配置(MD 模式 / IMAX 电流 / Fade) |
34h~36h |
PWMx |
PWM亮度(仅 PWM 模式生效) |
37h~3Fh |
LEDxTn |
呼吸模式时序配置 |
77h |
IADR |
修改I2C地址 |
四、注意事项和建议
- 建议每次上电或复位后重新配置所有寄存器。
- Fade in/out 仅在 PWM 模式 下生效。
- One Shot 模式配置完 T0~T4 后,写
PWMx.MD=1才开始跑动画。 - INTN 引脚可以通过读取
ISR判断哪个通道完成动画。 - 上拉电阻建议使用 4.7kΩ。
如果你有多个 LED 需要同时呼吸同步,请使用如下顺序配置三个通道:
write_reg(0x30, 0x00); // 关闭所有通道
write_reg(0x31, 0x00); // 设置为 PWM 模式(先暂时禁止 One Shot)
write_reg(0x32, 0x00);
write_reg(0x33, 0x00);
// 配置 T0~T4 ...
write_reg(0x37, ...); // LED0 T0~T4
write_reg(0x3A, ...); // LED1
write_reg(0x3D, ...); // LED2
write_reg(0x31, 0x13); // MD = 1,IMAX=15mA
write_reg(0x32, 0x13);
write_reg(0x33, 0x13);
write_reg(0x30, 0x07); // 使能三个 LED(同步启动)
如需我帮您写一个完整应用层 C 示例或 ioctl 控制流程,也可以继续提问。
这是一个非常好的问题,很多人第一次看 AW2013 的“PWM 控制模式” 和 “One Shot Programming 模式”时都会疑惑:它们都是为了实现呼吸灯,区别在哪?
我来帮你深入本质地理解这两种模式的核心差异:
🌟一图概括
| 对比项 | PWM 控制模式 | One Shot 编程模式 |
|---|---|---|
| 控制方式 | MCU 实时写 PWM 寄存器 | MCU 只写一次,芯片自动运行 |
| 呼吸逻辑 | MCU 自己每 N 毫秒改变亮度 | 芯片内部定时器负责自动调节亮度 |
| 占用 MCU | 高(需周期性操作) | 低(配置完自动运行) |
| 动画复杂性 | 自由度高,需 MCU 配合 | 程序预设的动画结构 |
| 是否支持 Fade | 支持(FI / FO 位控制) | 自动包含 Fade 效果 |
| 适合场景 | 自定义灯效,如音乐节奏灯 | 简单、节能、预设呼吸灯 |
🎯详细解释每种模式
✅ PWM 控制模式(LCFGx.MD = 0)
MCU主动控制,每次调亮度都要写寄存器
-
你在 MCU 上运行一个定时器,比如每 50ms 写一次亮度值:
write_reg(PWM0, val); // val 从 0 到 255 缓慢变化 -
如果启用了 Fade-in / Fade-out(FI / FO 位),会有平滑过渡效果。
-
本质上:MCU 自己写“动画帧”,芯片只执行亮度变化。
🟡 优点:
- 灵活,亮度随音频或状态变化。
- 动画可以自定义成任何形状(不是只有呼吸)。
🔴 缺点:
- MCU 开销大。
- 需要 MCU 持续参与。
✅ One Shot Programming 模式(LCFGx.MD = 1)
MCU只配置一次,芯片自动按照时序完成呼吸效果。
- 设置 T0~T4 寄存器(定义呼吸灯动画的时间点)
- 写入 LEDxT2 时立即启动一次动画
- 可设置重复次数(0 = 无限循环)
🌈 呼吸周期包含:
T0(延迟)→ T1(亮度上升)→ T2(保持高亮)→ T3(下降)→ T4(低亮等待)→ 重复
🟢 优点:
- MCU 解放了,节能。
- 动画由 AW2013 自动控制,定时精确。
- 可以实现 3 通道异步 / RGB 自动轮换呼吸等效果。
🔴 缺点:
- 动画形式固定为「呼吸」结构。
- 如果想要自定义复杂灯效(闪烁、律动),就做不到了。
❓"一次性编程" 是“只跑一次”吗?
不是。它的“One Shot”指的是“一次性写入配置即可运行完整呼吸流程”,并不是“只运行一次”。
你可以通过 REPEAT 字段设置循环次数:
REPEAT = 0:无限循环呼吸灯REPEAT = 1~15:呼吸灯动画运行指定次数后自动停止
当动画完成后,可通过中断或轮询 ISR 中的 LISx 位判断哪个通道结束。
✅ 总结建议
| 场景 | 推荐模式 |
|---|---|
| 要做精确的 RGB 呼吸灯(不同通道异步) | One Shot 模式 |
| 要实现亮度跟随状态/节奏/外部传感器 | PWM 模式 |
| 要节能、MCU 低占用 | One Shot 模式 |
| 要做频闪、闪烁、跑马灯等复杂动态 | PWM 模式 |
需要我给你写一个 PWM 模式的呼吸灯 MCU demo、和 One Shot 模式的完整初始化流程吗?
好的,我们分别来看:
✅ 一、PWM 模式下 MCU 控制呼吸灯(示例代码)
此方案是 MCU 以定时器为基础,不断更改 LED 亮度值来实现呼吸灯效果。
💡 思路
- 初始化 AW2013 芯片
- 设置为 PWM 模式,开启 LED 通道
- MCU 周期性写入亮度(0 ~ 255 ~ 0)
- (可选)开启 Fade-in / Fade-out 平滑过渡
✅ 示例(以 LED0 为例,开启 Fade,亮度从 0 到 255 再下降)
void aw2013_init_pwm_mode(int fd)
{
// 1. 软件复位
i2c_write(fd, 0x00, 0x55);
// 2. 启用芯片功能
i2c_write(fd, 0x01, 0x01); // ENABLE=1
// 3. LED0 模式为 PWM,最大电流,开启Fade
i2c_write(fd, 0x31, 0b01100011); // MD=0, FO=1, FI=1, IMAX=11(15mA)
// 4. 使能 LED0 通道
i2c_write(fd, 0x30, 0x01); // LE0=1
}
void aw2013_pwm_breath_loop(int fd)
{
uint8_t brightness = 0;
int8_t step = 5; // 调节步长,可根据速度需求改
while (1) {
i2c_write(fd, 0x34, brightness); // PWM0 地址=0x34
usleep(20000); // 20ms 刷新一次
brightness += step;
if (brightness == 0 || brightness == 255)
step = -step; // 到达边界反转
}
}
✅ 二、One Shot 模式:自动呼吸灯初始化(LED0,2Hz)
初始化一次即可运行自动呼吸灯动画,无需 MCU 控制循环。
💡 目标设置
- 每个呼吸周期约 0.5s
- 无限循环
- 最大亮度为 15mA
✅ 示例代码:
void aw2013_init_one_shot_mode(int fd)
{
// 1. 软件复位 + 启用芯片
i2c_write(fd, 0x00, 0x55);
i2c_write(fd, 0x01, 0x01);
// 2. 设置 LED0 为 PWM 模式,暂时不启用
i2c_write(fd, 0x31, 0x00); // MD = 0,关闭 OneShot,防止提前运行
i2c_write(fd, 0x30, 0x00); // 全部 LED 先关闭
// 3. 配置呼吸灯 T0~T4
i2c_write(fd, 0x37, (1 << 4) | 1); // T1=0.26s, T2=0.26s
i2c_write(fd, 0x38, (0 << 4) | 0); // T3=0.13s, T4=0.13s
i2c_write(fd, 0x39, 0x00); // T0=0s, REPEAT=0 无限循环
// 4. 启用 One Shot 模式 + 设置最大电流
i2c_write(fd, 0x31, 0x13); // MD=1, IMAX=3=15mA
// 5. 启用 LED0 输出(此时动画自动启动)
i2c_write(fd, 0x30, 0x01); // LE0=1
}
📌 补充说明
-
i2c_write(fd, reg, val)是伪函数,请根据你项目实际 I2C 封装改写。 -
PWM 模式建议配合 MCU 定时器运行(RTOS/裸机都行)
-
One Shot 模式如果想要同步多个通道运行,请用:
i2c_write(fd, 0x30, 0x00); // 全部关闭 // 配置三个 LEDxT 寄存器... i2c_write(fd, 0x31~0x33, 0x13); // MD=1 启用 One Shot i2c_write(fd, 0x30, 0x07); // 同步启用 LED0~2
✅ 需要我帮你写成 C 工程结构(比如 Makefile、封装接口、main 函数跑呼吸灯)也可以继续说。如果你要在 ioctl 接口中封装呼吸灯命令,也可以一起做。
太好了!那我们来逐步设计一个通用、灵活的 ioctl 控制接口,支持 AW2013 常亮、呼吸灯、多通道控制等功能。
✅ 一、设计目标
- 支持常亮、呼吸灯两种模式
- 支持多通道 LED(LED0、LED1、LED2)独立控制
- 用户空间通过
ioctl()控制驱动,不直接操作寄存器 - 简化用户逻辑,驱动完成寄存器映射和写入
✅ 二、ioctl 命令定义
建议头文件 aw2013_ioctl.h
#ifndef _AW2013_IOCTL_H_
#define _AW2013_IOCTL_H_
#include <linux/ioctl.h>
#define AW2013_MAGIC 'A'
// 模式选择
#define AW2013_MODE_PWM 0
#define AW2013_MODE_BREATH 1
#define AW2013_MODE_CONSTANT 2
// 命令定义
#define AW2013_IOC_SET_MODE _IOW(AW2013_MAGIC, 0x01, struct aw2013_mode_cfg)
#define AW2013_IOC_LED_ON _IOW(AW2013_MAGIC, 0x02, int) // 参数: led_idx
#define AW2013_IOC_LED_OFF _IOW(AW2013_MAGIC, 0x03, int) // 参数: led_idx
// PWM亮度/呼吸灯设置结构
struct aw2013_mode_cfg {
int led; // 0,1,2 -> LED通道
int mode; // AW2013_MODE_*
int brightness; // 0~255(PWM模式、常亮模式使用)
int imax; // 0~3 (0mA/5mA/10mA/15mA)
// 呼吸灯用
int t0; // 延迟启动时间,单位:索引(0~8)
int t1, t2, t3, t4; // 呼吸灯节奏时间(0~7)
int repeat; // 重复次数,0 = 无限循环
};
#endif
✅ 三、驱动侧实现参考(关键逻辑)
static long aw2013_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
struct aw2013_dev *dev = filp->private_data;
struct aw2013_mode_cfg cfg;
switch (cmd) {
case AW2013_IOC_SET_MODE:
if (copy_from_user(&cfg, (void __user *)arg, sizeof(cfg)))
return -EFAULT;
return aw2013_config_mode(dev, &cfg);
case AW2013_IOC_LED_ON:
return aw2013_set_led(dev, (int)arg, true);
case AW2013_IOC_LED_OFF:
return aw2013_set_led(dev, (int)arg, false);
default:
return -EINVAL;
}
}
函数 aw2013_config_mode() 根据模式不同,调用具体 PWM / 呼吸灯 / 常亮控制流程。
✅ 四、用户层使用示例
#include "aw2013_ioctl.h"
int main()
{
int fd = open("/dev/aw2013", O_RDWR);
struct aw2013_mode_cfg cfg = {
.led = 0,
.mode = AW2013_MODE_CONSTANT,
.brightness = 128,
.imax = 3, // 15mA
};
ioctl(fd, AW2013_IOC_SET_MODE, &cfg);
ioctl(fd, AW2013_IOC_LED_ON, 0);
close(fd);
return 0;
}
✅ 五、可扩展方向
| 功能 | 可扩展方式 |
|---|---|
| 呼吸灯动态变化 | 多个 cfg 结构发送 |
| RGB 同步呼吸 | 同时配置 LED0/1/2 |
| 停止呼吸灯 | LED_OFF 或设置模式为常亮,PWM=0 |
| 支持多设备 | 用 /dev/aw2013X 多实例 |
如果你同意这个设计,我们可以继续往下写:
- 内核驱动端的
aw2013_config_mode()函数实现 - 呼吸灯参数转寄存器映射代码
- 用户层封装的 CLI 工具(例如
aw2013ctl -m breath -l 1) - 多通道控制 demo
需要哪一部分直接告诉我就行 😎
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)