压控恒流源2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

相关文档
最新文档