在我们的现在生活中,LED灯照明已经在到处都能看到。LED灯具有节能、耐用、可调光等特点,取代了过去落后的白炽灯。那么,为什么LED的灯光可调呢?
下面我就向大家介绍LED调光的基本原理-脉宽调制,也就PWM。
在我们的本节内容中,我还是利用之前的威廉希尔官方网站 来展示PWM的基本工作原理。
一、STC15W408AS控制LED灯威廉希尔官方网站
在威廉希尔官方网站 中,LED指示灯接在单片机的P3.2口上。
二、脉宽调制(PWM)基本原理
所谓脉宽调制,就是利用威廉希尔官方网站 中的开关器件的通断来进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或者所需要的波形。
从下图中,我们可以看出,这里有三种不同的波形。这些波形具有重复性,也就是我们通常所说的周期。在专业术语中,一个周期所占用的时间,就叫做一个脉宽。其中,高电平所占整个脉宽的比例,就叫做占宽比。下图中,就是占空比分别为75%、50%和20%的波形。
三、利用定时器来生成PWM波形的方法
我们在了解了PWM波形的基本概念后,就可以利用单片机的定时器来生成PWM波形。
如果要利用定时器来生成PWM,则首先要确定PWM波形的脉冲宽度(比如10MS),然后确定在这个脉冲中,高电平所占的时间宽度(比如2MS),则剩下的时间就是低电平时间(比如8MS),也就是占空比为20%,如上图中的第三种波形。
现在假设我们使用的定时器是1MS中断一次,那么要得到10MS的脉冲宽度,就需要计数10次,也就中断10次。基中高电平计数4次,低电平计数6次。
也就是开始计数时让输出为高电平,当计数到4次后,再让输出变为低电平,直到计数到10次,再重复这个过程。
这样,我们就得到了一系列宽度为10MS,占空比是是40%的脉冲。
四、利用定时器生成PWM波形相关代码
int mPulseCnt=0;
// 1ms
void Timer0_ISR (void) interrupt 1
{
mPulseCnt=mPulseCnt+1;
if(mPulseCnt<=4)
{
PinLed_High();
}else{
PinLed_Low();
}
if(mPulseCnt==10)
{
mPulseCnt=0;
}
}
五、利用定时器来生成PWM波形的完整代码
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) // 1 T模式
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#define TRUE 1
#define FALSE 0
#define Pin_LED P32
#define Pin_LED_M1 P3M1
#define Pin_LED_M0 P3M0
#define Pin_LED_BIT BIT2
#define PinLed_High() Pin_LED=1
#define PinLed_Low() Pin_LED=0
#define BOOL unsigned char
#define UINT unsigned int
UINT mTimer500ms=0;
void PinLED_DirOut(void);
void Timer0_Init(void);
BOOL bLedon=FALSE;
int mPulseCnt=0;
void main(void)
{
PinLED_DirOut();
PinLed_High();
Timer0_Init();
while(TRUE)
{
}
}
void PinLED_DirOut(void)
{
Pin_LED_M1 &=~Pin_LED_BIT;
Pin_LED_M0 |=Pin_LED_BIT;
}
void Timer0_Init(void)
{
AUXR |= 0x80; //定时器0为1T模式
TMOD = 0x00; //设置定时器为模式0(16位自动重装载)
TL0 = T1MS; //初始化计时值
TH0 = T1MS > > 8;
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
// 1ms
void Timer0_ISR (void) interrupt 1
{
mPulseCnt=mPulseCnt+1;
if(mPulseCnt<=4)
{
PinLed_High();
}else{
PinLed_Low();
}
if(mPulseCnt==10)
{
mPulseCnt=0;
}
}
全部0条评论
快来发表一下你的评论吧 !