基于51的多功能直流稳压电源.docx
《基于51的多功能直流稳压电源.docx》由会员分享,可在线阅读,更多相关《基于51的多功能直流稳压电源.docx(13页珍藏版)》请在冰豆网上搜索。
基于51的多功能直流稳压电源
摘要
传统的多功能直流稳压电源功能简单、难控制、可靠性低、干扰大、精度低且体积大、复杂度高。
普通直流稳压电源品种很多.但均存在以下问题:
输出电压是通过粗调(波段开关)与细调(电位器)来调节。
本设计是一种可预置输出,步进调整,数字显示的数控直流电流源。
是以AT89C51为核心设计而成,经仿真,其步进为7mA。
系统具有功耗低、性能可靠、结构简单等优点。
关键字:
数控,直流源,步进
数控直流电流源的设计与实现
1、引言
直流稳压电源是电子技术常用的设备之一,广泛的应用于教学、科研等领域。
传统的多功能直流稳压电源功能简单、难控制、可靠性低、干扰大、精度低且体积大、复杂度高。
普通直流稳压电源品种很多.但均存在以下问题:
输出电压是通过粗调(波段开关)与细调(电位器)来调节。
这样,当输出电压需要精确输出,或需要在一个小范围内改变时(如1.02~1.03V),困难就较大。
那么直流稳压电流源就是在直流稳压电压源的基础上进行适当改造,不但继承了稳压源的优点,还有自己独特的方面。
2、系统硬件设计
2.1、系统总体框图
本系统是以AT89C51单片机为核心控制器,具有电压可预置、可步进调整、输出的电流信号和预置的电流信号可同时显示的数控直流电源。
系统由AT89C51控制电路、键盘电路、电源电路、D/A电路、功放电路、稳压输出电路、电压转换电流电路、LED显示电路八部分组成。
系统通过“开关”、“+”、“-”三个按键来控制预置电流的升降,并通过数码管显示。
AT89C51单片机送出相应的数字信号,在D/A转换之后输出电流,经集成运放LM358转换、三极管放大、RC网络滤波,最终稳定。
同时由LED数码管显示输出电流;由数字万用表测量实测值。
另外,单片机送出来的是数字信号,经过DA电路后转换成电压模拟信号,然后需要经过一个电压电流转换器,将电压转换成对应的电流,从而成为一个数控直流电流源。
系统的硬件原理框图如图1所示,
图1
2.2、数控部分(用proteus与keil结合仿真)
主要由AT89C51最小系统控制,它要完成键盘控制、预置电压显示控制等功能,由键盘和数码管(由于proteus中没有三位连一起的数码管,所以仿真采用了4位的)共同来完成数控部分。
即上电之后,数码管首先显示0,然后按键“+”,并用万用表测输出端电流大小,数码管所显示的应与万用表读数一致,同理按键“-”也是如此。
复位按键按下去后,数码管清零,输出端电流也为0。
单片机的最小系统应该包括晶振电路和复位电路,晶振电路是单片机的心脏,只有合适的晶振才能使单片机起振并正常工作。
复位电路可以使单片机恢复的上电之后的初始状态,以方便测试。
独立键盘是单片机的一个输入,而数码管是单片机的一个输出,输入与输出之间通过单片机内部电路和C程序联系起来,从而达到按键与数码管显示同步,即数控的目的。
Proteus是一款强大的单片机仿真软件,其含有丰富的IC库和MCU库,含有单片机所有的输入硬件与输出硬件,只要是正确的电路和正确的程序,都可以仿真出来所需要的结果。
数控部分电路如图2所示,
图2
单片机P2口接共阴数码管的8段(包含小数点);P1^0、P1^1、P1^2接数码管的位选,分别控制对应的数码管亮或者灭;P0^0—2口分别接三个按键,KEY1按键控制复位,KEY2按键控制加,KEY3按键控制减。
需要注意的是P0口在接的时候必须接上拉电阻,大小1-10K均可以,此处接为1K,上拉电阻接Vcc,三个按键接地。
2.3、电源部分
电源部分输入220V、50Hz交流电,输出全机所需的三种电压:
+5V、+12V、-12V。
其中+5V用来给单片机供电以与DA芯片供电;正负12V用来给运放供电。
2.3.1、+5V电源(用multisim仿真)
+5V电源电路图如图3所示
图3
图中,XFG1是信号发生器,应设置为220V,50HZ的交流电(峰峰值为380V),如图4
图4
图4
经过变压器后,变为约9V的交流电,而后经过一个全桥整流,交流电变为脉冲直流。
在进入三端稳压器LM7805之前,经过极性电容C1,其作用仍是将交流电变为直流电,然后经过三端稳压器变为直流电压,输出端接了电容C2,用以改善负载的瞬态响应,消除电路的高频噪声,同时也具有消振作用,由于C2较大(110uF),其优点是可以提高稳压电源的脉冲响应,输出较大的脉冲电流。
其仿真结果如图5
图5
2.3.2、正负12V电源
电路图如图6,
图6
该图是产生正负12V双电源的电路原理图,采用的是LM7812和LM7912的集成稳压芯片组成的具有同时输出正负12V的稳压电路。
该电路对称性好,温度特性也近似一致。
电源输出端接有保护二极管D1和D2.如果不接保护二极管,LM7812输出电压通过负载加到7912的输出端,必将7912烧毁。
在正常工作情况下,D1和D2均处于截止状态,不影响电路的工作。
其仿真过程和情况与上述5V的大致一样,这里不再赘述。
2.4、输出电流源
2.4.1、输出电压源
由单片机送出来的数字信号经过DA芯片转好之后成为模拟信号,然后经过一个运算放大器放大为电压信号,这部分电路图如图7所示
图7
其中,A1-A8是数据的输入端,V0是输出电压端。
对于DAC0808这个芯片来说,
V0=VREF(A1/2+A2/4+……+A8/256),此处VREF采用正负12V电源中的正12V电源即可。
因此V0最大输出电压约为12V。
2.4.2、电压源转换成为电流源
电路如图8
图8
由图可见,电路中的主要元件为一运算放大器LM358和三极管与其他辅助元件构成,V0为偏置电压,Vin为输入电压即待转换电压,R为负载电阻。
其中运算放大器起比较器作用,将正相端电压输入信号与反相端电压V-进行比较,经运算放大器放大后再经三极管放大,射级电流Ie作用在电位器Rw上,由运放性质可知:
V-=Ie•Rw=(1+k)Ib•Rw
(k为BG9013的放大倍数)
流经负荷R的电流Io即集电极电流等于k•Ib。
令R1=R2,则有V0+Vm=V+=V-=(1+k)Ib•Rw=(1+1/k)Io•Rw,其中k》1,所以Io≈(Vo+Vin)/Rw。
由上述分析可见,输出电流Io的大小在偏置电压和反馈电阻Rw为定值时,与输入电压Vin成正比,而与负载电阻R的大小无关,说明了电路良好的恒流性能。
改变V0的大小,可在Vin=0时改变Io的输出。
在V0一定时改变Rw的大小,可以改变Vin与Io的比例关系。
由Io≈(V0+Vi)/Rw关系式也可以看出,当确定了Vin和Io之间的比例关系后,即可方便地确定偏置电压V0和反馈电阻Rw。
例如将0~5V电压转换成0~5mA的电流信号,可令V0=0,Rw=1kΩ,其中Vo=0相当于将其直接接地。
若将0~5V电压信号转换成1~5mA电流信号,则可确定V0=1.25V,Rw=1.25kΩ。
同样若将4~20mA电流信号转换成1~5mA电流信号,只需先将4~20mA转换成电压即可按上述关系确定V0和Rw的参数大小,其他转换可依次类推。
对于DA送出来的电压,变化范围是0-12V,即Vin=0-12要转换成200mA-2000mA的电流,则应该满足:
0.2A=V0/RW;
2A=(V0+12)/RW;
可解得V0=4/3V,RW=20/3Ω。
DA的步进为12/256=0.046875V,所以电流步进为0.046875/RW=7.03125mA,满足小于等于10mA的要求。
3、系统软件设计
本设计采用C语言编程,方便简洁。
并且与keil和proteus结合进行仿真,快速方便,主程序流程图如入9。
图9
本设计编写的C程序如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P0^0;
sbitk2=P0^1;
sbitk3=P0^2;
sbitLS138A=P1^0;
sbitLS138B=P1^1;
sbitLS138C=P1^2;
uintshu=0;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
ucharLedOut[3];
uchartemp=0;
voiddelay(unsignedchari)
{
charj;
for(i;i>0;i--)
for(j=200;j>0;j--);
}
voidkeyscan()
{
intm=0;
while(k2==0)
{shu=shu+2;
if(k2==0)
{while(!
k2);
delay(5);
while(!
k2);
temp++;
LedOut[0]=table[temp%10];
LedOut[1]=table[temp%100/10]|0x80;
LedOut[2]=table[temp/100];
}
}
for(m=0;m<3;m++)
{
P2=LedOut[m];
switch(m)
{
case0:
LS138A=1;LS138B=0;LS138C=0;break;
case1:
LS138A=0;LS138B=1;LS138C=0;break;
case2:
LS138A=0;LS138B=0;LS138C=1;break;
}
delay(100);
}
while(k3==0)
{shu=shu-2;
if(k3==0)
{while(!
k3);
delay(5);
while(!
k3);
temp-=1200/256;
LedOut[0]=table[temp%10];
LedOut[1]=table[temp%100/10]|0x80;
LedOut[2]=table[temp/100];
}
}
for(m=0;m<3;m++)
{
P2=LedOut[m];
switch(m)
{
case0:
LS138A=1;LS138B=0;LS138C=0;break;
case1:
LS138A=0;LS138B=1;LS138C=0;break;
case2:
LS138A=0;LS138B=0;LS138C=1;break;
}
delay(100);
}
if(temp==100)temp=0;
}
voidmain()
{
while
(1)
{
keyscan();
P0=shu;
}
}