PWM脉冲宽度调制技术控制LED亮度

1、PWM控制

PWM控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

一个周期内的占空比为50%
一个周期内的占空比为70%

其实,在CT107D板子上就是通过调节PWM一个周期内的占空比来控制LED的亮度,通过改变一个周期中的高低电平所占比例,进而控制LED灯亮(强度)。

2、LED控制

在在CT107D板子上,以LED1为例,当P00口为低电平时,LED1亮。当P00口为高电平的时,LED1灭。所以通过PWM控制在一个周期内高低电平的比例,进而控制LED1的发光强度。

另外,在一个周期中,低电平所占比例越大,发光强度越亮。代码中展示了如下图所示亮度变化图:

按键S7控制转换

初始板子上电时,LED1灭,按一次S7调节一次亮度,如上图来回循环。

选择PWM的频率为100hz,即0.01s=10ms=10000us=100us x 100,则定时器可以每次定时100us,总计计数100次为一个PWM周期,故20%的亮度可以选择:

pwm_zhankongbi=20;

 40%的亮度可选择:

pwm_zhankongbi=40;

下面给出低电平所占比例与亮度匹配图:

每个周期低电平占20%(20%亮度)
每个周期低电平占40%(40%亮度)
每个周期低电平占60%(60%亮度)
每个周期低电平占80%(80%亮度)

 总之在一个周期内,低电平所占比例越大,即亮度越强。

3、代码

#include<stc15f2k60s2.h>
#define uchar unsigned char

uchar pwm_zhankongbi=0;
uchar n;
uchar flag=0;
uchar count=0;

void Time0_init();
void delayms(uchar ms);
void keyscan();


void main(){
Time0_init();
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P00=1;
while(1)
{
   keyscan();
   if(flag==1)
   {
     flag=0;
	 switch(count)
	 {
	   case 0:
	     P00=0;
	     pwm_zhankongbi=20; //20%的亮度
		 EA=1;ET0=1;
		 count=1;
		 break;
	   case 1:
	     P00=0;
		 pwm_zhankongbi=40; //40%的亮度
		 count=2;
		 break;
	   case 2:
	     P00=0;
		 pwm_zhankongbi=60; //60%的亮度
      	 count=3;
		 break;
	   case 3:
	     P00=0;
		 pwm_zhankongbi=80; //80%的亮度
      	 count=4;
		 break;
	   case 4:
	     P00=1;
		 count=0;
		 EA=0;ET0=0;
		 break;
	  }		 
  }
 }
}

void Time0_init(){
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
}

void Time0_service() interrupt 1
{
  TH0=(65536-100)/256;
  TL0=(65536-100)%256;
  n++;
  if(n==pwm_zhankongbi)
  {
     P00=1;
  }
  else if(n==100)
  {
    P00=0;
    n=0;
  }
}

void keyscan(){
if(P30==0)
{
   delayms(5);
   if(P30==0)
   {
      flag=1;
   }
}
while(!P30);
}

void delayms(uchar ms){
uchar k,i,j;
for(k=ms;k>0;k--)
{
   i=12;
   j=169;
   do
   {
     while(j--);
   }
   while(i--);
}
}
发布了64 篇原创文章 · 获赞 70 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fanjufei123456/article/details/105025590