PWM的了解

来源:互联网 发布:网络回路后果 编辑:程序博客网 时间:2024/05/21 07:48
1、PWM是搜索脉冲宽度调制信号,注意其中的“宽度”,就是脉冲的高电平的时间。PWM信号调节LED亮度时,信号频率是不变的,改变的是脉冲的高电平的时间,即LED的导通时间。这种信号调节亮度相当于调节LED的平均电流,所以电流会变化。2、从LED的V-I特性可知,其曲线是非线性的,0.1V的电压可造成100~200mA的If的变化,不易控制;另外,LED具有负温度系数特性,所以,一般将LED说成是电流控制型器件。至于你将LED串接在电源模块上,当输出电压恒定时,是恒压源驱动LED吧,这样调节LED亮度时,需要对输出电压进行分压,以降低LED的压降才能改变其亮度,恒压源的电流是有一个最大输出值的,不能调节的,不知你用什么方法调节其输出电流的?3、用MCU比较方便,成本是稍高,也可以用模拟电子线路产生相应的PWM信号。
led调色温是改变不同光的比例。增加红光,色温变暖,增加兰光,色温变冷。调亮度, 改变流过LED的电流大小,电流大些,就亮些。反之就暗些。电流的调节,是用改变PWM来实现的。所谓PWM,就是脉冲宽度调整。脉冲宽度调整的方法,最根本的是改变决定其宽度的电阻与电容值的数值。RC的乘积大,则宽度会大些。具体要结合电路图来讨论

PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

       图1显示了三种不同的PWM信号。图1a是一个占空比为10%的PWM输出,即在信号周期中,10%的时间通,其余90%的时间断。图1b和图1c显示的分别是占空比为50%和90%的PWM输出。这三种PWM输出编码的分别是强度为满度值的10%、50%和90%的三种不同模拟信号值。例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号。

       图2是一个可以使用PWM进行驱动的简单电路。图中使用9V电池来给一个白炽灯泡供电。如果将连接电池和灯泡的开关闭合50ms,灯泡在这段时间中将得到9V供电。如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。如果在1秒钟内将此过程重复10次,灯泡将会点亮并象连接到了一个4.5V电池(9V的50%)上一样。这种情况下,占空比为50%,调制频率为10Hz。

       大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。设想一下如果灯泡先接通5秒再断开5秒,然后再接通、再断开……。占空比仍然是50%,但灯泡在头5秒钟内将点亮,在下一个5秒钟内将熄灭。要让灯泡取得4.5V电压的供电效果,通断循环周期与负载对开关状态变化的响应时间相比必须足够短。要想取得调光灯(但保持点亮)的效果,必须提高调制频率。在其他PWM应用场合也有同样的要求。通常调制频率为1kHz到200kHz之间。

/******************************************************************************************

  * 文件:PWM.c

  * 备注:51单片机PWM完全注释          *

  ******************************************************************************************/

  #include 《STC89.H》

  unsigned char CYCLE;      /*PWM周期长度*/

  unsigned char count = 0;        /*记录中断次数*/

  unsigned char PWM_ON;      /*PWM高电平时间计数*/

  void delay()          /*延时约78ms*/

  {

  unsigned char i, j;

  for(j = 100; j; j--)

  for(i = 255; i; i--)

  ;

  }

  void main()

{

  bit Flag;       /*变化状态标志,0:渐亮,1:渐暗*/

  TMOD = 0x01;           /*时间基准为1ms*/

  TH0 = (65536 - 100) / 256;      /*右端表达式编译后为0xFF*/

  TL0 = (65536 - 100) % 256;      /*同上*/

  IE = 0x82;       /*开定时器0中断0x82 = 10000010*/

  TR0 = 1;          /*启动定时器0*/

  CYCLE = 10;           /*十级亮度,即十级PWM*/

  while(!Flag)          /*渐亮,每一次变化亮度增加1*/

  {

  delay();          /*延时*/

  PWM_ON++;       /*高电平脉宽延长,即亮度增加*/

  if(PWM_ON == CYCLE)       /*若高电平脉宽增长到整个周期*/

  {

  Flag = 1;       /*则转为渐暗*/

  }

  }

  while(Flag)       /*渐暗,每一次变化亮度减少1*/

  {

  delay();       /*延时*/

  PWM_ON--;       /*高电平脉宽缩短,即亮度降低*/

  if(PWM_ON == 0)      /*若高电平脉宽缩短到0*/

  {

  Flag = 0;      /*则转为渐亮*/

  }

  }

  }

  void time0_server() interrupt 1 using 1

  {

  TH0 = (65536 - 100) / 256;      /*时间基准为1ms*/

  TL0 = (65536 - 100) % 256;      /*即每1ms触发一次中断*/

  if(count == PWM_ON)      /*若中断次数达到亮度设定值*/

  {

  P2 = 0xFF;        /*则熄灯*/

  }

  count++;        /*每次中断记录+1*/

  if(count == CYCLE)      /*若中断次数达到PWM周期长度*/

  {

  count = 0;       /*则清零中断记录*/

  if(PWM_ON != 0)       /*若此时亮度值非零*/

  {

  P2 = 0;        /*则点灯*/

  }

  }

  }

原创粉丝点击