MCU通过PWM调节LED亮度程序如下:
// PWM 控制 LED 灯渐亮渐灭程序
// 晶振为12M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。
#include < reg51.h >
sbit K1 =P3^0 ; //增加键
sbit K2 =P3^1 ;
sbit P10=P1^0 ; //减少键
sbit BEEP =P3^7 ; //蜂鸣器
unsigned char PWM=0x7f; //赋初值
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
void main()
{
初始化:
K1=1;
K2=1;
TMOD=0x21;
TH0=0xfc; //1ms延时常数
TL0=0x18; //频率调节
TH1=PWM; //脉宽调节
TL1=0;
EA=1;
ET0=1;
ET1=1;
TR0=1;
主循环:
while(1)
{
if(K1==0)//递增按键考虑消抖..
{
delayms(20);
if(K1==0)
{
if(PWM==255)
{
PWM=255;
Beep();
}
else PWM++;
}
}
if(K2==0)//递减按键
{
delayms(20);
if(K2==0)
{
if(PWM==0)
{
PWM=0;
Beep();
}
else PWM-- ;
}
}
}
}
// 定时器0中断服务程序.
void timer0() interrupt 1
{
TH0=0xfc ;
TL0=0x18 ;
TH1=PWM ;//定时器自动重装值由PWM提供
TR1=1 ;
P10=0 ; //启动输出
}
// 定时器1中断服务程序
void timer1() interrupt 3
{
TR1=0;
P10=1 ; //结束输出
}
//蜂鸣器子程序
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(200) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(200);
}
// 延时子程序
void delay(unsigned char t)
{
while(t--) ;
}
// 延时子程序
void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}
我最近也在调试使用PWM控制LED亮度,不过我使用的是LED恒流驱动器(LM3407)来做,电流比较小,350mA。亮度在2W左右。
由于LED恒流驱动器输出地是方波,经过电感稳流后得到350mA,所以最小控制时间受控于方波频率,加上从控制信号到方波启动的延时。
方波现在用的1M左右,启动延时为1.5uS,关闭后,电感储能能继续电量2uS,所以最小控制时间不要小于10uS。
按照100个分度调整,可以使用1K的PWM频率,最小分辨率为10uS,没有爆闪的过程。
我不知道你的电路是怎样的,功率如何,启动爆闪可能是电感匹配问题。
希望能有帮助。
应该是你的程序写得不够好.
你是不是让占空比每加1就亮一次.如果是这样那你的效果肯定不理想.
在灰度级小的时候占空比增加的幅度要小,灰度级越大的占空比增加的幅度也要越大.也就是说灰度级和占空比不要呈正比关系,应该呈抛物线形状.
你自已分析的那个原因是有道理的.把你的频率调小点,按我说的方法试下看行不.要是觉得程序不好写可以再找我,我有现成的.
纯技术贴了!