圣源电子制作

 找回密码
 立即注册
查看: 6475|回复: 0
打印 上一主题 下一主题

LED的亮度控制采用PWM-C语言程序-转载自外国网站

[复制链接]
跳转到指定楼层
楼主
发表于 2011-9-9 00:09:49 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
LED的亮度控制采用PWM   

脉宽调制或PWM是一个术语,你听到了很多,如果你感兴趣的是利用微控制器控制电源输出。 它有许多应用,虽然爱好者之间最流行的一种控制LED的亮度。 在本教程中,我们将介绍后面的PWM的基本原则,以及如何使用它可用于LED的亮度控制,包括淡出的LED,而不是只是把它们打开和关闭。
本文将重点讨论一些更具体的细节的PIC18F微控制器系列,然而,技术和原则是相同的所有其他的微控制器产品。 有些微控制器,包括执行所有的辛勤工作为您的PWM模块;然而,这条使用中断技术更具有普遍性和可扩展的重点。

  简介 为了控制亮度的LED,你可以改变这是发送到LED的电源,例如使用一个电位器(可变电阻),LED接收它是美好的,更多的权力,更省电收到它的调光器。 微控制器的数字,这意味着他们只有两个“权力”的国家,和关闭。 虽然可以提供从微控制器(使用数字模拟转换器(DAC))在不同功率,这通常需要额外的芯片。  PWM提供的“模拟”摆动从微控制器的输出的功率不同程度的能力。
如果经过一段时间的持续时间短,我们依次为50%和50%的LED,LED会显得一半亮以来持续时间超过总的光输出是只有一半高达100%。 这里的一个重要因素是“持续时间”,如果我们把光关闭太慢观众会看到闪烁的LED不是一个恒定的光输出,出现调光。 在这种情况下,脉冲宽度(50%)是这里的重要因素。 通过改变脉冲宽度(或“调节”),我们可以有效地控制LED的光输出,因此长期的PWM脉宽调制。
  

当使用PWM重要的是要考虑如何慢慢地,我们可以'闪光'的LED,让观者不认为振荡。 我们的“视觉暂留”,这意味着在很简单的条件,造成眼不能见光的快速振荡,我们看到了光,即使它已关闭。 这种技术是如何电视显示一个看似动人的画面,这实际上是由一些不同的静帧非常​​迅速显示一前一后。  LED的振荡的最低速度,可以通过人眼看到的变化从人到人。 然而,本文的目的,我们将使用一个50Hz的最低速度,或每秒50次(欧洲电视使用相同的速度)。
  占空比 当使用PWM也有一定的条款,您将遇到一次又一次的。 最重要的名词是“占空比”。 占空比是指一个脉冲的总时间是“上”,在周期的持续时间,所以在50%亮度的LED的占空比是50%。 这使我们的周期每秒赫兹的“怪圈”本身是测量(通常)。 所以我们在50Hz的周期为1秒除以50个周期,这是0.02秒。 由于我们使用如此小的时间测量,它很有用微秒(微秒有100万在第二),这给了我们一个周期的持续时间20000微秒,这是50周期每秒或50Hz。
我们必须将在20000微秒的LED占空比取决于所需的开或关,例如,一个75%占空比要求为15000微秒的脉冲,然后关闭5000微秒。

  PWM分辨率 被称为“PWM分辨率”的准确性,使我们可以控制占空比。 较高的我们的PWM分辨率,“亮度”的多层次,我们可以显示。 然而,由于占空比是“固定”在50HZ更高的分辨率需要更细的微控制器的时序。 更快的微处理器,它可以较小的工期时间。 另一个限制因素是执行代码,微控制器不仅要“中断”,这将导致脉冲的产生,但还可以运行代码控制LED的输出,下一个中断之前,必须完成被称为。 此外,你可能希望你的微控制器执行的任务比其他LED的PWM亮度控制,所以必须有一些备用中断之间的执行时间做所有其他更一般的处理任务。

随着LED的PWM控制的更高的PWM决议的主要优势是它在“小康”和尽可能最低的亮度从LED之间的差别较小。 例如,如果我们的占空比是20000微秒(50HZ),我们的决议是只有10000微秒,“小康”和可能的最低亮度之间的差异,将可能的总亮度的50%。 分辨率在2000微秒的差别,将10%等。 总的来说,“PWM分辨率”决定亮度“水平”的编号,我们可以完全关闭(0%)和完全(100%)之间的支持。 再次,上级的决议,计时精度和加工的开销是必需的。
  

对于您的应用程序所需的分辨率和整体占空比可能会有所不同。 简单的显示需要很少的精度控制(和有时一点点闪烁的是不是世界的尽头),更先进的显示的控制能力的亮度可能是至关重要的的(认为使用一个RGB混合颜色的问题,例如LED )。 权衡是简单的,更多的控制和精度要求越来越多的微控制器资源。 在这篇文章中,我们将重点放在一个例子提供了一个超过20000微秒,占空比(或50HZ与步骤5%给我们20个级别的亮度)1000微秒的决议。 此级别的控制和准确性,适用于多种用途。
  定时中断 执行PWM使用中断,我们必须调用一次,1000微秒的中断,并决定如果LED应打开或关闭。 要做到这一点,我们必须建立一个计时器上的微控制器,它调用当它到期的中断。
