1. MCU照明系统概述
各位同学,咱们今天聊聊嵌入式照明系统。说实话,这个领域我摸爬滚打了十几年,踩过的坑比走过的路还多。照明系统看着简单,不就是让灯亮起来吗?但真正做起来,你会发现里面的门道深着呢。
嵌入式照明系统的基本架构
一个典型的嵌入式照明系统,说白了就三层:
- 控制层:MCU或者DSP,负责算逻辑、发指令
- 驱动层:LED驱动芯片、MOS管、恒流源
- 负载层:LED灯珠、灯带、灯具
我刚开始做项目时,总觉得驱动层随便选个芯片就行。结果有一次,客户反映灯在低亮度时闪烁。查了半天,原来是驱动芯片的调光深度不够。嗯,这里要注意,驱动层的选型直接决定了你的调光性能上限。
核心要点:控制层负责"算",驱动层负责"做",负载层负责"亮"。三层之间通过协议通信,比如PWM、DALI、DMX512。
MCU在照明中的角色
MCU在照明系统里到底干啥?我总结了三件事:
- 算法执行:调光曲线、色温混合、渐变效果
- 协议解析:接收DALI指令、解析DMX512数据包
- 状态管理:记录当前亮度、色温、场景模式
你想想看,一个普通的8位MCU,主频才16MHz,要同时处理PWM生成、串口通信、按键扫描。我见过不少工程师,一上来就选高端芯片,其实没必要。关键是要把资源用在刀刃上。
个人经验:我习惯用STM32F0系列做照明控制,性价比高,外设丰富。特别是它的定时器,能生成多路独立PWM,非常适合RGB调光。
常见照明协议简介
照明协议这块,我把它分成三类:
| 协议 | 特点 | 适用场景 |
|---|---|---|
| PWM | 简单、成本低、实时性好 | 单灯调光、RGB控制 |
| DALI | 双向通信、可寻址、标准化 | 商业照明、智能楼宇 |
| DMX512 | 高速、多通道、广播式 | 舞台灯光、景观照明 |
PWM协议
PWM是最基础的调光方式。通过改变占空比,控制LED的平均电流。我做过一个项目,用PWM调光时发现灯具有频闪。后来一查,是PWM频率太低,低于人眼的临界闪烁频率。所以,我建议PWM频率至少设在1kHz以上。
// 简单的PWM初始化代码
void PWM_Init(void) {
// 设置定时器频率为1kHz
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; // 1kHz
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz / 72 = 1MHz
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 使能PWM输出
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 50%占空比
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
}
避坑指南:我曾经在PWM调光时忽略了死区时间,导致MOS管上下桥臂直通,烧了好几个驱动板。从那以后,我每次都会检查死区设置。
DALI协议
DALI是数字可寻址照明接口,支持双向通信。每个DALI设备都有唯一地址,可以单独控制。我做过一个办公楼照明项目,用了DALI协议,实现了场景切换、群组控制、能耗监测。
DALI的物理层是两线制,波特率1200bps。别看它慢,但可靠性高。我记得有一次,现场有强电磁干扰,其他协议都挂了,就DALI还能正常工作。
// DALI命令发送示例
void DALI_SendCommand(uint8_t address, uint8_t command) {
// 构建DALI帧:前导码 + 地址 + 命令
uint16_t frame = (address & 0x3F) << 8 | (command & 0xFF);
// 发送19位数据(1位起始 + 8位地址 + 8位命令 + 2位停止)
for (int i = 18; i >= 0; i--) {
if (frame & (1 << i)) {
// 发送高电平
DALI_SetHigh();
} else {
// 发送低电平
DALI_SetLow();
}
delay_us(833); // 1200bps的位时间
}
}
DMX512协议
DMX512是舞台灯光的标准协议,速度比DALI快得多,最高250kbps。它采用广播方式,一个控制器可以控制512个通道。我做过一个大型景观照明项目,用了DMX512控制上千个RGB灯点。
DMX512的难点在于时序要求严格。每个数据包之间要有至少88微秒的间隔,数据包内每个字节之间不能有停顿。我刚开始做时,经常因为时序问题导致灯点乱闪。
关键参数:DMX512的刷新率 = 250kbps / (1起始位 + 8数据位 + 2停止位) / 513通道 ≈ 44Hz。这个刷新率对于大多数照明应用足够了。
好了,这一章就讲到这里。下一章咱们深入聊聊PWM调光的那些坑,特别是如何避免频闪和噪声。有什么问题,咱们课后交流。