大侠们:
小弟用MCU通过PWM调节LED亮度的时候遇到这样的问题:在“占空比 ”比较小且在增加的那瞬间灯会闪一下(例如从1%到2%的那瞬间 ,占空比 比较大的时候不明显)我调试了频率和介数(小于256介),效果都不理想.
增加一介在40ms以上就会有上面的情况,在20ms内就不明显,可是客户是上帝!
自己分析了原因,可能是LED的亮度与电流的比例关系,(刚开始的时候电流增大亮度也明显增大,而当电流达到某个值后亮度不再随着电流增大而增大)
如果谁能够帮我解决,追加50分!
首先在下面这些情况下 LED 会闪烁: 1:灯比较多,当然灯越多闪烁更明显
2:保证灯 LED 在任何时候不能够欠压
3:增加一介的时间再20ms(50HZ)以上
自己认为原因是:在低占空比的时候 LED 电流虽然很小,但增加一介电流会变化很多,也就是led的亮度会变化很多,而上面我所提到的20ms==50HZ,刚好在人眼闪烁的频率临界点
QQ:247669137,望大家多多交流!
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 ç¯æ¸äº®æ¸çç¨åº
ãã// æ¶æ¯ä¸º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++) ;
ãã}
ãã}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2010-09-01
我最近也在调试使用PWM控制LED亮度,不过我使用的是LED恒流驱动器(LM3407)来做,电流比较小,350mA。亮度在2W左右。
由于LED恒流驱动器输出地是方波,经过电感稳流后得到350mA,所以最小控制时间受控于方波频率,加上从控制信号到方波启动的延时。
方波现在用的1M左右,启动延时为1.5uS,关闭后,电感储能能继续电量2uS,所以最小控制时间不要小于10uS。
按照100个分度调整,可以使用1K的PWM频率,最小分辨率为10uS,没有爆闪的过程。
我不知道你的电路是怎样的,功率如何,启动爆闪可能是电感匹配问题。
希望能有帮助。
由于LED恒流驱动器输出地是方波,经过电感稳流后得到350mA,所以最小控制时间受控于方波频率,加上从控制信号到方波启动的延时。
方波现在用的1M左右,启动延时为1.5uS,关闭后,电感储能能继续电量2uS,所以最小控制时间不要小于10uS。
按照100个分度调整,可以使用1K的PWM频率,最小分辨率为10uS,没有爆闪的过程。
我不知道你的电路是怎样的,功率如何,启动爆闪可能是电感匹配问题。
希望能有帮助。
第2个回答 2010-09-01
应该是你的程序写得不够好.
你是不是让占空比每加1就亮一次.如果是这样那你的效果肯定不理想.
在灰度级小的时候占空比增加的幅度要小,灰度级越大的占空比增加的幅度也要越大.也就是说灰度级和占空比不要呈正比关系,应该呈抛物线形状.
你自已分析的那个原因是有道理的.把你的频率调小点,按我说的方法试下看行不.要是觉得程序不好写可以再找我,我有现成的.本回答被提问者采纳
你是不是让占空比每加1就亮一次.如果是这样那你的效果肯定不理想.
在灰度级小的时候占空比增加的幅度要小,灰度级越大的占空比增加的幅度也要越大.也就是说灰度级和占空比不要呈正比关系,应该呈抛物线形状.
你自已分析的那个原因是有道理的.把你的频率调小点,按我说的方法试下看行不.要是觉得程序不好写可以再找我,我有现成的.本回答被提问者采纳
第3个回答 2010-09-01
纯技术贴了!