MCU通过PWM调节LED亮度

大侠们:
小弟用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++) ;
  }
  }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-01
我最近也在调试使用PWM控制LED亮度,不过我使用的是LED恒流驱动器(LM3407)来做,电流比较小,350mA。亮度在2W左右。
由于LED恒流驱动器输出地是方波,经过电感稳流后得到350mA,所以最小控制时间受控于方波频率,加上从控制信号到方波启动的延时。
方波现在用的1M左右,启动延时为1.5uS,关闭后,电感储能能继续电量2uS,所以最小控制时间不要小于10uS。
按照100个分度调整,可以使用1K的PWM频率,最小分辨率为10uS,没有爆闪的过程。
我不知道你的电路是怎样的,功率如何,启动爆闪可能是电感匹配问题。
希望能有帮助。
第2个回答  2010-09-01
应该是你的程序写得不够好.

你是不是让占空比每加1就亮一次.如果是这样那你的效果肯定不理想.

在灰度级小的时候占空比增加的幅度要小,灰度级越大的占空比增加的幅度也要越大.也就是说灰度级和占空比不要呈正比关系,应该呈抛物线形状.

你自已分析的那个原因是有道理的.把你的频率调小点,按我说的方法试下看行不.要是觉得程序不好写可以再找我,我有现成的.本回答被提问者采纳
第3个回答  2010-09-01
纯技术贴了!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网