MCU通过PWM调节LED亮度

2024-12-12 18:54:37
推荐回答(4个)
回答1:

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++) ;
  }
  }

回答2:

我最近也在调试使用PWM控制LED亮度,不过我使用的是LED恒流驱动器(LM3407)来做,电流比较小,350mA。亮度在2W左右。
由于LED恒流驱动器输出地是方波,经过电感稳流后得到350mA,所以最小控制时间受控于方波频率,加上从控制信号到方波启动的延时。
方波现在用的1M左右,启动延时为1.5uS,关闭后,电感储能能继续电量2uS,所以最小控制时间不要小于10uS。
按照100个分度调整,可以使用1K的PWM频率,最小分辨率为10uS,没有爆闪的过程。
我不知道你的电路是怎样的,功率如何,启动爆闪可能是电感匹配问题。
希望能有帮助。

回答3:

应该是你的程序写得不够好.

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

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

你自已分析的那个原因是有道理的.把你的频率调小点,按我说的方法试下看行不.要是觉得程序不好写可以再找我,我有现成的.

回答4:

纯技术贴了!