LED调光的基本原理

描述

在我们的现在生活中,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;

        }

}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分