基于单片机的数控电流源的设计.docx
《基于单片机的数控电流源的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数控电流源的设计.docx(21页珍藏版)》请在冰点文库上搜索。
基于单片机的数控电流源的设计
南京邮电大学
实验开放项目
项目名称:
基于单片机的数控电流源设计
学院:
光电工程学院
导师:
张胜
姓名:
石晓娜、梅阳阳、丁嘉毅、赵敏、朱振东
二零一四年二月
基于单片机的数控电流源的设计
摘要
恒流源,是一种能够向负载提供恒定电流的电源。
恒流源的应用范围非常广泛,并且在许多情况下是必不可少的。
它既可以为各种放大电路提供偏流以稳定其静态工作点,又可以作为其有源负载,以提高放大倍数。
并且在差动放大电路、脉冲产生电路中得到了广泛应用。
本文设计了一种基于单片机控制的数控直流恒流源。
该恒流源以STC-89C52为控制核心,采用了高共模抑制比低温漂的运算放大器LM324和自制达林顿管构成恒流源的主体,完成了单片机对输出电流的实时检测和实时控制。
人机接口采用4×4键盘及LCD数码管显示器,控制界面直观、简洁,具有良好的人机交互性能。
在软件设计上采用增量式PWM控制算法,即数字控制器的输出只是控制量的增量。
该系统已基本达到预期的设计目标,具有功能强、性能可靠、体积小、电路简单的特点,可以应用于需要高稳定度的小功率恒流源的领域。
关键词:
恒流源、PWM控制算法、数字控制、单片机控制
引言
随着电子技术的发展,数字电路应用领域的扩展,现今社会,产品智能化、数字化已成为人们追求的一种趋势,设备的性能,价格,发展空间等备受人们的关注,尤其对电子设备的精密度和稳定度最为关注。
性能好的电子设备,首先离不开稳定的电源,电源稳定度越高,设备和外围条件越优越,那么设备的寿命更长。
基于此,人们对数控恒定电流器件的需求越来越迫切。
众所周知,许多科学实验都离不开电源,并且在这些实验中经常会对通电时间、电压高低、电流大小以及动态指标有着特殊的要求,然而目前实验所用的直流电源大多输出精度和稳定性不高;在测量上,传统的电源一般采用指针式或数码管来显示电压或电流,搭配电位器来调整所要的电压及电流输出值。
使用上若要调整精确的电压或者电流输出,须搭配精确的显示仪表监测,又因电位器的阻值特性非线性,在调整时,需要花费一定的时间,况且还要当心漂移,使用起来非常不方便。
因此,如果直流电源不仅具有良好的输出质量而且还具有多功能以及一定的智能化,以精确的微机控制取代不精确的人为操作,在实验开始之前就对一些参数进行预设,这将会给各个领域中的实验研究带来不同程度的便捷与高效。
当今社会,数控恒压技术已经很成熟,但是恒流方面特别是数控恒流的技术才刚刚起步有待发展,高性能的数控恒流器件的开发和应用存在巨大的发展空间。
本数控直流恒流源系统输出电流稳定,不随负载和环境温度变化,并具有很高的精度,输出电流误差范围很小,输出电流可在一定范围内任意设定,因而可实际应用于需要高稳定度小功率恒流源的领域。
1设计方案的选择
1.1电路综合设计流程
图1.1.1数控电流源电路设计流程图
1.2总体设计方案
经初步分析设计要求,得出总体电路由以下几部分组成:
电源模块,控制模块(包括A/D、D/A转换)恒流源模块,键盘模块,显示模块。
以下就各电路模块给出设计方案。
1.2.1控制部分方案
方案一:
采用FPGA作为系统的控制模块。
FPGA可以实现复杂的逻辑功能,规模大,稳定性强,易于调试和进行功能扩展。
FPGA采用并行输入输出方式,处理速度高,适合作为大规模实时系统的核心。
但由于FPGA集成度高,成本偏高,且由于其引脚较多,加大了硬件设计和实物制作的难度。
方案二:
采用单片机作为控制模块核心。
单片机最小系统简单,容易制作PCB,算术功能强,软件编程灵活、可以通过ISP方式将程序快速下载到芯片,方便的实现程序的更新,自由度大,较好的发挥C语言的灵活性,可用编程实现各种算法和逻辑控制,同时其具有功耗低、体积小、技术成熟和成本低等优点。
基于以上分析,选择方案二,利用STC89C52单片机将电流步进值或设定值通过换算由D/A转换(此处我们利用PWM脉宽调制实现D/A转换功能),驱动恒流源电路实现电流输出。
输出电流经处理电路作A/D转换反馈到单片机系统,通过补偿算法调整电流的输出,以此提高输出的精度和稳定性。
1.2.2恒流源模块设计方案
方案一:
由三端可调式集成稳压器构成的恒流源。
其典型恒流源电路图如图1.2.1所示。
一旦稳压器选定,则U0是定值。
若R固定不变,则I0不变,因此可获得恒流输出。
若改变R值,可使输出I0改变。
因此将R设为数控电位器,则输出电流可以以某个步长进行改变。
此电路结构简单,调试方便,价格便宜,但是精密的大功率数控电位器难购买。
图1.2.1三端集成稳压器构成的恒流源框图
方案二:
由数控稳压器构成的恒流源
方案一是在U0不变的情况下,通过改变R的数值获得输出电流的变化。
如果固定R不变,若能改变U0的数值,同样也可以构成恒流源,也就是说将上图中的三端可调式集成稳压源改为数控电压源,其工作原理和上图类似。
此方案原理清楚,若赛前培训过数控电压源的设计的话,知识、器件有储备,方案容易实现。
但是,由1.2.2图可知,数控稳压源的地是浮地,与系统不共地线,对于系统而言,地线不便处理。
图1.2.2数控电压源构成的恒流源框图
方案三:
采用集成运放的线性恒流源
该恒流源输出的电流与负载无关,通过使用两块构成比较放大环节,功率管构成调整环节,利用晶体管平坦的输出特性和深度的负反馈电路可以得到稳定的恒流输出和高输出阻抗,实现了电压—电流转换。
其原理框图如图1.2.3所示。
图1.2.3集成运放构成的恒流源框图
综合考虑,采用方案三,使用低噪音、通用运放LM324和2个8550等构成一个恒流源电路。
1.2.3显示模块设计方案
方案一:
使用LED数码管显示。
数码管采用BCD编码显示数字,对外界环境要求低,易于维护。
但根据题目要求,如果需要同时显示给定值和测量值,需显示的内容较多,要使用多个数码管动态显示,使电路变得复杂,加大了编程工作量。
方案二:
使用LCD显示。
LCD具有轻薄短小,可视面积大,方便的显示汉字数字,分辨率高,抗干扰能力强,功耗小,且设计简单等特点。
综上所述,选择方案二。
采用12864汉字图形点阵液晶显示模块同时显示电流给定值和实测值。
1.2.4键盘模块设计方案
方案一:
采用独立式按键电路,每个按键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。
缺点为当按键较多时占用单片机的I/O口数目较多。
方案二:
采用标准4X4键盘,此类键盘采用矩阵式行列扫描方式,优点是当按键较多时可降低占用单片机的I/O口数目,而且可以做到直接输入电流值而不必步进。
题目要求可进行电流给定值的设置和步进调整,需要的按键比较多。
综合考虑两种方案及题目要求,采用方案二,方便进行扩展。
1.2.5电压源模块设计方案
系统需要多个电源,单片机、A/D、使用+5V稳压电源,运放需要±12V稳压电源,同时题目要求最高输出电流为260mA,电源需为系统提供足够大的稳定电流。
综上所述,采用三端稳压集成7805、7812分别得+5V和±12V的稳定电压,78H系列稳压器输出电流可以达到5A,能为系统提供足够大的稳定电流。
利用该方法实现的电源电路简单,工作稳定可靠。
1.3系统组成
经过方案比较与论证,最终确定系统的组成框图如图所示
图1.3.1系统组成框图
2单元电路的设计
2.1控制模块电路设计
2.1.1最小系统电路设计
通过键盘模块输入给定的电流值或是步进调整信号传送给单片机,单片机在接受到信号后进行处理运算,并显示其给定的电流值,然后经D/A转换以输出电压,驱动恒流源电路实现电流输出,并将采样电阻上的电压经过A/D转换输入单片机系统,通过补偿算法进行数值补偿处理,调整电流输出,并驱动显示器显示当前的电流值。
最小系统的核心为STC89C52,为了方便单片机引脚的使用,我们将单片机的引脚用接口引出,电路如图2.1.1所示:
P0口和P3.0~P3.3是LCD接口;P1口作为A/D与D/A转换接口;P2口为键盘接口。
图2.1.1最小系统原理图
2.1.2A/D转换电路设计
A/D转换采用BB公司的ADS7816构成的转换电路,如图2.1.3ADS7816是12位串行模/数转换器,采样频率高达200kHz,转换所需时间短,转换精度高。
ADS7816转换器将采样电阻上的电压转换成数字信号反馈给单片机,单片机将此反馈信号与预置值比较,根据两者间的差值调整输出信号大小。
这样就形成了反馈调节,提高输出电流的精度。
同时,A/D采样回来的电流经过单片机处理传送到LCD,可以显示当前的实际电流值。
图2.1.3A/D转换电路
2.2恒流源电路设计
恒流源电路的设计是本系统设计的核心,它采用电压来控制电流的变化。
为了能产生恒定的电流,我们采用电压闭环反馈控制。
恒流源电路原理图如图2.2.1所示,该电路主要由运算放大器、大功率达林顿管、采样电阻RS、负载RL等组成。
取样电阻RS从输出端进行取样,再与基准电压比较,并将误差电压放大后反馈到调整管,使输出电压在电网电压变动的情况下仍能保持稳定。
电路中调整管采用大功率达林顿管(由两个8550构成),既能满足输出电流最大达到260mA的要求,也能较好地实现电压近似线性地控制电流。
RS选用热稳定性好的水泥电阻,并选取较大值(2Ω),使得在电流较低时也能获得较大的电压值。
运算放大器采用高精度的lm324作为电压跟随器。
DAOUT即为输入电压Ui,当Ui一定时,运算放大器的Ui=US,I0=IL=IS=Ui/RS,即I0不随RL的变化而变化,从而实现压控恒流。
由此得到恒流源输出电流的大小为:
I0=Ui/RS
图2.2.1恒流源电路原理图
2.3键盘电路设计
在设计中,使用标准的4x4键盘,可以实现0~9数字输入,“+”、“-”步进设置。
其电路图如图2.3.1所示。
图2.3.1键盘电路原理图
2.4显示电路设计
本设计采用12864型汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(12X16点阵)及64X256点阵显示RAM(GDRAM)。
可显示内容为192列×64行,还带多种软件功能:
光标显示、画面移位、自定义字符、睡眠模式等。
12864采用8位并行接法,与单片机P3和P4口相连,用于显示设定值与当前测量值。
其接口如图2.4.1所示。
图2.4.1LCD显示电路原理图
2.5稳压电源设计
在本设计中,运放需±12V供电,单片机需、A/D需+5V供电,采用三端稳压器7805、7812、7815构成一稳压电源,输出电流范围是50mA~260mA,而78H系列稳压器输出电流最大可以达到5A,能为系统提供足够大的稳定电流。
稳压电路如图2.5.1所示:
考虑系统对功率要求较高,所以在设计中选取了输出功率50W的变压器,输入电压由变压器和全波整流滤波电路产生。
图2.5.1电源电路原理图
3软件设计
软件设计采用C语言,对STC89C52进行编程实现各种功能。
软件设计的关键是对A/D转换器的控制。
软件实现的功能是:
a)控制键盘工作,确定电流步进调整;
b)控制A/D工作,设置给定电流,测量输出电流;
c)对反馈回单片机的电流值进行补偿处理;
d)驱动液晶显示器显示电流设置值与测量值。
图3软件流程框图
4实物图
图4.1恒流源控制电路实物图
图4.2液晶显示实物图
图4.3矩阵键盘实物图
图4.4线性电源实物图
图4.5单片机控制系统(包括A/D)实物图
图4.6整体实物图
4.7PWM波调制波形
4.8加上负载后电流实际示数
4.9系统反馈后液晶示数
4.10封装后实物图
5数据记录
脉宽恒定情况下(初始电流设定150mA)负载变化的恒流测试(仿真图略)
R(Ω)
10
11
12
13
14
15
I(mA)
(U=12V)
150
150
150
150
150
150
6结论与展望
本文结合各种新技术设计出一种基于单片机芯片STC-89C52的数控直流恒流源。
对该恒流源的测量结果表明,该恒流源具有较高的精度和稳定度,基本满足设计要求。
具体的研究成果和结论如下:
1.完成了硬件电路的设计,具体包括A/D转换电路的设计,键盘输入及输出显示等。
该恒流源实现了键盘输入预置值,LCD显示输出预置值和实际输出值的功能,精度和稳定度都比较高。
2.本系统在软件设计上采用了增量式PWM控制算法,增量式控制虽然只是算法上作了一点改进,却带来了不少优点:
(1)算式中不需要累加。
控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;
(2)计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程。
本系统在软硬件设计上仍然有很多需要完善之处。
进入21世纪,随着信息技术一日千里的发展,恒流源也必将经历由模拟恒流源向数字恒流源过渡的这一历程。
特别是计算机技术的发展必将出现智能化技术。
因此,如何把数字技术和智能化技术用于制作高稳定度的恒流源就将成为21世纪的新课题。
作品程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineV_TH0255
#defineV_TL0255
#defineV_TMOD0x01
ucharcodetable[]="ILOVESAST!
";
ucharcodetable1[]="ILOVENJUPT!
";
ucharcodetable2[]="ConstantCurrent";
uchartable3[]="150mA";
ucharcodetable4[]="error!
";
ucharcodetable5[]="Pleasesetagain";
sbitlcden=P1^4;//液晶使能端
sbitlcdrs=P1^0;//液晶数据命令选择端
sbitP3_7=P3^7;
sbitP1_2=P1^2;
unsignedcharZKB1,ZKB2;
ucharnum,flag=0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
lcden=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
write_com(0x80);
for(num=0;num<12;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(5);
}
delay(500);
write_com(0x01);
delay(200);
write_com(0x80);
for(num=0;num<16;num++)
{
write_data(table2[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<6;num++)
{
write_data(table3[num]);
delay(5);
}
}
voiddisplayI()
{
write_com(0x80+0x40);
for(num=0;num<6;num++)
{
write_data(table3[num]);
delay(5);
}
}
voiddisplayerror()
{
write_com(0x01);
write_com(0x40);
for(num=0;num<6;num++)
{
write_data(table4[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table5[num]);
delay(5);
}
}
voidkeyscan(uchari)
{
uchartemp,key;
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xee:
key='1';
break;
case0xde:
key='2';
break;
case0xbe:
key='3';
break;
case0x7e:
key='+';
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
if(i==0){table3[i]=key;flag=1;}
elseif(i==1){table3[i]=key;flag=1;}
elseif(i==2){table3[i]=key;flag=1;}
displayI();
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xed:
key='4';
break;
case0xdd:
key='5';
break;
case0xbd:
key='6';
break;
case0x7d:
key='-';
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
if(i==0){table3[i]=key;flag=1;}
elseif(i==1){table3[i]=key;flag=1;}
elseif(i==2){table3[i]=key;flag=1;}
displayI();
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xeb:
key='7';
break;
case0xdb:
key='8';
break;
case0xbb:
key='9';
break;
case0x7b:
key='*';
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
if(i==0){table3[i]=key;flag=1;}
elseif(i==1){table3[i]=key;flag=1;}
elseif(i==2){table3[i]=key;flag=1;}
displayI();
}
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xe7:
key='*';
break;
case0xd7:
key='0';
break;
case0xb7:
key='#';
break;
case0x77:
key='Q';
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
if(i==0){table3[i]=key;flag=1;}
elseif(i==1){table3[i]=key;flag=1;}
elseif(i==2){table3[i]=key;flag=1;}
displayI();
}
}
}
voidinit_sys(void)//系统初始化函数
{//定时器初始化
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}//延时
voidDelay5Ms(void)
{
unsignedintTempCyc=5000;
while(TempCyc--);
}
voidmain()
{
uchari=0,current=9;
init();
init_sys();
while
(1)
{
keyscan(i);
if((i==0&&flag==1)||(i==1&&flag==1))
{
i++;
flag=0;
}
if(i==2&&flag==1)
{
i=0;
flag=0;
}
current=(table3[0]-48)*100+(table3[1]-48)*10+(table3[2]-48)*1;
if(current<50&¤t>=0)ZKB1=198;
if(current>230)ZKB1=5;
if(current>=50&¤t<60)ZKB1=198;
if(current>=60&¤t<70)ZKB1=186;
if(current>=70&¤t<80)