



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浅谈最简单PWM技术应用-渐明渐暗的LED灯:控制简单的LED灯貌似没什么难度,但是你会不会感觉到太单调,总是同一个频率在闪烁,总是同一个亮度在闪烁。大家有否想过能让LED灯由暗逐渐变亮,然后再由亮变暗该从什么地方入手呢?这里就不得不提到PWM技术。这里着重注意最后面对所给完整程序的分析。在开始我们的工程之前,首先来了解一个概念:PWM。PWM是脉冲宽度调制的英文单词的缩写。脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉宽调制是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽调制式开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。读起来有点晦涩难懂。其实简单的说来,PWM技术就是通过调整一个周期固定的方波的占空比,来调节输出电压的平均当电压,电流或者功率等被控量。我们可以用一个水龙头来类比,把1S时间分成50等份,即每一个等份20MS。在这20MS时间里如果我们把水龙头水阀一直打开,那么在这20MS里流过的水肯定是最多的,如果我们把水阀打开15MS,剩下的5MS关闭水阀,那么流出的水相比刚才20MS全开肯定要小的多。同样的道理,我们可以通过控制20MS时间里水阀开启的时间的长短来控制流过的水的多少。那么在1S内平均流出的水流量也就可以被控制了。当我们调整PWM的占空比时,就会引起电压或者电流的改变,LED的明暗状态就会随之发生相应的变化,听起来好像可以通过这种方法来实现我们想要的渐明渐暗的效果。让我们来试一下吧。大家都知道人眼有一个临界频率,当LED的闪烁频率达到一定的时候,人眼就分辨不出LED是否在闪烁了。为了让我们的LED在变化的过程中,我们感觉不到其在闪烁,可以将其闪烁的频率定在50Hz以上。同时为了看起来明暗过渡的效果更加明显,我们在这里定义其变化范围为099(100等分).即最亮的时候其灰度等级为99,为0的时候最暗,也就是熄灭了。于是乎我们定义PWM的占空比上限为99, 下限定义为0。假定我们LED的闪烁频率为50HZ,而亮度变化的范围为099共100等分。则每一等分所占用的时间为 1/(50*100) = 200us 即我们在改变LED的亮灭状态时,应该是在200us整数倍时刻时。在这里我们用单片机的定时器产生200us的中断,同时每20MS调整一次LED的占空比。这样在20MS * 100 = 2S的时间内LED可以从暗逐渐变亮,在下一个2S内可以从亮逐渐变暗,然后不断循环。由于大部分的内容都可以在中断中完成,主函数中除了初始化之外,就是一个空的死循环。下面附完整程序代码,然后具体分析:#include#define LED P1 /定义LED接口#define uchar unsigned char#define uint unsigned int#define LED_ON() LED = 0x00 ; /所有LED亮#define LED_OFF() LED = 0xff ; /所有LED熄灭uchar TimeCounter = 0 ; /中断计数bit LedDirection = 0 ; /LED方向控制 0 :渐亮 1 :渐灭char LedPWMCounter = 0 ; /LED占空比char PWMCounter = 0 ; /占空比void Timer0Init(void)/定时器初始化 TMOD=0x01; /定时器0工作方式1 TH0=0xff ; /定时器初始值(200us中断一次) TL0=0x47 ; EA=1; ET0=1;TR0=1 ;void main()Timer0Init();while(1);void Time0Isr(void) interrupt 1 static uint PWMCounter = 0 ;/声明静态变量的只能被初始化一次 TH0=0xff ; /定时器重新赋初值 TL0=0x47 ; TimeCounter+; if(TimeCounter 100) /每20MS调整一下LED的占空比 TimeCounter = 0 ;/如果是渐亮方向变化,则占空比递增 if(LedPWMCounter99) LedDirection=1; LedPWMCounter=99 ; /如果是渐暗方向变化,则占空比递减 if(LedPWMCounter=0)&(1=LedDirection) LedPWMCounter- ; if(LedPWMCounter0) /占空比大于0,则点亮LED,否则熄灭LED LED_ON() ; PWMCounter- ; else LED_OFF(); 开始笔者也对这段程序理解了很长一段时间,下面来详细分析这段程序,看看PWM到底是怎么回事:1第一个20ms看看程序都做了什么: 第一个200us定时器溢出中断,进入中断程序,此时中断计数TimeCounter= 1,没有达到100,即没有到20ms,此时不进入第一个if语句;直接至if(PWMCounter0)和else处判断;由于初始PWMCounter=0则进入else,即熄灭LED,跳出中断。第二个200us除了中断计数TimeCounter加1外,也没有达到100,其他第一个200us情况完全相同。以此类推,后面一直到TimeCounter=100,LED灯都是灭的;此时到20ms了。2 第二个20ms:第一个200us,进入定时器中断,此时TimeCounter=101,大于100,进入第一个if语句,此时将TimeCounter赋为1,因为初始LedPWMCounter=0=99且LedDirection=0,进入if(LedPWMCounter=99) &(0=LedDirection)语句中,此时自加一次后LedPWMCounter=10)语句,点亮LED,然后PWMCounter自减,PWMCounter=0;完成所有任务跳出定时器中断。第二个200us进入后,因为TimeCounter=1,TimeCounter+后为2,不满足要求不进入第一条if语句,跳至if(PWMCounter0)和else处判断,因为上一步PWMCounter=0,所以执行else语句,熄灭LED,跳出中断。以此类推,后面一直到TimeCounter=100,LED灯都是灭的;此时第二个20ms到了。分析整个第二个20ms,其中只有第1个200us是点亮的,后面99个200us都是熄灭的。由此类推,当第三个20ms时,由于会执行LedPWMCounter+;所以PWMCounter= LedPWMCounter=2;而进入if(PWMCounter0)和else判断语句时,因为PWMCounter自减2次,才能使PWMCounter=0,也就是说在第三个20ms中,会有2个200us点亮LED,98个200us是熄灭的。所以在LedPWMCounter自加到100前,也就是第100个20ms即2s前,LED点亮的时间逐渐在加长,每20ms加长200us,即占空比在加大(当第100个20ms时,这段时间内LED一直都是点亮的)。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全防范工作总结(15篇)
- 2025年餐饮行业行业智能餐厅与外卖市场发展研究报告
- 2025年电影电视行业OTT平台内容生态研究报告
- 2025遴选会计面试题目及答案
- 2025年家电产业智能家居市场前景研究报告
- 2025年数字化零售行业零售数码转型报告
- 2025年社交媒体行业短视频内容生态研究报告
- 2025年农业科技行业智慧农业发展前景分析报告
- 2025年文化娱乐行业虚拟现实技术应用前景分析研究报告
- 注射用盐酸阿柔比星临床应用考核试题
- 2025年杭州上城区总工会公开招聘工会社会工作者9人笔试参考题库附答案解析
- 2025年互联网+特殊教育行业研究报告及未来发展趋势预测
- 医院信息安全保密培训课件
- 文化人类学课件完整版
- 碳达峰碳中和产业发展调研报告
- 《海洋学》第二章 地球及海洋概观
- GH/T 1091-2014代用茶
- GB/T 12642-2013工业机器人性能规范及其试验方法
- ESG专题研究报告
- 【初中历史】商鞅变法优秀课件31-川教版
- 食品质量与安全管理概述课件
评论
0/150
提交评论