直流电子负载.docx
《直流电子负载.docx》由会员分享,可在线阅读,更多相关《直流电子负载.docx(15页珍藏版)》请在冰豆网上搜索。
直流电子负载
直流电子负载
、基本要求
(1)负载工作模式:
恒压(CV)、恒流(CC)两种模式可选择。
(2)电压设置及读出范围:
1.00V〜20.0V。
(3)电流设置及读出范围:
100mA〜3.00A。
(4)显示分辨力及误差:
至少具有三位数,相对误差小于5%。
、总体方案论证与设计
2.1参数设计方案
利用A/D转换把模拟信号转换为数字信号,在利用单片机程控来修改电压电流参数,
此方案精确度高,操作技术要求很高,节省时间。
并且用DA采集显示测量值,比较得出结
论。
2.2恒流恒压设计方案
1.定电流模式(CCmode)
在定电流工作模式时,电子负载所流入的负载电流依据所设定的电流值而保持恒定,与输入电压大小无关,即负载电流保持摄定值不变。
2.定电压模式(CVmode)
在定电压工作模式时,电子负载所流入的负载电流依据所设定的负载电压而定,此时
负载电流将会增加直到负载电压等于设定值为止,即负载电压保持设定值不变。
R1
10
2.4单片机模块设计
电源模块基本电路图
D1
D1N4148
ECIEJSl
C4
OJO
ui1
11
氓TR供
_
4
3
Ex
-
+
tn
1
1
1
COl^
I
1
1
2.3电源模块设计
V^juL
InF
U1
1£DS
■KJ*
单片机模块基本电路
三、测试及分析
测试原始数据
1.恒流模式数据测量
模式
设定值(A)
测量值1(A)
测量值2(A)
测量值3(A)
工作电压(V)
工作电压(V)
工作电压(V)
恒流
0.37
0.43
0.43
0.43
0.85
2.08
3.49
恒流
0.75
0.76
0.76
0.76
1.23
2.43
4.45
恒流
1.13
1.15
1.15
1.15
1.42
4.09
5.38
恒流
1.70
1.72
1.72
1.72
2.29
4.66
6.22
恒流
1.89
1.91
1.91
1.91
3.24
5.35
6.87
2.恒压模式数据测量
模式
设定值(V)
测量值1(V)
测量值2(V)
测量值3(V)
工作电压(V)
工作电压(V)
工作电压(V)
恒压
1.11
1.12
1.12
1.12
1.68
3.81
7.40
恒压
3.11
3.16
3.08
3.14
4.87
7.34
10.25
恒压
9.00
8.96
9.04
9.04
10.03
12.27
15.33
恒压
15.22
15.16
15.24
15.18
15.49
17.78
19.34
恒压
20.00
19.92
19.84
19.90
20.22
21.12
22.23
四、附录
基本程序
恒流模块
#inelude
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P2A7;
sbitE=P2A6;
sbitadwr=P2A5;
sbitadrd=P2A4;
floatadval;
longinttemp;
voiddelay(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)for(y=110;y>0;y--);
}
write_com(ucharcom)//写命令
{
rs=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
write_data(uchardat)//写数据
{
rs=1;
P0=dat;
delay(5);
E=1;
delay(5);
E=0;
}
init()//液晶初始化
{
E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+3);
}
voidDisplay_Resulti(uchardac)//恒流设定值子程序
{
floatdb=0.0;ucharshi=0,ge=0,xs=0,xxs=0;P3=dac;
db=dac*3.00/158.00;shi=(int)db/10;ge=(int)db%10;
db*=10.0;xs=(int)db%10;
db*=10.0;xxs=(int)db%10;
write_com(0x80+1);delay
(2);
write_data('c');delay
(2);
write_data('u');delay
(2);
write_data('r');delay
(2);
write_data('r');delay
(2);
write_data('e');delay
(2);
write_data('n');delay
(2);
write_data('t');delay
(2);
write_data(0x3a);
delay
(2);
if(shi==0)
{write_data(0x20);delay
(2);
}elsewrite_data(0X30+shi);delay
(2);write_data(0X30+ge);delay
(2);write_data(0x2e);delay
(2);write_data(0x30+xs);delay
(2);write_data(0x30+xxs);
delay
(2);
voidDisplay_Resulti1(floatadval)//测量电流值子程序{
ucharge,xs,shi,xxs;temp=(longint)(adval*105/51);shi=temp/1000;
ge=temp/100%10;xs=temp/10%10;
xxs=temp%10;
write_com(0x80+0x40+1);delay
(2);
write_data('C');delay
(2);
write_data('U');delay
(2);
write_data('R');delay
(2);
write_data('R');delay
(2);
write_data('E');delay
(2);
write_data('N');delay
(2);
write_data('T');delay
(2);
write_data(0x3a);
delay
(2);
if(shi==0)
{write_data(0x20);delay
(2);
}
elsewrite_data(0X30+shi);delay
(2);
write_data(0X30+ge);delay
(2);
write_data(0x2e);
delay
(2);
write_data(0x30+xs);
delay
(2);
write_data(0x30+xxs);
delay
(2);
}
voidADC()
{
adwr=1;_nop_();adwr=0;_nop_();adwr=1;P1=0xff;adrd=1;
_nop_();adrd=0;
_nop_();adval=P1;adrd=1;
}
voidmain()
{
//启动AD转换
//主程序
init();
TMOD
=0x02;
//定时器初始化
TH0
=0x6f;
TL0=
0x00;
IE=
0x82;
TR0
=1;
while
(1)
//显示模块
{ucharkey=0;bitkeyflag=1;uintdac=0;Display_Resulti(dac);
while
(1)//键盘扫描控制显示
{Display_Resulti1(adval);
ADC();key=P2&0x0f;
switch(key)
{
case0x0e:
if(keyflag){dac=0;Display_Resulti(dac);keyflag=0;
}break;
case0x0d:
if(keyflag){dac+=10;Display_Resulti(dac);keyflag=0;
}break;
case0x0b:
if(keyflag){dac-=10;Display_Resulti(dac);keyflag=0;
}break;
case0x07:
if(keyflag){dac=158;Display_Resulti(dac);keyflag=0;
}break;
case0x0f:
keyflag=1;break;
}
恒压模块
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P2A7;
sbitE=P2A6;
sbitadwr=P2A5;
sbitadrd=P2A4;
floatadval;
longinttemp;
voiddelay(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)for(y=110;y>0;y--);
}
write_com(ucharcom)//写命令
{
rs=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
write_data(uchardat)//写数据
{
rs=1;
P0=dat;
delay(5);
E=1;
delay(5);
E=0;
}
init()
//液晶初始化
E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);write_com(0x80+3);
//恒压设定值子程序
}
voidDisplay_Resultu1(floatadval)
{
ucharge,xs,shi,xxs;
temp=(longint)(adval*110/51);temp=temp*4;
shi=temp/1000;ge=temp/100%10;
xs=temp/10%10;xxs=temp%10;
write_com(0x80+0x40+1);delay
(2);
write_data('V');
delay
(2);
write_data('O');
delay
(2);
write_data('L');
delay
(2);
write_data('T');
delay
(2);
write_data('A');
delay
(2);
write_data('G');
delay
(2);
write_data('E');
delay
(2);write_data(0x3a);
delay
(2);
if(shi==0)
{
write_data(0x20);
delay
(2);
}
else
write_data(0X30+shi);
delay
(2);
write_data(0X30+ge);
delay
(2);
write_data(0x2e);
delay
(2);
write_data(0x30+xs);
delay
(2);
write_data(0x30+xxs);
delay
(2);
//测量电压子程序
}
voidDisplay_Resultu(uchardac)
{
floatdb=0.0;
ucharshi=0,ge=0,xs=0,xxs=0;
P3=dac;
db=dac*20.00/255.00;
shi=(int)db/10;
ge=(int)db%10;
db*=10.0;
xs=(int)db%10;
db*=10.0;
xxs=(int)db%10;
write_com(0x80+1);
delay
(2);
write_data('v');
delay
(2);
write_data('o');
delay
(2);
write_data('l');
delay
(2);
write_data('t');
delay
(2);
write_data('a');
delay
(2);
write_data('g');
delay
(2);
write_data('e');
delay
(2);
write_data(0x3a);
delay
(2);
if(shi==0)
{write_data(0x20);delay
(2);
}
elsewrite_data(0X30+shi);delay
(2);
write_data(0X30+ge);delay
(2);
write_data(0x2e);delay
(2);
write_data(0x30+xs);delay
(2);
write_data(0x30+xs);delay
(2);
}
voidADC()//启动AD转换{
adwr=1;
_nop_();
adwr=0;
_nop_();
adwr=1;
P1=0xff;adrd=1;_nop_();adrd=0;
_nop_();adval=P1;
adrd=1;
//主程序
}
voidmain()
{init();
TMOD
=0x02;
TH0
=0x6f;
TL0
=0x00;
IE=
0x82;
TR0
=1;
//定时器初始化
while
(1)//显示模块
{
ucharkey=0;
bitkeyflag=1;
uintdac=0;
Display_Resultu(dac);
while
(1)//键盘扫描控制显示
{Display_Resultu1(adval);
ADC();key=P2&0x0f;
switch(key)
{
case0x0e:
if(keyflag)
{
dac=0;
Display_Resultu(dac);keyflag=0;
}
break;
case0x0d:
if(keyflag)
{dac+=5;Display_Resultu(dac);keyflag=0;
}
break;
case0x0b:
if(keyflag)
{dac-=5;Display_Resultu(dac);keyflag=0;
}
break;
case0x07:
if(keyflag)
{
dac=255;
Display_Resultu(dac);keyflag=0;
}
break;
case0x0f:
keyflag=1;break;
}
}
}
}