[嵌入式C编程与固件开发] LED的PWM调光

[复制链接]
地瓜patch 发表于 2025-8-10 18:59 | 显示全部楼层 |阅读模式
PWM(脉宽调制)是一种常用的电子调压调光技术,通过快速开关电源来控制平均电压或电流,从而实现电压调节或亮度控制。
脉冲宽度调制:通过改变脉冲信号的占空比(高电平时间与周期的比值)来控制输出。
频率选择:通常使用高频(几百Hz到几十kHz)以避免可见闪烁。
平均电压:输出电压平均值 = 电源电压 × 占空比。
LED调光应用中其优点:效率高(几乎不发热)、颜色稳定性好。频率要求:通常>200Hz以避免人眼察觉闪烁。
实现方式:专用PWM调光LED驱动器;微控制器(如Arduino)的PWM输出;555定时器电路
电路实现
简单PWM调光电路
电源 → 开关元件(MOSFET/晶体管) → LED/负载
          ↑
     PWM控制信号

如果没有硬件PWM,可以用GPIO和定时器模拟:
#define PWM_PIN PB0
volatile uint8_t pwm_counter = 0;
volatile uint8_t pwm_duty = 50;  // 初始占空比50%

ISR(TIMER0_OVF_vect)  // 定时器溢出中断
{
    pwm_counter++;
    if(pwm_counter >= 100) pwm_counter = 0;   
    if(pwm_counter < pwm_duty)
        PORTB |= (1 << PWM_PIN);  // 输出高电平
    else
        PORTB &= ~(1 << PWM_PIN); // 输出低电平
}

void PWM_Init(void)
{
    DDRB |= (1 << PWM_PIN);  // 设置PWM引脚为输出   
    // 配置定时器0
    TCCR0B = (1 << CS01);  // 分频系数8
    TIMSK0 = (1 << TOIE0); // 使能溢出中断   
    sei();  // 开启全局中断
}
void Set_PWM_Duty(uint8_t duty)
{
    if(duty > 100) duty = 100;
    pwm_duty = duty;
}
LED调光应用示例
#define PWM_PIN 1  // GPIO18
void fadeLED(void)
{
    wiringPiSetup();
    pinMode(PWM_PIN, PWM_OUTPUT);
    pwmSetMode(PWM_MODE_MS);  // 标记-空间模式
    pwmSetRange(1000);        // 范围0-1000
    pwmSetClock(192);         // 时钟分频   
    while(1)
    {
        // 渐亮
        for(int i = 0; i <= 1000; i++)
        {
            pwmWrite(PWM_PIN, i);
            delay(5);
        }        
        // 渐暗
        for(int i = 1000; i >= 0; i--)
        {
            pwmWrite(PWM_PIN, i);
            delay(5);
        }
    }
}


注意事项
LED调光PWM频率选择:100Hz-1kHz通常足够
占空比分辨率:8位:0-255;10位:0-1023。
滤波:对于调压应用,可能需要添加RC滤波器平滑PWM输出




您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1809

主题

14853

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:出一块TI-PLABS-AMP-EVM

1809

主题

14853

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部