哥们我想问一下 怎样用PWM实现多路LED的调光呢 没有分了 希望你帮帮我 非常感谢

2025-01-01 12:17:20
推荐回答(2个)
回答1:

  用单片机控制啊!给个参考程序你!我参考的这个程序能通过PWM控制亮度
  用R G B 三色LED合成任何颜色及渐变!呵呵!很有意思!自己再改改可以随便你PWM怎么控制几路亮度及不同颜色亮度合成
  *
  注意: 定时时间由晶振决定,我暂时给你按12MHz晶振计算定时时间,你接上6MHz晶振期效果也差不多,只是变化得慢一倍
  此程序我已用ARM进行硬件模拟了LED的变化(在Keil中也用软件调试通过),应可以直接使用,你在端口上请注意选择合适的上拉电阻
  另外你可根据你的需要及LED的效果来修改其定时时间、周期时间、脉冲宽度常数表与同一脉冲出现次数等
  */

  #include

  typedef unsigned char uint8;
  typedef unsigned int uint16;

  //宏定义
  //*********************************************************
  #define LED P1_2 //LED端口定义

  #define _Timer0_Time_ 1 //Timer0定时时间
  #define _Cycle_Time_ 20 //周期时间为20ms
  #define _Times_ 5 //同一宽度脉冲出现的周期数

  //变量定义
  //*********************************************************
  uint8 Cycle_Time; //周期时间
  uint8 Pulse_Time; //脉冲时间(宽度)

  const uint8 Pulse_Time_Buf[20]= //脉冲宽度常数表
  {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

  /*********************************************************
  Time0中断函数
  **********************************************************/
  void Time0(void) interrupt 1 using 1
  {
  TH0=0xFC; //1ms定时
  TL0=0x18;

  if(Pulse_Time) Pulse_Time--;
  if(Cycle_Time) Cycle_Time--;
  }

  //主函数
  //*********************************************************
  main()
  {
  uint8 i,j;
  uint16 count;

  P0=0xff; //P0口初始状态
  TMOD=0x01;
  TH0=0xFC; //1ms定时
  TL0=0x18;
  EA=1; //启动定时器,开定时器中断
  ET0=1;
  TR0=1;

  LED=1;
  while(1) { //进入主循环

  //for(i=20; i; i--){ //脉冲宽度从20~0ms渐变
  for(i=0; i<20; i++){ //脉冲宽度从0~20ms渐变
  for(j=0; j<_Times_; j++) { //每一个宽度脉冲出现_Times_次
  Cycle_Time=_Cycle_Time_;
  Pulse_Time=Pulse_Time_Buf[i];
  LED=1;
  //LED=0; //此句代替上句可改变LED电平有效极性
  do {
  if(!Pulse_Time) {
  LED=0;
  //LED=1; //此句代替上句可改变LED电平有效极性
  }
  if(!Cycle_Time) {
  break;
  }
  }while(1);
  }
  }
  for(count=0; count<1000; count++); //延时,演示用

  //for(i=20; i; i--){ //脉冲宽度从20~0ms渐变
  for(i=0; i<20; i++){ //脉冲宽度从0~20ms渐变
  for(j=0; j<_Times_; j++) { //每一个宽度脉冲出现_Times_次
  Cycle_Time=_Cycle_Time_;
  Pulse_Time=Pulse_Time_Buf[i];
  LED=0;
  //LED=1; //此句代替上句可改变LED电平有效极性
  do {
  if(!Pulse_Time) {
  LED=1;
  //LED=0; //此句代替上句可改变LED电平有效极性
  }
  if(!Cycle_Time) {
  break;
  }
  }while(1);
  }
  }
  for(count=0; count<1000; count++); //延时,演示用
  }
  }

  #if 0
  /*************************/
  #include
  #include
  #define uchar unsigned char
  #define uint unsigned int
  uchar Count,timecount;
  bit temp;

  /*********************************************************
  延时函数
  *********************************************************/
  void Delay(uint num)//延时函数
  {
  while( --num );
  }
  /********************************************************
  主函数
  *********************************************************/
  main()
  {
  P0=0xff;
  Count=0x00;
  TMOD=0x01;
  TH0=0x4c; TL0=0x00; //50ms定时
  EA=1; ET0=1; TR0=1;
  while(1)
  if(temp)
  p1^2=!p1^2;
  delay(200);
  }
  /*********************************************************
  Time0中断函数
  **********************************************************/
  void Time0(void) interrupt 1 using 0
  {
  TH0=0x4c; //50ms定时
  TL0=0x00;
  timecount++;
  if(timecount==20)
  {
  temp=!temp;
  }
  }
  /*********************************************************/
  #endif

回答2:

LED主要是电流驱动,所以你做个电流型的整流器吧