压控恒流源2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数控恒流源设计
摘要:设计利用集成运放、场效应管对电流放大与单片机的自动控制来实现数控直流电流源。系统有控制模块与恒流源模块组成。控制模块使用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
#include
#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;
}
}