数控恒压恒流源设计报告.docx
《数控恒压恒流源设计报告.docx》由会员分享,可在线阅读,更多相关《数控恒压恒流源设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
数控恒压恒流源设计报告
数控恒压恒流源
学校:
电子科技大学中山学院
指导老师:
刘根据
参赛队员:
李俊龙、梁创学、黄立群
2013年12月20日
摘要
本系统以STC12C5A60S2为核心,实现电压可预置,步进电压为100mV,输出电压范围为5V到10V,输出电流为100-1000mA。
可显示预置电压,实测电压,实测电流,实测效率。
该系统主要由STC12C5A60S2单片机系统,PWM信号控制芯片TL494,斩波主回路,按键,A/D以及D/A等组成。
系统通过键盘预置电压值送给TL494形成闭环反馈电路,采样精密电阻上的电压,采样康铜丝上的电压间接推算出其电流并显示。
本系统具有调整速度快,精度高,电压调整率低,负载调整率低,效率高,输出纹波小等优点。
关键词:
STC12C5A60S2、TL494、恒压、恒流
1.方案论证与比较
1.1系统总体框图及设置
通过按键单片机对主电路进行恒压或恒流功能的切换,并且经单片机给控制芯片TL494提供一个基准电压,与采样电压进行比较,从而改变TL494输出波形的占空比,进而控制IRF540的开启与截至,从而控制主电路电压的大小,达到设定值。
采样得到的电压值、电流值在液晶12864上进行实时显示。
1.2控制方案的比较论证
方案一:
直接用单片机产生PWM波控制开关管,这样编程变得很复杂,干扰较大。
方案二:
用芯片TL494去控制PWM波的产生,单片机编程简单,并且TL494的占空比调节范围大,易于进行控制。
综上所述,选用方案二用TL494芯片去控制PWM波的产生。
1.3输出方案
方案一:
选用1602,但1602界面简单,只能显示字母和阿拉伯数字。
方案二:
选用12864,12864除了现实字母与阿拉伯数字外,还可以显示汉字,人机界面比较好。
综上所述选用方案二用12864作为显示。
1.4按键选择方案
方案一:
矩阵按键的编程复杂,在使用时要时刻扫描,浪费单片机的资源。
方案二:
独立按键编程简单,在该系统中使用了外部中断,并且只用到四个按键,这样就不用时刻扫描,因此可以节省资源去处理DA和AD转换。
综上所述选用方案二用按键进行控制。
1.5提高效率的方案
开关管,电感电容的选择很重要。
开关管要注意导通压降,开关速率,额定电流。
电感要注意在设定频率下工作是否会饱和。
电容要注意耐压。
各器件的额定电流值尽量大于导通电流的两倍以上。
主通路线路尽量粗,减少导通电阻。
1.6MULTISIM软件仿真
在进行系统实现之前,先用MULTISIM软件对所需要满足的指标进行仿真。
输入指标为最大输入电压Vinmax=24V,最小输入电压Vinmin=10V,输出电压Vout=5-10V,输出电流Iout=100m-1000mA
2.电路设计与参数计算
2.1系统总体设计原理图:
见附件2
2.2主回路器件的选择及参数计算
2.2.1开关管的选择
场效应管选用开关频率高,导通电阻小的IRF540。
其开关频率可以达到100k以上。
2.2.2电感的选择
电感的选择在综合考虑电感的品质系数,电路的工作频率,是否饱和,最大纹波电流,工作在连续模式还是断续模式等因素后,鉴于此电路输出3A,选用额定为5A的电感,电感值最小为
L=5(Vin-Vout)*Vout*T/(Vin*Iout)=3.7mH,这里选用5mH的电感与电容组成pi型滤波。
2.2.3电容的选择
电容起到滤波储能的作用,电容选用耐压50V的电解电容,最小值为C=0.2*65*10-6*Iout/Vout=4400uF,这里选用多个电容并联。
2.2.4采样电路的选择
电流采样电阻采用0.02欧的电阻,分压小,且电阻值随温度的变化小,精度高。
电压采样利用精密电阻分压采样。
2.3控制电路设计
2.3.1控制回路采样信号的处理
采波通过光电隔离器件TL250驱动开关管或者进入单片机的AD口中进行电压电流实时显示。
样后电压经过跟随器(采样电流还有放大器)通过多路开关CD4051后进入固定频率脉宽调制器件TL494的输入端产生PWM
2.3.2PWM波的产生
TL494是一种固定频率脉宽调制电路。
它内部电路由基准电压产生电路、振荡电路、间歇期调整电路、两个误差放大器、脉宽调制比较器以及输出电路等组成。
输入的采样信号与基准信号进行比较,通过脉宽调制比较器,若采样信号大于基准信号时产生低电平,若采样信号小于基准信号则输出高电平。
2.4效率的分析
分析:
为了达到高效率,主通路应选择导通电阻小、适合高频的器件,尤其是场效应管开关频率一定要高,电感不能饱和,而且品质系数要高。
通过比较,选用开关频率高,导通电阻小的IRF540。
选用电感前使用函数发生器提供高频信号,送入电感,选择发热小的电感。
3.软件设计
程序流程图如下:
主程序按键程序AD采样程序
完整源程序参见附录1
4.测试方法与数据
4.1测方法试
4.1.1恒压恒流源测试方法
将电流表连入输入输出端,电压表并入输出输入端,并在输出端用示波器单通道跟踪,依次改变负载的值(负载采用滑动变阻器),使得输出电压在5-10V之间变化,或者电流在100mA-1000mA之间变化,测出每次变化之后的输出电压,电流,输入电压,电流,并对示波器所显示的输出纹波进行记录。
4.2测试仪器
电压表:
2个
电流表:
2个
示波器:
1个
4.3测试数据
4.3.1恒压源5-10V模式测试数据
4.3.2恒流源100-3A模式下的测试数据
5.测试结果分析
5.1恒压源
(1)给定一个输出电压,用示波器测量得到的波纹小于10mv。
(2)测试结果表明当所加负载变化使得输出电流变化时,恒压源输出电压在9.93到10.04之间浮动,满足输出电压偏差小于10m的要求。
(3)改变输入电压10-24v改变时,并且输出的纹波电压在4mV到10mV之间浮动,满足10mV纹波的要求。
5.2恒流源
(1)测试结果表明,当所加负载在5到10欧姆之间变化时,1A,800mA,500mA恒流源输出值的变化在正负10mA量级,很好的满足了要求。
(2)当输出电流为1A,负载电阻为10欧姆时,输出纹波电压满足要求。
5.3改进方案
结果与设计指标进行比较,分析产生偏差的原因,并提出改进方法:
产生偏差的原因为电路的导线内阻,开关频率的变化等因素,其他设计均达了设计指标。
为了进一步提高效率,可以将采样电阻的阻值换为更小,更精密的电阻,并且放大倍数做相应更改。
附录1:
整体程序
#include
#include
#include"Font_code.c"
#include"Font_code_816.c"
#include"LCD5510_V1.H"
#defineuintunsignedint
#defineucharunsignedchar
#defineBYTEunsignedchar
#defineulongunsignedlong
sbitchoose=P1^7;
sbitCS=P1^4;
sbitSCLK=P1^5;
sbitDIN=P1^6;
bitjiemian=0;//界面切换标识
uintDAvalue=0;
inttimes=0;
voiddelay()
{
uchara;
for(a=5;a>0;a--);
}
voiddelayms(unsignedintms)//延时多少MS
{
unsignedchara,b;
for(;ms>0;ms--)
for(b=222;b>0;b--)
for(a=12;a>0;a--);
}
unsignedintget_AD_result(unsignedcharchannel)
{
P1ASF=0x07;//P1.0为模拟功能AD使用
ADC_RES=0;//清零转换结果寄存器高8位
ADC_RESL=0;//清零转换结果寄存器低2位
ADC_CONTR=0x80;//开启AD电源
delayms
(1);//等待1ms,让AD电源稳定
ADC_CONTR=0x88|channel;//开启AD转换10001000即POWERSPEED1SPEED0ADC_FLAGADC_STARTCHS2CHS1CHS0
_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR寄存器
while(!
(ADC_CONTR&0x10));//等待转换完成
ADC_CONTR&=0xe7;//关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL);//返回AD转换完成的10位数据(16进制)
}
voidDA_conver(uintDAdata)
{
uchari;
DAdata<<=6;
CS=1;
SCLK=0;
DIN=0;
CS=0;
for(i=0;i<12;i++)
{
DIN=(bit)(DAdata&0x8000);
SCLK=1;
DAdata<<=1;
SCLK=0;
}
CS=1;
SCLK=0;
}
unsignedcharkeyboard()//矩阵键盘检测,共11行即可返回0~16键值.
{
chari,j,temp,hang[]={0xfe,0xfd,0xfb,0xf7};
for(j=0;j<4;j++)
{
P3=hang[j];
temp=0x10;
for(i=0;i<4;i++)
{
if(!
(P3&temp))
{
delayms(5);//延时5ms消抖
if(!
(P3&temp))
return(i+j*4);
}
temp<<=1;
}
}
return16;
}
unsignedcharkeyplay()//按键程序
{
intk,j;
k=keyboard();
if(k==0)
j=1;
elseif(k==4)j=2;
elseif(k==12)j=3;
elseif(k==8)j=4;
elseif(k==1)j=5;
elseif(k==5)j=6;
elseif(k==13)j=7;
elseif(k==9)j=8;
elseif(k==2)j=9;
elseif(k==6)j=0;
elseif(k==14)j=14;
elseif(k==10)j=10;
elseif(k==3)j=12;
elseif(k==7)j=13;
elseif(k==15)j=15;
elseif(k==11)j=11;
elsej=16;
returnj;
}
voiddisplay_V(ucharx,uchary,uintV_temp)
{
LCD_printc(x,y,V_temp/1000+'0');
LCD_printc(x+1,y,V_temp%1000/100+'0');
LCD_printc(x+2,y,'.');
LCD_printc(x+3,y,V_temp%100/10+'0');
LCD_printc(x+4,y,V_temp%10+'0');
LCD_printc(x+5,y,'v');
}
voiddisplay_I(ucharx,uchary,uintI_temp)
{
LCD_printc(x,y,I_temp/1000+'0');
LCD_printc(x+1,y,I_temp%1000/100+'0');
LCD_printc(x+2,y,I_temp%100/10+'0');
LCD_printc(x+3,y,I_temp%10+'0');
LCD_printc(x+4,y,'m');
LCD_printc(x+5,y,'a');
}
////////////////////////////////
////////////////////////////////////
voidmain()
{
uintV_temp,V_face;
uintI_temp,I_face;
uintP=0;
uchark=16,num=16;
TMOD=0x11;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
LCD5510_Init();
choose=0;
while
(1)
{
num=keyplay();
if(num==12)//向上键
{
jiemian=~jiemian;
}
if(jiemian==0)//恒压界面
{
LCD_clr_scr();//液晶显示清除
LCD_showsh(0,0,"恒压");
LCD_showsh(0,1,"当前");display_V(6,2,V_face);///目前电压显示
LCD_showsh(0,2,"设置");display_V(6,4,V_temp);//设置电压显示
DAvalue=V_temp;
V_face=get_AD_result(0);
V_face=V_face*5*100/1024;
if(num==10)
{
V_temp++;
}
if(num==11)
{
V_temp--;
}
while(num==13)//进入修改电压界面
{
LCD_clr_scr();//液晶显示清除
LCD_showsh(0,0,"请输入电压");
V_temp=0;
while(num==13)
{
k=keyplay();
if(k<10)
{
V_temp=V_temp*10;
V_temp=V_temp+k;
LCD_showsh(0,2,"设置");display_V(6,4,V_temp);//设置电压显示
if(V_temp>1000)
V_temp=0;
}
if(k==12)//按下确定键
{
num=16;
LCD_clr_scr();
}
if(k==15)//则退出密码程序
{
num=16;
LCD_clr_scr();//液晶显示清除
}
while(k<16)
{
k=keyplay();
}
}
}
}
if(jiemian==1)//恒流界面
{
LCD_clr_scr();//液晶显示清除
LCD_showsh(0,0,"恒流");
LCD_showsh(0,1,"当前");display_I(6,2,I_face);//////目前电流显示
LCD_showsh(0,2,"设置");display_I(6,4,I_temp);////设置电流显示
if(num==10)
{
I_temp++;
}
if(num==11)
{
I_temp--;
}
while(num==13)
{
LCD_clr_scr();//液晶显示清除
LCD_showsh(0,0,"请输入电流");
V_temp=0;
while(num==13)
{
k=keyplay();
if(k<10)
{
I_temp=I_temp*10;
I_temp=I_temp+k;
LCD_showsh(0,2,"设置");display_I(6,4,I_temp);////设置电流显示
if(I_temp>1000)
I_temp=0;
}
if(k==12)//按下确定键
{
num=16;
LCD_clr_scr();
}
if(k==15)//则退出密码程序
{
num=16;
LCD_clr_scr();//液晶显示清除
}
while(k<16)
{
k=keyplay();
}
}
}
}
while(num<16)//等待松手
{
num=keyplay();
}
}
}
voidtime0()interrupt1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
times++;
if(times==4)
{
DA_conver(1023);
times=0;
}
}
附件2:
设计原理图