在这个例子中,我们将采取Microchip的PIC18F4550单片机作为例子,运行在48MHz的。  48MHz的单片机的时钟每秒4800万次一个“剔”号。 这被称为“FOSC”(振荡频率)。 一个PIC18F4550需要4个时钟的刻度来处理一个单一的指令。 这意味着我们可以使用微控制器处理的时间的最小金额是一季度的时钟速率,即4800万/ 4 = 1200万(这也是为FOSC / 4),如果有在第二个百万微秒,这意味着我们大约每隔0.0834微秒(12 MIPS(每秒百万指令))执行的命令。 虽然这不是十分正确的,因为在PWM计算产生一个脉冲,我们需要两个命令(打开和关闭),这意味着最低的0.167微秒的周期时间(这有效地限制了我们可以生产的软件到6MHz频率最高的,虽然这是不是一个很现实的的最大值)。
如果FOSC / 4率是1200万,这意味着每12个处理器周期为1微秒的时间传递。 这意味着,1000微秒相当于12,000个处理器周期。 这是很重要的,因为1:1的预分PIC的定时器更新一次处理器周期(虽然这被称为1:1的预分频,它的真正含义没有在所有的预分频)。 定时器的预分频器减慢率在计时器的计数器更新,用1:2的预分频更新一次,每2个处理器周期与预分频比为1:4,它更新一次,每4处理器周期等。
要使用一个8位定时器(如果你喜欢,你也可以使用一个16位定时器)定时器可以衡量的最长期限是256“罪状”(0-255)。 因此,我们必须选择一个预分频值,这使我们能够在小于256的计时器滴答12,000个处理器周期。 如果我们用1:64的预分频器,我们需要187.5计时器刻度来衡量千微秒:
  12每微秒的处理器周期,所以12 * 1000 = 12000每1,000微秒的处理器周期:12,000次/ 64(预分频)= 187.5计时器“蜱”
既然我们不能指望一个“一半”我们只是一轮数字下降到最接近的整数(这意味着导致PWM不会完全准确,但LED的亮度控制的目的,这是非常关键的)。 更高的分频值,我们使用,不准确的时机变得。 这可以通过使用一个16位定时器,让我们来算蜱得多,因此,使用较低的预分频值予以纠正。
对于一个PIC18F4550,这将导致类似以下摘录其中Timer0模块的配置,启用和设置生成一个低优先级中断的代码:
/ /使能中断优先 IPEN = 1 / /设置定时器 TMR0IP = 0;
/ /设置定时器0中断为低优先级 TMR0IF = 0;
/ /清除定时器中断标志 TMR0L = 255 - 187;
/ /复位定时器计数器 T0CON = 0b11000101;
/ /定时器,8位和1:64预分频器 TMR0IE = 1
/ /允许Timer0中断/ /使能中断 GIEH位= 1;
/ /全局使能所有高优先级中断GIEL = 1;
/ /全局使所有低优先级中断


一旦定时器配置和运行,我们需要一些中断的代码,以决定如果LED,应中断或关闭。 既然我们有20个可能的亮度水平(因此20号决议的步骤,在我们的PWM生成),我们可以简单地用一个计数器计数从0-19更新一次中断。 如果用一个数字从0-19表示LED的亮度是我们根本检查,如果PWM计数器是高于或低于低亮度数量,如果LED应打开或关闭。
  / /全局为PWM 无符号字符 pwmCounter = 0; 无符号字符 ledBrightness = 0; / /低优先级中断程序 无效中断LOW_PRIORITY lpHandler( 无效 ) {         / /这个定时器中断?         如果 (TMR0IF)         {                 (ledBrightness> pwmCounter)                         LED0 = 1; 其他 LED0 = 0;                 pwmCounter + +;                 (pwmCounter> 19)                         pwmCounter = 0;                 / /准备下一次中断                 TMR0L = 255 - 187; / /复位定时器计数器                 TMR0IF = 0; / /清除定时器中断标志         } }

  褪色的LED 既然我们知道的TIMER0定时器周期的持续时间,我们也可以用它来提供对LED的淡入淡出效果。 要做到这一点,我们必须存储两个LED的亮度,一个变量的值存储实际的显示亮度和其他存储目标亮度的LED。 由于我们只希望褪色关闭(你可以适应这一点很容易,同时支持淡入和淡出关闭),如果目标的亮度比实际亮度高,我们立即将实际亮度相同的水平。
然而,对于衰落过,我们要减一次,直到它的实际亮度水平一步等于目标的亮度。 只有20的亮度巨大,我们不能简单减去每个中断通话的水平以来的中断调用是过快的到是的观者(20调用将只消耗20000微秒过快看到)认为褪色。
相反,我们保持另一个计数器计数中断调用应该发生在递减实际褪色水平之间的。 因为我们知道中断被称为每千微秒,这是非常直截了当的工作,我们应该算,以获得所需的的衰落率多少中断。 例如,如果我们想要从亮度级别为19 0的淡出,以0.5秒,我们简单地除以1000微秒的中断时间,然后由若干层次所需的时间(微秒)。 因此0.5秒(或50万微秒)= 500,000 / 1,000 = 500 / 20 = 25。 这表现在以下代码摘录:
/ /全局  低优先级中断程序 无效中断LOW_PRIORITY lpHandler( 无效 ){
/ /这是Timer0的中断?(TMR0IF){
/ /执行PWM亮度  执行衰落  准备下一次中断 TMR0L = 255 - 187;
/ /复位定时器计数器 TMR0IF = 0;
/ /清除定时器中断标志 }


  结论 虽然这是完全可能得到PWM控制工作的LED使用纯粹的猜测工作,计算所需的最佳值,可以更有效地使用可用的处理器资源,​​让您做更多与微控制器和/或控制更多的LED同时从同一芯片上。 用于LED显示的相同的技术也可以用来控制电机,模拟仪表显示,白炽灯泡,等

PWMdemo.zip (3.02 KB, 下载次数: 70)






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-12-4 02:54 , Processed in 0.043294 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表