基于DAC0832的LED亮度控制系统设计
中心议题:
- 基于DAC0832的LED亮度控制系统设计
- 硬件电路设计
- 用单缓冲方式输入数据
- 选用LM336—5型隐埋式齐纳二极管
- 利用多路开关和电压保持电路实现变化控制
引言
LED在城市化的过程中功不可没,各种夜景灯牌和广告显示屏,都在日益充斥人们新奇的眼球。以往霓虹灯的发光体只有亮和灭两种状态,亮度都是突然变化的,往往给人一种图案变化生硬的感觉;而现在很多霓虹灯已经实现了发光体亮度逐渐变化,这样形成的各种变化的霓虹灯图案更加柔和、流畅。控制发光体亮度变化总体上可以分为模拟方法和数字方法,其中通过单片机控制D/A转换器实现发光体亮度控制的方法具有电路简单、维护和调整方便的特点,是当前霓虹灯控制的发展方向。霓虹灯的发光体以气体放电灯管为主,现在随着高亮度发光二极管的产生,寿命长、能耗低的LED灯牌应用越来越广泛。这里讨论应用DAC0832在单片机控制下如何控制多个发光二极管的亮度变化。
1 硬件电路设计
通过单片机和D/A转换芯片DAC0832控制三个发光二极管亮度按顺序逐渐变化,实现一种灯管旋转的效果。设计中主要考虑下面三个问题:
(1) DAC0832与单片机的接口电路设计。
(2) 基准电压源的设计。
(3) 同时控制多个LED按不同规律改变亮度的电路设计。
1.1 DAC0832与单片机的接口电路
启动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
3 结语
文中设计了基于DAC0832实现对LED控制的系统,在单片机的控制下,利用多路开关和电压保持电路实现了对多个发光二极管亮度的变化控制,实现了LED灯的灯光旋转的效果。如果将此电路扩展,接更多的模数转换器和多路开关,就可以实现各种复杂图案的变化。采用电压保持电路的办法也可以应用到其它领域的模拟控制中。