引言
LED在城市化的过程中功不可没,各种夜景灯牌和广告显示屏,都在日益充斥人们新奇的眼球。以往霓虹灯的发光体只有亮和灭两种状态,亮度都是突然变化的,往往给人一种图案变化生硬的感觉;而现在很多霓虹灯已经实现了发光体亮度逐渐变化,这样形成的各种变化的霓虹灯图案更加柔和、流畅。控制发光体亮度变化总体上可以分为模拟方法和数字方法,其中通过单片机控制D/A转换器实现发光体亮度控制的方法具有电路简单、维护和调整方便的特点,是当前霓虹灯控制的发展方向。霓虹灯的发光体以气体放电灯管为主,现在随着高亮度发光二极管的产生,寿命长、能耗低的LED灯牌应用越来越广泛。这里讨论应用DAC0832在单片机控制下如何控制多个发光二极管的亮度变化。
1硬件电路设计
通过单片机和D/A转换芯片DAC0832控制三个发光二极管亮度按顺序逐渐变化,实现一种灯管旋转的效果。设计中主要考虑下面三个问题:
(1) DAC0832与单片机的接口电路设计。
(2) 基准电压源的设计。
(3) 同时控制多个LED按不同规律改变亮度的电路设计。
1.1DAC0832与单片机的接口电路
启动ADC0832实现模数转换有单缓冲和双缓冲两种方式。多缓冲方式是在多片ADC0832配合时采用;本设计中只须一片ADC0832就可完成工作,所以采用单缓冲方式,向其8位数据输入口输入数据,然后在其写触发管脚WR1发送一低电平脉冲,该芯片就会将收到的数字量转换成模拟量输出。其输出为电流输信号,而控制发光二极管亮度需要用电压实现,所以需要外接由运算放大器构成的电流电压转换电路, ADC0832与单片机的接口电路如图1:
图中,由于选片端CS接到了P217,所以启动DAC0832开始转换时,需要将单片机的P217 脚设置为低电平。
输出的电流经过运算放大器转换成电压,如果需转换的数字量为B, 则对应输出电压值为:
其中VREF是外接的基准电压,输出电压最高为0 V,最低为- VREF ,如果基准电压取5 V,则最低输出电压为- 5 V,为了满足负电压输出的要求,运算放大器的电源电压VCC要高于5 V,VEE要低于- 5 V,本设计中运算放大器采用LM324芯片,电源电压VCC取10 V,VEE取- 10 V。
1.2基准电压的设计
要保证DAC0832数模转换的精度和准确度,必须提供一个高度稳定的基准电压。在数模转换器中一般选用带隙基准电压源或隐埋式齐纳稳压管。
设计中选用了LM336—5型隐埋式齐纳二极管,它具有价格低、使用方便的特点,其接线如图2:
1.3如何同时控制多个LED的亮度
设计中需要控制三个发光二极管,每个发光二极管的亮度和变化规律都不一样,而ADC0832只有一路模拟量输出,为了控制三个发光二极管的亮度,需要加一个多路电子开关,本例中选用的是CD4051,该芯片的引脚图如下:
该芯片是一个常用的8路到1路的多路电子开关,工作电压最高为32 V,通过ABC三个地址管脚确定选通哪个通道。
因为前面转换出的电压为负值最低为- 5 V,所以CD4051 的工作电压取VDD = 10 V, VEE =- 10 V, 地址控制端A、B、C分解接到单片机的P210、P211、P212 口,用来选通某个通道通, D/A转换后的模拟量接到多路开关的电压输入端3引脚,输出引脚13、14、15分别控制发光二极管D1、D2、D3。
DAC0832只有1路模拟输出,必须采用分时控制的方式循环控制三个发光二极管的亮度,实现接通某一个LED 时,其它LED 保持要原有亮度不能熄灭,为了达到这个目的,这里采用了运算放大器接成电压跟随器的形式控制LED的亮度,即多路电子开关的每个输出与发光二极管间都接一个电压跟随器,而且在运算放大器的正向输入端接了一个保持电容,使输入电压能够保持一段时间,其接线如下:
由于运算放大器的输入阻抗很大,所以Ch2上的电压能够保持一段时间,在数模转换器输出电压控制其它发光二极管期间,该运算放大器的输出电压能够保持不变。
装置硬件原理图如图5。
2软件设计
软件主要完成两个功能, 第一, 完成各个LED的循环点亮;第二,通过程序控制各个LED亮度的变化。本例中要实现灯光旋转的效果,所以每个LED都按三角波的型式亮度变化,先逐渐变亮,达到最亮时再由最亮逐渐变暗,如此反复进行;三个LED的亮度变化要有一个时差,如果一个LED从暗到亮再到暗作为一个周期的话,则D2比D1 滞后1/3 周期, D3 比D2 滞后1/3 个周期。
2.1主程序设计
使各个LED循环点亮通过主程序循环实现,将表示三个LED亮度的三个数据放到连续的三个RAM单元30H、31H、32H中,主程序中循环读取这三个单元的数据送到DAC0832 转换,根据30H、31H、32H中数值的不同,转换输出的模拟电压也不同,单片机控制多路电子开关将不同的模拟电压送给不同的LED,从而实现各个LED具有不同的亮度。由于本例中用P2口控制ADC0832的选通和电子开关的选通,根据原理图接线可知,点亮发光二极管D0、D1、D2对应的P2口数据分别为00H、01H、02H。
2.2中断程序设计
控制LED亮度变化通过定时器T0定时中断程序实现, T0中断改变30H、31H和32H的数值就可以改变LED 亮度了,若实现灯光旋转的效果,则三个LED的亮度应按图6曲线变化。
图中横坐标表示时间,在一个周期内发光二极管的亮度会按三角形规律变化,设每个变化周期为T,第二个发光二极管D1的变化滞后第一个发光二极管D0三分之一周期,同样D2滞后D1三分之一周期。
图6中的横坐标表示亮度,也就是对应的要转换成模拟量的数字量的数值。在主程序中三个字节30H、31H、32H中数值对应三个发光二极管的亮度,设定三个字节33H、34H和35H 的值控制三个二极管亮度增加还是减弱( 1 增强, 0 减弱)。假设开始时D1对应亮度为0,D0、D2对应亮度均为170,则三个二极管的亮度变化应该是D0和D2亮度增加,D2亮度减弱,则三个亮度控制字节的值分别为33H、35H中为1, 35H中为0。
采用T0中断实现三个发光二极管亮度的改变,则每到一次定时中断将完成如下功能:
1) 根据三个字节33H、34H和35H的值,分别对30H、31H和32H的值进行增1或减1操作。
2) 当亮度字节的数值增加到255时对应控制字节数值清零,亮度字节数值减到0时,对应控制字节数值置1。
由于在主程序中和中断子程序同时使用工作寄存器R0,所以在中断程序的开始和结束有一个保存和恢复R0中数值的过程。
中断程序的程序框图为:
即: TH0 = F0H, TL0 =BEH3