微控制器MCU通常被认为是数字器件。在缺省情况下,其输出电压电平要么是高,要么就是低,不会是一个不高不低值。为了实现LED亮度控制这一要求,首先浮现在脑海中的方法就是使用一个标准的数模转换器或者设计一个受控的电阻网络。值得庆幸的是,大多数现代MCU都具有内置的脉冲宽度调制(PWM)单元,这是解决该问题的最容易和成本最低的方法。
根据我们的项目要求,两个LED的亮度必须在几秒钟的时间内以相反的顺序逐渐从最暗调整到最亮,再从最亮逐渐调整到最暗。在"匀变1"时间内,针对LED 1的PWM信号的脉冲宽度逐渐增大,而针对LED 2的PWM信号的脉冲宽度逐渐减小。例如,假设匀变时间等于2秒并由128个向上/向下步长组成。因此,每个步长持续大约16ms。请注意,脉冲宽度应当在一个PWM周期内仅改变一次。因此,PWM周期也应该等于16ms。
我们使用了低端8位摩托罗拉MC68HC908-QT2 Flash MCU,该器件内嵌有振荡器。其振荡频率为12.8MHz,并且预分频器的分频比在程序中设定为1:64,定时器时钟周期为0.02 ms。那么,为了生成周期为16ms的PWM,要载入定时器/计数器方式寄存器(Tmod)的时钟数应等于16/0.02 = 800(等于十六进制的$0320)。
最大脉冲宽度(PWmax)可以小于或等于PWM周期。考虑PWmax大约等于15ms的情况。对于128个步长的情况,要从零获得此最大值,每个步长值应为15/128 = 0.117ms,舍入之后为0.12ms。由此我们可以得出PWmax = 15.36 ms,相当于PWM周期的96%。因此在每一步长中,PW应以0.12ms(等于0.12/0.02 = 6个定时器时钟)的增量向上/向下匀变。
任何一种带有PWM的MCU和任何一种定时考虑方法可用来实现这一技术。应根据使用的LED来选择电阻R1 和 R2。管脚pA2 =1时用来激活亮度控制,管脚pA2 =0时用来关闭亮度控制。
|