数控恒流源设计
摘要:设计利用集成运放、场效应管对电流放大与单片机的自动控制来实现数控直流电流源。
系统有控制模块与恒流源模块组成。
控制模块使用AT89S52结合按键与四位数码管显示,实现对恒流源的数控和预设值的显示。
恒流源模块采用OP07与IRF640组成的反馈放大电路实现对电流的放大。
控制到恒流源的信号转换采用DAC0832来实现;实测显示模块有ADC0809组成的显示电路来显示。
并使用自制电源进行供电。
关键词:AT89S51,恒流源,ADC0809,DAC0832,OP07
1硬件电路设计与分析
1.1
恒流源模块:
恒流源分为流控式与压控式,由于压控式易于实现,电路实现相对简单;因此本模块使用了压控式恒流源。
压控式恒流源可以有集成运放芯片与晶体复合管或场效应管来实现;但由于晶体复合管实现起来比较复杂,发热量相对MOS管相
对较大,性能参数相对MOS管较差;因此本模块采用高精度集成运放芯片OP07与大功率场效应管IRF640相结合构成的恒流源。
压控恒流源是系统的重要组成部分,它的功能用电压来控制电流的变化,由于系统对输出电流大小和精度的要求比较高,所以选好压控恒流源电路显得特别重要。
恒流源是采用了电流反馈的方式来稳定电流的,下图是个典型的正向电流源,利用运放虚短的概念,使R2上的电压保持与V一致,来获得一个I=V/R2的恒流源。
该恒流源电路由运算放大器、大功率场效应管Q1、采样电阻R3、负载电阻R4
等组成。
电路原理图如图所示:
恒流源电路图
调整管采用大功率场效应管IRF640N更易于实现电压线性控制电流, 满足最大电流和电压线性电流化。
因为当场效应管工作于饱和区时,漏电流Id近似
为电压Ugs控制的电流。
即当Ud为常数时,满足:Id=f(Ugs),只要Ugs不变,Id 就不变。
在此电路中,R3为取样电阻,阻值为10欧。
运放采用OP07作为电压跟随器,场效应管Id=Is(栅极电流相对很小,可忽略不计) 所以Io=Is= Ui/R3。
正因为Io=Ui/R3,电路输入电压Ui控制电流Io,即Io不随R4的变化而变化,从而实现压控恒流。
由于输出电压变化的范围U〈=10V,Iomax=200mA,可以得出负载电阻
R3max=50欧。
1.2控制模块:
由于按键模块、数码管显示、D/A模块本就是控制模块的细化模块;因此在电路设计、分析中把这几个模块在一起分析。
以AT89S52最小系统为核心,外加按键模块、数码管显示模块、以及D/A转换。
D/A设计在使用芯片上采用8
位DAC0832芯片,D AC0832输出的电流通过OP07运放放大为电压,再通过一个运放OP07将电压变为正电压,通过单片机控制输出电压大小,实现数模转换,来控制恒流源的输入电压,从而控制恒流源的输出电流,电路图如下:
控制电路图
1.3显示模块:
由于在控制模块的电路分析中已经对液晶显示器进行了分析,并且在软件设计模块中也会有体现,这里不再多做介绍。
使用ADC0809芯片将模拟信号转换为数字信号,经单片机采集后经数码管显示;测电流时,外串联一个电阻将电流信号转换为电压信号显示。
其中ADC0809的模拟输入电压就是恒流源中采样电阻的电压,原理图如下:
2 软件设计模块
恒流源的数字控制器采用ATMEL公司的AT89S52,因为在程序不需要涉及精准实时操作,所以使用C语言进行软件编写,这样可以大大提高程序编写时的效率。
程序设计上使用一个定时器作为系统实时时钟,周期性的进行数码管显示,按键扫描,AD转换和显示内用的切换。
而主循环负责对按键进行处理。
主程序流程图如图:
图5 软件流程图
程序:
#include<absacc.h>
#include<reg51.h>
#define DAC0832 XBYTE[0x7fff]
#define uchar unsigned char
#define uint unsigned int
sbit START=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit dp=P1^7;
sbit s1=P3^4;
sbit s2=P3^5;
sbit P27=P2^7;
sbit P26=P2^6;
uchar data led[4];
uint data tvdata;
int temp=53; //预设电压
uchar b;
uchar code tv[]={0xfe,0xfd,0xfb,0xf7};
uchar code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void init() //中断初始化
{ TMOD=0x01;
TH0=(65536-35)/256;
TL0=(65536-35)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0()interrupt 1 //定时器0服务程序
{
TH0=(65536-35)/256;
TL0=(65536-35)%256;
b=~b;
P26=b;
}
void delay(uint i)
while(i--);
}
void keyscan() //键盘扫描 {
if(s1==0)
{ delay(10);
if(s1==0)
{
while(!s1);
temp=temp+1;
if(temp>=105)
temp=11;
}
}
if(s2==0)
{ delay(10);
if(s2==0)
{
while(!s2);
temp=temp-1;
if(temp<11)
temp=105;
}
}
void ledxianshi(void) //显示模块{
uchar k,i;
uint t;
t=(tvdata*1.0/255*500)*10;
led[0]=t%10;
led[1]=t/10%10;
led[2]=t/100%10;
led[3]=t/1000;
for(k=0;k<4;k++)
{
P2=tv[k];
i=led[k];
P1=a[i];
if(k==1)dp=1;
delay(300);
}
}
void main(void)
{
init();
while(1)
{
START=1;
START=0; //启动转换
while(EOC==0);
OE=1;
tvdata=P0;
OE=0;
// START=1;
keyscan();
DAC0832=temp;
ledxianshi();
delay(10);
}
}
设计中存在的问题分析与解决方案:
(1)数码管显示亮度不够:只有第一位较亮,其余三位亮度均不明显;经测试分析原因是没有加数码管驱动芯片,数码管的显示时间较短。
解决方法:加驱动芯片74HC245,将数码管的显示时间延长一些。
(2)用万用表测电流时电流偏小,测量电压时显示正确;经测试分析原因可能是取样电阻10欧太小,恒流源最大输入电压为2V,测电流时万用表内部和表头都有一定的电阻值共约为1.5欧。
解决方法:将取样电阻加大为25欧,恒流源最大输入电压增加为5V,以减少测量仪器本身的内阻带来的误差。
因为取样电阻不是很大,测量仪器带来的误差
不可能忽略,经测试恒流源输入的电压越大,万用表测得的输出电流误差也就越大。
(3)数码管显示的数据不稳,仅在两个值之间变化;经测试分析得出的结论是原因可能以下几个方面:一是电压源的纹波偏大导致输入的电流不稳;二是AD 模块始终循环采集电压,每次采集的电压并不完全相同,只要采集的电压有一点点变化就会导致显示不稳;三是电路焊接出现的问题。