1. MCU照明系统概述

各位同学,咱们今天聊聊嵌入式照明系统。说实话,这个领域我摸爬滚打了十几年,踩过的坑比走过的路还多。照明系统看着简单,不就是让灯亮起来吗?但真正做起来,你会发现里面的门道深着呢。

嵌入式照明系统的基本架构

一个典型的嵌入式照明系统,说白了就三层:

  • 控制层:MCU或者DSP,负责算逻辑、发指令
  • 驱动层:LED驱动芯片、MOS管、恒流源
  • 负载层:LED灯珠、灯带、灯具

我刚开始做项目时,总觉得驱动层随便选个芯片就行。结果有一次,客户反映灯在低亮度时闪烁。查了半天,原来是驱动芯片的调光深度不够。嗯,这里要注意,驱动层的选型直接决定了你的调光性能上限。

核心要点:控制层负责"算",驱动层负责"做",负载层负责"亮"。三层之间通过协议通信,比如PWM、DALI、DMX512。

MCU在照明中的角色

MCU在照明系统里到底干啥?我总结了三件事:

  1. 算法执行:调光曲线、色温混合、渐变效果
  2. 协议解析:接收DALI指令、解析DMX512数据包
  3. 状态管理:记录当前亮度、色温、场景模式

你想想看,一个普通的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调光的那些坑,特别是如何避免频闪和噪声。有什么问题,咱们课后交流。