简易直流电子负载
简易直流电子负载
张良 毛伟 周旭
摘要:本设计是以场效应晶体管电压转换电流原理为核心,以硬件反馈实现恒流为基础,以单片机控制为中心的高精度作品。此次设计为恒流源法直流电子负载。本系统中电压和电流的测量都采用高精度运放对电压和电流分别采样处理,再利用12位高精度ICL 7135输入口进行电压和电流检测和监控。硬件电路恒流部分的控制端采用多个精密运算放大器OP07接成闭环反馈控制形式。系统达到了恒流稳定性高的效果,实时显示电压电流,电流范围为100mA—1000mA,步进为10mA,且分辨率达到1mA(V)。直流负载热稳定性高,工作过程中基本不会因发热而产生偏差,且可以持续很长时间。本设计具有过压保护功能,成本低廉,可靠性高。
关键字:场效应管;采样;闭环反馈;过压保护
一、方案论证
1、恒流控制方案
方案一:从取样电阻取回的电压与DA输出电压作差分放大,放大后的电压经电阻转换为电流,电流经过达林顿复合管扩流后得到所需要的电流。 方案二:从取样电阻取回的电压与DA输出电压作差分放大,放大后的电压经过场效应管直接变换为电流。 方案选择:方案一虽能够达到所需电流要求,但复合管的基极的电流会流入负载,对电流的恒流造成误差;方案二中的场效应管能够实现电流要求,且输入级没有电流,在放大区工作稳定,因此选择方案二。 2、输出电流采集方案 方案一:直接从功耗电阻上采集电压,从而得到电压和固定电阻得到电流采样。 方案二:在功耗元件上端串联一个小功率电阻作为采样,采得电压除以固定电阻得到电流。
方案选择:方案一中的采集电阻大,因而采集得到的电压变化很大,经过运放后对电流的精确度有影响,而方案二中的电阻为精确小电阻,得到电压精确运算后可以得到精确电流。 3、功耗原件选择方案
方案一:功耗元件为功率管,大部分功率都消耗在功率管上。
方案二:功耗元件为多只功率电阻并联作为功耗电阻,晶体管只为开关使用,开关上消耗功率低。 方案选择:方案一中对功率管的热消耗巨大,对功率管的散热具有非常高的要求,且发热会对电流产生误差,方案二中的功率原件为多只功率电阻,因而电阻的发热比较小,对电流影响较小,因此选择方案二。 4、输出电压采集方案
方案一:对功耗元件上电压采集得到电源输出电压。
方案二:对整个电流支流的电压进行采集,即对整个输出电压采集。 方案选择:方案一是对功耗元件电压的准确测量,但在电流采样电阻和晶体管上也有分压,并不能代表输出电压(负载电压),方案二是对整体输出电压的采样,能准确测量电源输出电压(负载电压),因此选择方案二。
二、系统总体方案
如图2-1所示:本设计采用高速单片机作为恒流源的控制、显示和输出电压电流检测核心,实现了100mA到1000mA数控可调直流电子负载。系统的显示部分采用128×64点阵式液晶显示屏实时显示输出电压值和电
流值;输出电流控制采用TI芯片DAC7611输出模拟量来控制OP07;电流测量采用基本没有温度漂移的康锰铜电阻丝作为精密取样电阻,利用单片机外扩的A/D输入口进行电流检测和监控。硬件电路恒流部分的控制端采用多个精密运算放大器OP07接成闭环反馈控制形式,受控部分采用IRF540场效应功率管产生电流。电源部分运用LM7805和LM7905产生正、负12V电压供电,多级电容滤除纹波干扰;实时监测输出电压和电流,根据电压变化率得到负载调整率,当输出电压大于18V能够实现报警和软件关断功能。
1、控制模块:采用高精密放大运放OP07对控制信号和反馈信号取差,差信号控制功率管。
2、测量模块:采用12位AD转换芯片对电压电流实时监测。
3、过压保护模块:采用软件保护,当监测输出电压达到18V时,送一高电平给I/O,单片机监测到高电平时DA停止工作。
4、功耗模块:用四个30欧姆水泥功率电阻做功耗原件。从而整体实现电子负载的功能。
5、电源模块:采用线性集成稳压器LM7805,,LM7905构成正负12V和正负 5V供电电压。
三、理论分析与计算
1、电子负载及恒流电路的分析 电子负载为功率管和功率电 阻组成的功耗负载,输出功 率都消耗在功率管和功率电 阻上,实现了电子负载的功能。
恒流电路的实现:控制电路为DAC输出直流
电平和从取样电阻得到的取样电压取差,差值放大控制晶体管的漏极,从而控制电流的稳定,具体流程如图3-1所示:当电流变化,采样电压改变,采取的电压和控制电压取差后控制晶体管电流朝与之前变化相反的方向变化,直到稳定,从而实现恒流。 2、电压、电流的测量及精度分析
电压、电流的测量都是通过对电压、电流取样,得到的电压值经过精密运放OP07处理,得到0-2V信号,送给12位AD转化后由单片机处理并显示。12位的AD和DA可以得到1mA和1mV的分辨率,且OP07为高精度运放,控制好电路反馈系数可以达到题目所需精度。 3、电源负载调整率的测试原理 如图3-2所示:电压负载调整率为:
V1V2
100% (3-3-1) V1
V1为空载(半载)时电子负载两端电压,
V2为满载时电子负载两端电压即为额
定电流(1A)时输出电压。
4、最小实现稳流电压计算:
如图3-3所示:
VOutI*RsRLRsd (3-2-1)
Rs为500m;RL为6;
Rsd一般可以忽略。
得Vmin1*0.5606.5V (3-2-2)
四、主要功能电路设计
1、恒流电路设计
如图4-1所示:电路由闭环反馈实现电流的稳定。采样电压和控制电压
取差,经开环放大,得到控制信号,控制电流。
2、电压采样电路设计 如图4-2所示: 电压采集用OP07差分 取样,取样后的电压 进行十分之一衰减, 衰减后信号经过ICL7135 1 2位AD转换送与单片机 处理。从而达到1mV分 辨率的要求。 3、数字电路的设计
(1)DAC7611的外围电路:如图4-3所示: (2)ICL7135的外围电路: 如图4-4所示:
这两款芯片分别实现控制和测量的精度。
4、过压保护电路设计
过压保护电路采用软件保护,当检测到输出电压大于某一特定值时(17.98V衰减为原来的十分之一为1.798V,相对安全),DA输出为0,且有预警提示。 5、电源模块设计
6、总电路设计
见附录
五、系统软件设计
1、系统程序流程图:
2、、重要运算方法。
(1)DAC7611输出电压由下式给出:
REF
CODE
(V) (5-2-1)
Ox1000
其中REF是内部基准电压,而CODE是数字输入值,范围从0X000至0XFFF。上电复位将内部锁存为一个规定的初始状态。
(2)对电流电压的显示过程中,必须按照与运放反馈系数比例关系来显示电压、电流。其中电流采样电压放大为5倍,电压采样电压衰减为之前的十分之一,在软件中赢相应除以5和乘以10。 (3)负载调整率的计算:Si
UOUN
100% (5-3-1) UO
由上式可知,我们需要测量两个电压信号,最后算得负载调整率。
3、重要源代码 见附件
六、测试方案与测试结果
1、测试方案的选择
本次设计为高精度信号,分辨率达1mA、1mV,因而一般示波器和电表测不出来,所以我们选择4位半的数字电表作为测量仪器。
测量仪器:4位半数字电表,被测稳压电源,供电电源和线性可变功率电阻。 2、测量方法:
电压测量:将四位半表和被测电压并联,读取四位有效数字。
电流测量:将四位半表和电路串联,选取合适档位,读取四位有效数字。 3、测试结果:如表6-3-1所示:
预置电流 100mA 200mA 500mA 510mA 520mA 1000mA
实测电流 100mA 200mA 501mA 511mA 520mA 1001mA
实测电压
9.000V 8.998V 8.993V 8.993V 8.992V 8.980V
被测电压 6.500V 7.000V 7.500V 10.00V 16.50V 17.50V
实测电流 1000mA 1000mA 1000mA 1000mA 1001mA 1001mA
4、测试结果分析:由数据结果可以得知,本次直流电子负载可以实现,
负载上的电流可以步进控制,且输入电压在可控范围内变化时,电子负载上的电流不会发生变化,达到电子负载的精度和稳定度。此次设计具有非常高的热稳定性和可靠性,可以不限时长工作,但达到恒流电压变化范围相对较小。
参考文献:
[1] 李朝青编著.单片机原理及接口技术(3)版.北京:北京航空航天大学出版
社,2005.9
[2] 谢自美主编.电子线路设计·实验·测试(第二版)武汉:华中理工大
学出版社,2007.7
[3] 董尚斌主(编).电子线路(Ⅰ).北京:清华大学出版社,2006.10
附件
1、总体电路图 如图所示:
图1-1 总体电路设计 2 源程序代码: #include #include #include #include
#define LCD_CW XBYTE[0xF900] #define LCD_DW XBYTE[0xF940] #define LCD_CR XBYTE[0xF980] #define KEY_a XBYTE[0xFE00]
#define KEY_b XBYTE[0xFF00]
#define LCD_BUSY while(LCD_CR & 0x80) typedef unsigned int uint; typedef unsigned char uchar; sbit CS =P1^4; sbit CLK=P1^5; sbit SDI=P1^6; sbit LD=P1^7; sbit BUSY1=P3^3; sbit BUSY0=P3^2; xdata float m,n,da=0; xdata uint vol=131;
xdata char buff0[6],buff1[6],buff2[4],buff3[4]; xdata uchar a;
void print(uchar X,uchar Y,uchar *str) { if(X==0){X=0x80;}
else if(X==1){X=0x90;} else if(X==2){X=0x88;} else if(X==3){X=0x98;}
LCD_BUSY;
LCD_CW=X+Y;
while(*str!='\0')
{ LCD_BUSY;
LCD_DW=*str; str++;
}
}
void dis_LCD(uchar X,uchar Y,uchar date) {
uchar wz; if(X==0)
{X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
wz=X+Y; LCD_BUSY; LCD_CW=wz;
LCD_BUSY; }
void init(void) {
LCD_DW=date;
LCD_BUSY;LCD_CW=0x30;LCD_BUSY;LCD_CW=0x0C;LCD_BUSY;LCD_CW=0x01; }
void delay(uint z) {
uint x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******初始化DAC7611******************/ void init_da(void) {
LD=0; CS=1; CLK=1; SDI=0; }
/*****时钟脉冲子函数***********/ void clock(void) { CLK=0; _nop_(); CLK=1; _nop_(); }
/******DAC7611转换***************/ void DAC_7611(unsigned int vol) { uint i; uint DaDate; DaDate=vol;
LD=1; _nop_();
CS=0; for(i=0;i
SDI=DaDate&0x800;
clock(); DaDate
CLK=1; _nop_();
CS=1; _nop_();
LD=0; _nop_(); _nop_(); _nop_(); _nop_(); LD=1; }
void ICL_7135() //初始化子程序 {
TMOD=0xdd; TL1=0; TL0=0; TH1=0; TH0=0;
IT1=1; IT0=1;
EA=1;
}
float dy(void) {
float out;
while(BUSY0); while(!BUSY0); TR0=1; while(BUSY0); TR0=0;
out=1.0*(TH0*256+TL0-10000);
TL0=0;
TH0=0;
sprintf(buff0,"%6.3 fV",out/1000); print(2,4,buff0); if((out/1000)>=17.98) {vol=0;
DAC_7611(vol); da=(vol*4.096/4096)*1000; sprintf(buff3,"%5.3fA",da/1310); print(0,4,buff3); }
return out;
}
void dl(void) { float ICL7135_out; int count1; while(BUSY1); while(!BUSY1); TR1=1; while(BUSY1); TR1=0; count1=TH1*256+TL1;
ICL7135_out =1.0*(count1-10000); TL1=0; TH1=0;
sprintf(buff1,"%6.4fA",ICL7135_out/19999 ); print(1,4,buff1);
}
void int0()interrupt 0 {
if(KEY_a==0xfe) {vol=vol+20;}
if(KEY_a==0xfd) {vol=vol-20; }
if(KEY_a==0xfb) {vol=vol+201; }
if(KEY_a==0xf7) {vol=vol-201;}
if(KEY_a==0xef) {DAC_7611(0);n=dy()/1000;TR2=1;} //if(KEY_a==0xdf) {delay(100); }
if(KEY_b==0xef) {vol=vol+1;}
if(KEY_b==0xdf) {vol=vol-1;}
while(!(KEY_a==0xff));
while(!(KEY_b==0xff));
} void Tint() {
ET2=1;EA=1; TMOD=0x40;
TH2=(65536-50000)/256; TL2=(65536-50000)%256; }
void int5()interrupt 5 { float T; a++;
TH2=(65536-50000)/256;
TL2=(65536-50000)%256; if(a==20) {TR2=0; a=0;
DAC_7611(2010); m=dy()/1000;
T=(n-m)/n;
sprintf(buff2,"%4.1f%",T); print(3,4,buff2);
} }
void main() { float da=0;
IE=0x81; init(); Tint(); vol=20;
delay(400);
print(0,0,"预置 I="); print(1,0,"实测 I=");
print(2,0,"实测 U="); print(3,0,"调整率T="); dis_LCD(3,6,0x25); ICL_7135();
init_da(); while(1) {
DAC_7611(vol);
da=(vol*4.096/4096)*1000; sprintf(buff3,"%5.3fA",da/2010);
print(0,4,buff3);
dy();
dl();
}
}