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输出
|