您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 任务55PWM和呼吸灯
5.5呼吸灯1VCC任务5.5呼吸灯5.5.1任务要求很多手机上有这样一个功能,当手机里有未处理的通知,如未接来电、未查收的短信时等,屏幕上的小灯会渐亮渐灭,像呼吸那样有节奏,起到了一个提示的作用,故又称为“呼吸灯”。本节的任务是:单片机控制开发板上的1个LED,让LED从熄灭状态,慢慢变亮,直到最大亮度,时间为2秒;然后再慢慢变暗,直到熄灭,时间也为2秒。5.2.2知识准备1、PWM的引入和定义在第二单元的发光二极管闪烁任务中,我们做过这样的实验:当闪烁频率比较快时(超过25HZ),由于人的眼睛的“视觉暂留效应”,发光二极管看起来一直被点亮。另外点亮和熄灭的时间不一样时,发光二极管的亮度也不一样。在一个周期内(点亮时间+熄灭时间),点亮的时间约长,则发光二极管的亮度就会越高。这个案例实际上是PWM(脉冲宽度调制)在LED调光中的应用。PWM是一个连续的脉冲波,在一个周期中,其高电平的和低电平的比例是不同的。一个典型的PWM的波形如图5.5.1所示。图5.5.1典型的PWM波图5.5.1中,T是PWM波的周期,Ton是高电平的宽度,VCC是高电平值。当该PWM波通过积分器(低通滤波器)后,可以得到平均的输出电压V=Vcc*Ton/T。式中,Ton/T称为PWM波的占空比。调节Ton的宽度,可以改变PWM的占空比,从而得到不同的平均电压输出。PWM的实质是利用数字信号控制模拟电路,广泛应用在测量、通信到功率控制与变换的许多领域中。灯光控制、直流电机调速、开关电源、逆变器、变频器等产品都有PWM的身影。TTon5.5呼吸灯22、PWM的实现和应用注意(1)PWM的程序实现大多数单片机具有硬件PWM模块,在使用的时候,只需要简单的配置就可以了。STC89C52单片机没有硬件PWM,下面是根据PWM的原理,通过定时器控制I/O生成PWM的程序,内容简单,没有模块化,程序如下:#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitPWMOut=P1^0;//PWM输出端口#definePWMHighPWMOut=1#definePWMLowPWMOut=0#definePWMPeriod100//PWM周期#definePWMDuty20//占空比/***************************************************************************函数名称:Timer0Init()*功能:定时器0初始化*入口参数:无*出口参数:无*说明:100us定时**************************************************************************/voidTimer0Init(){TMOD=0x02;//GATE=0,C/T=0,M1M0=10;TH0=156;TL0=156;//设置初值,EA=ET0=1//开中断TR0=1;//开启定时器}/***************************************************************************函数名称:main()*功能:主函数*入口参数:无*出口参数:无*说明:无**************************************************************************/5.5呼吸灯3程序解释:①程序结构简单,主函数仅需要完成定时器0的初始化,PWM的生成在定时器0的中断服务函数中生成。每进入中断服务函数1次,计数变量PWMCnt加1,当PWMCnt计数到PWMPreroid(PWMPeroid被宏定义为100),PWMCnt清零,重新计数。PWMCnt从0到100这段时间为定时器溢出时间(100us)*PWMPeroid(100)=10ms,为PWM的周期。每进入一次中断服务函数,PWMCnt都要和PWMDuty(PWMDuty被宏定义为20)相比较,小于PWMDuty,则PWM对应的I/O输出高电平,否则输出低电平,改变PWMDuty就可以改变PWM的占空比。②程序适合于PWM的频率低(周期长)的场合。在不减少占空比的份数的情况下(程序中占空比分成了100份),要提高PWM的频率,只能减少定时器溢出时间。定时器溢出时间voidmain(void){Timer1Init();//定时器初始化while(1){//可以添加别的任务}}/***************************************************************************函数名称:Timer0Isr()*功能:定时器0中断服务函数*入口参数:无*出口参数:无*说明:**************************************************************************/voidTimer0Isr(void)interrupt1{staticucharPWMCnt=0;if(++PWMCnt=PWMPeriod)//周期:100us*PWMPeriodPWMCnt=0;if(PWMCnt=PWMDuty)//占空比:PWMDutyPWMHigh;elsePWMLow;}5.5呼吸灯4太小,会导致程序频繁进入定时器中断服务函数,从而给其他任务的执行带来了隐患。(2)PWM应用时注意问题①PWM的频率与控制对象有关,例如PWM用于控制灯的亮度,其频率应该高于40HZ,即周期小于25ms。PWM用作直流电机调速时,PWM的频率越高,直流电机转动越平滑。②除了频率外,还要考虑PWM的占空比的调节精度。如一些单片机自带的PWM具有8位的精度,指的是PWM的占空比分成28=256份,具有256级调节,很显然,PWM的位数越高,输出就会越精细。但占空比的调节精度和PWM的频率是一对矛盾,在相同的的时钟下,提高占空比的精度,将导致PWM的频率降低。③PWM控制本身属于开环控制,具有调节功能但不具备稳定负载的能力,也不保证输出结果正比于占空比。例如在电机调速应用中,通过PWM控制可以改变电机的功率,但不能稳定电机的转速,电机的转速受到负载力矩的影响不与占空比成正比关系。PWM控制灯光中,由于灯丝在不同温度下电阻不同,虽然占空比越大,灯光越亮,但实际亮度也不与占空比成正比。需要得到高精度、高稳定度的结果,需要借助反馈,结合各种反馈控制算法(如PID算法、模糊控制算法等)。5.5.2任务实施本节的任务是让开发板上的一个LED实现渐亮渐灭的效果。PWM可以实现LED亮度的调节,通过不断调节PWM的占空比,可以实现渐亮渐灭的效果。渐亮:不断加大占空比;渐灭:不断减少占空比。根据视觉暂留效应的特点,我们取LED闪烁的频率为50HZ,即每20ms改变一次PWM的占空比,所以PWM的周期为20ms。占空比分成100份,则每一份所占用的时间为PWM周期(20ms)/100=200us,200us用定时器产生。LED从亮到灭需要的时间为20ms*100=2秒,同样从灭到亮也需要2秒的时间。PWM的输出在中断函数中完成,主函数完成定时器的初始化。工程的结构如图5.5.2所示。图5.2.2工程结构图5.5呼吸灯5(1)主函数main.c:主函数中完成定时器的初始化就可以了,呼吸灯的任务在定时器中断服务函数中。(2)呼吸灯模块BreathLed.h:BreathLed.c:#ifndef_BREATHLED_H_#define_BREATHLED_H_#includereg52.h#includeMicroDefine.h//LED接口定义sbitLED=P1^0;#defineLedOnLED=0#defineLedOffLED=1#includereg52.h#includeBreathLed.h#includeMircoDefine.h/***************************************************************************函数名称:main()*功能:完成定时器的初始化*入口参数:无*出口参数:无*说明:**************************************************************************/voidmain(void){DelayMs(200);Timer0Init();//定时器的初始化while(1){//添加其它任务}}5.5呼吸灯6BreathLed.c:#includeBreathLed.h/***************************************************************************函数名称:Timer0Init()*功能:定时器0初始化*入口参数:无*出口参数:无*说明:200us定时**************************************************************************/voidTimer0Init(){TMOD=0x02;//GATE=0,C/T=0,M1M0=10;TH0=56;TL0=56;//设置初值,ET0=EA=1;//开中断TR0=1;//开启定时器}/***************************************************************************函数名称:Timer0Isr()*功能:定时器0中断函数*入口参数:无*出口参数:无*说明:实现LED渐亮渐灭**************************************************************************/voidTimer0Isr(void)interrupt1{staticucharPwmCnt=0;//PWM计数器staticbitPwmDirection=0;//亮灭方向标志位staticcharPwmDuty=100;//占空比初始化为100if(++PwmCnt=100)//1个周期到,调整一次占空比{PwmCnt=0;//定时器0初始化externvoidTimer0Init();#endif5.5呼吸灯7程序解释:PWM的周期为20ms,每运行一个周期,根据亮灭方向标志位,调整PWM的占空比(PWMDuty加1,或PWMDuty减1)。if(PwmDirection==0)//从全亮到灭{if(--PwmDuty=0)//占空比减1,为0则改变方向标志位PwmDirection=1;}else//从灭到全亮{if(++PwmDuty=100)//占空比加1,到100则该变方向标志位PwmDirection=0;}}if(PwmCnt=PwmDuty)//改变输出状态LedOn;elseLedOff;}
本文标题:任务55PWM和呼吸灯
链接地址:https://www.777doc.com/doc-2715468 .html