在生活中,有许多设备可以独立调位,如台灯亮度、玩具车速度、风扇速度等。它们以不同的方式调整档位,有的改变功率,有的改变动力,但它们与激励或输入信号的改变是分不开的。让我们在这里简要介绍一下LED实现灯的无级调光,可以自己做一个可变亮度的小灯。
一、所需设备:
AT89C51×1、100Ω定值电阻×1、LED×1、示波器×滑动变阻器×1.直流电压表×1、ADC0808×1、500kHz时钟信号×1、 5V直流电源×2。
主要设备介绍:(我们这里只做简单介绍,每个接口定义都可以自己查阅资料——反正这里不用)
(1)AT89C51:AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)低压、高性能CMOS 8位微处理器,俗称51单片机。
图1 51单片机局部图
(2)ADC0808:ADC0808 是含8 位A/D 转换器、8 与微型计算机兼容的路多路开关和控制逻辑CMOS组件的转换方法是逐步接近。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个256模拟开关树组 电阻分压器和一个逐渐接近的寄存器。8 路面模拟开关的通断由地址锁定器和译码器控制,8 单侧模拟信号可以在通道中任意访问。
说白了,模拟信号可以转换成数字信号。例如0-5V电压信号可转换为数字量为16的00—FF。
图2 ADC0808局部图
二、基本思路
(1)要实现调亮,先要产生亮度等级信号,利用滑动变阻器调整阻值,将滑动变阻器两端点样进行采样,用ADC模数转换为0808,以获得数字量。将收集到的数字量除以256(8位二进制数最大值),然后乘以10(亮度分为10个等级,当然计算结果可能是实数,但肉眼观察到的各个等级变化不明显,相当于无极调光),作为调光等级。
调光等级n=(数字量/256)*10
(2)产生PWM波来控制灯的亮度,因为PWM光的亮度可以通过调整空比来控制。当占空比较大时,即在一个周期内,灯亮的时间较大,暗时间占比较小。当频率足够快时,灯看起来很亮;相反,当占空比小时时时,灯看起来很暗。结合1的分析,通过处理收集到的数字量来调整空比,计算结果表示空比的大小,如n=5时,表示占空比为50%。
名词解释:PWM波:PWM即脉冲宽度调制,即占空比可变的脉冲波形。
图3 PWM波
如图所示,高电平在一个周期T中持续时间T1占整个周期的比例。调整空比可以调整灯的亮度,不仅可以应用于此,还可以控制舵机来控制汽车的速度。转弯时,空比可以降低,减慢速度,防止侧滑。
占空比=T1/T
小知识:我们通常看到的大多数灯都在继续发光。事实上,它们并不总是发光,而是闪烁。然而,当闪光速度大于肉眼感觉到的速度时,它们似乎会觉得灯总是亮着的。肉眼通常能感觉到的频率约为60Hz(因人而异,有的飞行员可感受到220Hz以下变化,即如果灯1s内闪次数小于60,肉眼就能感觉到。所以这里的PWM频率至少为60Hz,以至于不起来灯在闪。这里我们为了效果更好,取1kHz。
(3)使用51单片机作为硬件控制器ADC0808作为模数转换器。使用定时器0中断PWM波并调整占空比。PWM波从P2^0口输出,用示波器检测输出信号的比例。
三、实现电路
(1)电压采样和模数转换电路
电位器可以通过上下滑动来改变自己的电阻值,两端的电压也会相对变化输入模拟量可以通过电压表测量电位器两端的电压来获得。
ADC0808的时钟端给500kHz事实上,51单片机也可以生成时钟信号,直接使用激励源更方便。ADDA~C它是模拟信号输入的选择通道IN0输入,对应ABC值为000,直接将三个端口接地。将START与P3^4相连,由P3^四口同时给采样开始信号ALE地址锁定允许高电平信号锁定地址。P3^3口接收AD转换完成信号,接收高电表示转换完成。P一端接收采样输出信号,OUT8为最低位OUT1为最高位,OUT8-OUT单片机分别接单P1.0到P0.7端,每个端口反过来接收,最后得到采样后的数字量。
图4电压采样和模数转换电路
2)PWM波输出电路
51单片机与LED的连接,PWM波从P2^0口输出,中间串联100欧元的限流电阻,更接近实际情况。示波器连接LED并联灯,检测输入信号,观察空比变化。
图5PWM波输出电路
(3)输出结果
当滑动变阻器的电阻值为0时,电压为0,从图6可以看出LED熄灯,输出PWM波占空比很小,几乎为0。不为零的原因是程序编写问题,在一个周期中,当时间time<=n当输出高电平时,就会导致n=0时,也会产生瞬间的高电平,但不影响观察结果。
图6 0时电位器PWM波形与LED亮度
滑动变阻器指针在中间时,两端电压为2.5V,从图7可以看出LED灯比以前亮,输出PWM波占50%。
图7 电位器位于中间时的PWM波形与LED亮度
当滑动变阻器指针在顶端时,两端电压为5V,由图8可以看到LED灯达到最亮,输出的PWM波占空为100%,一直输出高电平。
图8 电位器位处于最大值时的PWM波形与LED亮度
可以看到,LED灯的亮度随滑动变阻器的变化而变化,观察示波器也可以看到,PWM波的占空比大的时候灯越亮,占空比小的时候灯越暗。
四、完整项目
(1)仿真程序
#include "reg51.h"
sbit pwm=P2^0; //从P2^0口输出PWM波信号
sbit START=P3^4; //AD启动信号,高电平有效
sbit EOC=P3^3; //转换启动时为低电平,转换结束为高电平
sbit OE=P3^5; //输出允许信号,输入高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
unsigned char time=0;
unsigned int d; //保存采样的数字量
//ADC0808读取电位器值,转化为数字量并储存在d中
void adc0808_read()
{
START=0;
START=1; //一高一低产生一个上升沿,使0808复位
START=0; //产生下降沿,启动AD转换
while(EOC==0); //等待转换完成,EOC为高电平时,转换完成
OE=1;
d=P1; //从P1端接收转换后的数字量
OE=0;
}
//主函数
void main()
{
TMOD = 0x01; //设置TMOD寄存器,定时方式,工作方式1
TH0 =(65536-1000)/256; //定时时长为0.1ms
TL0= (65536-1000)%256;
TR0 = 1; //启动计数
ET0 = 1; //T0中断
EA = 1; //开启总中断
while(1);
}
//定时器T0中断函数//
void Timer0() interrupt 1
{
int n;
adc0808_read();
n=d*10/256;
TH0 =(65536-1000)/256; //重新赋初始值
TL0= (65536-1000)%256;
time++;
if(time>=10) //确保频率时1KHZ,每次0.1ms,计数10次就是1ms
time = 0;
if(time<=n) //n相当于亮度等级和占空比,一个周期内<=n的为高电平
pwm=1;
else
pwm=0;
}
(2)Proteus仿真图
图9 完整仿真图