简易数控直流电源报.docx
《简易数控直流电源报.docx》由会员分享,可在线阅读,更多相关《简易数控直流电源报.docx(27页珍藏版)》请在冰豆网上搜索。
简易数控直流电源报
简易数控直流电源设计报告
设计题目:
简易数控直流电源
系别:
电子信息与电气工程系
年级专业:
10级电气类(5)班
小组成员:
汪家乐1005075039
王鹏飞1005075038
熊王来1005075042
2012年6月11日
目录
摘要:
3
关键词:
3
1.引言3
1.1设计任务3
1.2设计要求4
2.总体方案论证4
2.1设计思路4
2.2模块方案论证5
2.2.1控制部分选择5
2.2.2数模转换部分选择6
2.2.4设置部分选择7
3.系统设计与实现7
3.1变压整流及系统电源单元7
3.2调整管单元8
3.3显示部分设计8
3.4数模转换电路设计9
3.4.1DAC0832的结构及引脚功能9
3.4.2DAC0832的数字接口10
3.4.3DAC0832的模拟输出11
3.5按键部分设计11
4.软件系统设计12
4.1系统流程图12
5.系统功能指标及参数13
5.1系统调试13
5.2系统测试13
5.3系统误差分析13
6.附录14
附录一使用原件清单14
附录二:
系统程序14
附录三:
系统电路图21
7.总结22
8.参考文献22
摘要
本系统以直流电压源为核心,STC89C52单片机为主控制器,通过矩阵键盘来设置直流电源的输出电压,设置步进等级可达0.1V,输出电压范围为0—9.9V,输出电流为500mA,并由数码管显示输出电压值。
由“+”、“-”两键分别控制输出电压步进增减,并且输出电压可预置在0~9.9V之间的任意一个值。
系统由单片机程控输出数字信号,经过D/A转换器(DAC0832)输出模拟电流量,再经过运算放大器隔离放大输出模拟电压量,从而控制输出欲知电压。
关键词
STC89C52DAC0832数码管矩阵键盘uA714
1.引言
随着电子技术的迅速发展,各种电子产品层出不穷,不过不管是哪种电子产品或设备,都需要电源供电才能进行正常的工作,而且对于不同的产品或设备来说,其需要不同的工作电源,但是往往市面上的很多电源模块都只能输出固定而单一的电压,从而不能提供各种不同数值的电压,因此,在这里做一个数控直流电源的设计。
该数控电源采用步进调整方式,调整范围为0.0V~9.9V,调整手段采用按键进行调整,当需要改变电压值时,启动数控系统,输入想要得到的电压值,再按下确定键,即可输出相应的电压。
该系统采用单片机作主控器件,结合软件和硬件设计方法,使该系统的结构较简单,可控性强,使用也很方便。
1.1设计任务
设计出有一定输出电压范围和功能的数控电源。
其原理示意图如下:
1.2设计要求
1.基本要求
(1)输出电压:
范围0~+9.9V,步进0.1V,纹波不大于10mV;
(2)输出电流:
500mA;
(3)输出电压值由数码管显示;
(4)由“+”、“-”两键分别控制输出电压步进增减;
(5)为实现上述几部件工作,自制一稳压直流电源,输出±15V,+5V。
2.发挥部分
(1)输出电压可预置在0~9.9V之间的任意一个值;
(2)用自动扫描代替人工按键,实现输出电压变化(步进0.1V不变);
(3)扩展输出电压种类(比如三角波等)。
2.总体方案论证
2.1设计思路
方案一:
本方案调压方式基本沿用串联稳压电源的调压方式,以STC89C52单片机为核心,控制比较调整单元基准电源的变化,实现高精密电压控制。
交流电压经变压、整流、滤波后,通过调整管输出,CPU根据预置开关设定的数据或键盘输入数据,计算出相应的基准电压值,送DAC转换成模拟电压。
该电压送比较放大单元,以调整输出电压Vo。
方案一框图
方案二:
方案二框图
比较这两种方案,两种方案均是通过按键命令单片机给DAC数字量然后经过DAC和运放输出模拟量。
但第一种方案经过两级放大后,再通过复合管功率放大电路,使输出电流达到要求。
而方案二是经过运放放大后的电压直接输出,电流很小。
所以采用第一种设计方案完成设计任务。
2.2模块方案论证
2.2.1控制部分选择
方案一:
采用FPGA作为系统的控制器。
FPGA可以实现各种复杂的逻辑功能,所有数字逻辑器件集中在一块芯片上,体积小,稳定度高。
同时,FPGA可用EDA软件仿真调试,易于进行功能扩展。
但FPGA引脚较多,布线复杂,成本偏高,结合分析本系统要求如果采用FPGA作为控制器利用率不高,造成资源浪费。
方案二:
80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(PUSH)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。
采用40引脚双列直插式DIP(DualInLinePackage),内有128个RAM单元及4K的ROM。
80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。
80C51内部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。
由于80C51的系统性能满足系统数据采集及时间精度的要求,而且产品产量丰富来源广,应用也很成熟。
经比较,此系统采用方案二,选用STC89C52作为控制核心。
AT89C52及其外围电路
2.2.2数模转换部分选择
方案一:
采用THS5661A。
电流输出型DA转换器THS5661A很少直接利用电流输出,大多外接电流—电压转换电路得到电压输出,用负载电阻进行电流—电压转换的方法,虽可在电流输出引脚上出现电压,但必须在规定的输出电压范围内使用,而且由于输出阻抗高,所以一般外接运算放大器使用。
THS5661A输出电压不为零时不能正确动作,所以必须外接运算放大器。
此外,这种电路中运算放大器因输出引脚的内部电容而容易起振,有时必须作相位补偿。
方案二:
采用DAC0832。
DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。
D/A转换结果采用电流形式输出。
若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。
运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。
DAC0832逻辑输入满足TTL电平,可直接与TTL电路或微机电路连接。
经比较,选择方案二。
2.2.4设置部分选择
方案一(按键式输入):
此方法操作简单,而且采用此方式控制,由于键盘的数目少,也不会占用单片机太多的资源,且价格便宜。
方案二(触摸屏输入):
通过触摸检测部件检测用户触摸位置,接受触摸信息后送触摸屏控制器,触摸屏控制器将它转换成触点坐标送给CPU,它同时接收CPU发来的命令并加以执行。
此方法操作方便,简单,但价格昂贵。
另外红外遥控设置可能会由于房屋或楼道墙壁等受到影响,所以经过比较,我们采用独立式键盘作为输入控制模块。
经比较,选择方案一,采用4*4矩阵键盘和独立按键共同实现。
3.系统设计与实现
3.1变压整流及系统电源单元
本单元担任提供对外电源的整流、滤波和作为系统本身工作电源的双重任务。
经过变压器变压之后,得到双18V交流电,两路交流经过一个全桥整流得到正负18V的电压。
正18V提供给调整管,作为对外输出,同时经过三端稳压器,分别得到正负15V,5V作为系统本身工作电源。
电源模块电路图
3.2调整管单元
调整管采用复管形式,以实现大电流输出。
R203和N203构成过流保护,当I>700mA时,VR203=R203*I0=1*0.7V=0.7V两端的电压达到0.7V,N203会导通,对N202基极分流,达到过流保护目的,同时发光二级管L201点亮。
涉及运算:
由题意Iomax=0.5A,Vomin=0V,
故PN202max=(Vinmax-Vomin)Iomax=(18-0)*0.5=9W
N202选用TIP41,其Icmax=6A>Iomax=0.5A,PCM=65W>9W,BVCEOmax=100V>18V,
故能满足工作要求。
调整管模块电路
3.3显示部分设计
LED显示电路有静态显示和动态显示,静态显示是指所有的LED数码管同时显示,这种显示方法使得软件结构比较简单,显示效果好,不过电路结构比较复杂,占用处理器的端口较多,功耗也较大。
动态显示是指处理器定时地对LED数码管扫描,数码管分时工作,每次只有一个数码管显示,由于扫描的频率比较高,又因人眼的视觉暂留,所以,看起来,似乎所有的数码管同时在显示,采用这种方法的电路结构变得较简单,占用处理器的端口较少,功耗也较低,不过软件结构比较复杂,必须要在软件中消隐,而且显示的效果受到扫描频率的影响。
数码管采用二一体共阴极数码管,考虑到节省I/O口,其驱动电路由两片74HC573锁存器来实现。
数码管显示模块电路
3.4数模转换电路设计
由于数控电源输出的是模拟信号,而单片机输出的是数字信号,所以,必须要通过数/模转换。
数/模转换芯片众多,有电流输出,也有电压输出,分辨率也有所不同,有8位,12位,16位等等,不同的分辨率,价格也有很大的差距,因数控电源输出的精确度要求不是很高,且从成本上考虑,这里使用8位的数/模转换器DAC0832即可。
3.4.1DAC0832的结构及引脚功能
DAC0832是用CMOS工艺制成的8位D/A转换芯片,它主要包括两个8位寄存器和一个8位D/A转换器构成,其两个寄存器可以进行两次缓冲操作,使器件的操作有更大的灵活性。
DAC0832芯片采用20引脚双列直插封装,各引脚功能如下:
CS:
片选信号(低电平有效)。
ILE:
输入锁存允许信号。
WR1:
写信号1(低电平有效)。
当ILE=1时,且当CS与WR1同时有效才能把数字量锁存到8位输入寄存器中;当WR1为高电平时输入数据锁存到输入寄存器中。
以上三个信号构成一级输入锁存。
XFER:
控制传送信号。
WR2:
写信号2(低电平有效),用于将锁存在输入寄存器数据送到DAC寄存器中,只有在XFER和WR2同时有效时才把输入寄存器中的数据锁入DAC寄存器中。
这样构成了二级锁存。
D0~D7:
8位数据输入线,TTL电平。
Iout1和Iout2:
输出电流。
其中Iout1在D/A寄存器内容全为1时,输出电流最大;Iout2
在D/A寄存器内容全为0时,输出电流最大,Iout1和Iout2之和为常数。
AGND:
模拟信号地。
DGND:
数字地。
UREF:
基准电压。
一般为-10V~+10V。
Rfb:
反馈电阻。
该电阻被制作在芯片内,用作运算放大器的反馈电阻。
3.4.2DAC0832的数字接口
因在本系统中,单片机不仅要送D/A转换数据,还要送显示数据,且都是和P0口相连,而且,数控电源的转换速率要求不高,输出也只有一路,因此,本系统采用单缓冲工作方式DAC0832与单片机的连接电路图如图3.4.2所示。
当需要进行转换时,CS和WR有效,单片机从P0口输出数据到DAC0832上并启动转换,这时,DAC0832将转换后的电流值从Iout1和Iout2输出。
图3.4.2DAC0832与单片机的连接电路图
3.4.3DAC0832的模拟输出
DAC0832转换器输出的是电流信号,因此必须要经过电流-电压转换才能输出电压信号。
DAC0832是8位数/模转换器,基准电源为+5V时,其输出电压的计算公式为
D—输入数据;
u—输出电压.
因为DAC0832的分辨率不是很高,所以转换精度必然有些欠缺,不过由于数控电源的电压输出范围为0.0V~9.9V,步进电压调整值为0.1V,而DAC0832的输出模拟电压步进值约为0.02V,若再放大5倍,则刚好使数控电源的步进值为0.1V,当输入数据为65H(十进制101)时,输出电压u≈1.98V,,再放大5倍后约为9.9V,即为要求的最大值。
因此,DAC0832转换器的数据输入范围为00~65H,以提供100个调整步进。
DAC0832及外部放大电路图
3.5按键部分设计
本系统按键部分采用矩阵键盘和独立按键两部分共同组成,矩阵键盘实现预置数和自动扫描功能,独立按键实现步进加减和控制波形功能。
4.软件系统设计
4.1系统流程图
5.系统功能指标及参数
5.1系统调试
(1)电源部分调试:
先断开所有除输入电源以外的其他电源接入线,在外部电源输入部分加入正负20V的压,通过L7815的1脚,和L7915的2脚,后用万用表测量L7815的3脚为15V,L7915D3脚为-15V,L7805的3脚为+5V,同时测试单片机,DAC0832,放大器等底座接口供电。
电源部分正常。
(2)单片机系统测试:
编写简单程序(点亮发光二极管)测试单片机系统正常。
(3)调试LED显示:
编制简单的显示小程序验证正常。
(4)按键测试:
编写简单程序验证正常。
(5)DAC测试:
调整基准电压使输入255时输出电压-2.56V;输入0时输出电压为0。
5.2系统测试
测试时间:
2012年6月8日星期五
测试数据表格(常温下)
1
2
3
4
5
6
7
8
9
预置电压
1.00
2.00
3.00
4.00
5.00
6.00
7.00
8.00
9.00
实测电压
1.05
1.94
2.96
3.91
4.94
5.97
6.95
7.94
8.90
5.3系统误差分析
从电路原理图分析得出,系统的主要误差有:
(1)自制稳压电源电压不稳,影响系统供电和LM336的基准精度。
(2)DAC0832的量化误差,和由于LM336-2.5所给出的VREF不是准确的2.56V造成DAC的转换精度不是0.01V。
(3)放大器放大的线性失真引起的误差,以及经过0点的调零误差。
6.附录
附录一使用原件清单
名称
型号
封装
数量
单位
三抽头双输出变压器
18V50W
1
个
三抽头双输出变压器
9V50W
1
个
集成电路
LM7805
直插
2
个
集成电路
KA7815
直插
1
个
集成电路
KA7915
直插
1
个
集成电路
DAC0832
DIP-20
1
个
集成电路
74HC573
DIP-20
2
个
集成电路
Stc89c52
DIP-40
1
个
数码管
2位共阴
直插
1
个
晶振
12M
直插
1
个
二极管
IN4007
直插
5
个
电位器
102
直插
1
个
电位器
503
直插
1
个
电位器
104
直插
1
个
电解电容
2200uf35V
直插
2
个
电解电容
2200uf25V
直插
2
个
电解电容
470uf25V
直插
1
个
电解电容
10uf50V
直插
6
个
瓷片电容
104
直插
10
个
瓷片电容
30PF
直插
2
个
瓷片电容
150PF
直插
2
个
排阻
10K
直插
1
个
电阻
100K
直插
个
电阻
50K
直插
个
电阻
1K
直插
个
附录二:
系统程序
#include
#include"keyscan.h"
#include"delay.h"
#include"display.h"
#include"wace.h"
#include"scan.h"
#include"dac0832.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P1^0;
sbitwela=P1^1;
sbitkey3=P1^4;
sbitkey3=P1^4;
sbitkey4=P1^5;
sbitkey1=P1^7;
bitflag,clearflag,scanflag,boxingflag;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uintkey,t=0,m=0,dy=0,s=0,Wchange;
uintnum1,num2;
ucharx=0,y=120;
ucharnum3;
externuintkey;
externucharx;
externuchary;
voidmain()
{
init1();
while
(1)
{
keyscan1();
display2();
boxing();
DA(keyscan2());
}
}
voiddisplay1(uchart)
{
uintshi=0,ge=0;
shi=t/10;
ge=t%10;
dula=1;
P0=table[shi]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay_ms(10);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay_ms(10);
}
voiddisplay2()
{
uintshi=0,ge=0;
shi=keyscan2()/10;
ge=keyscan2()%10
dula=1;
P0=table[shi]|0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay_ms(10);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay_ms(10);
}
voidinit1()
{
P0=0;
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
ucharkeyscan1()
{
uchartemp;
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay_ms(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x7e:
key=1;flag=1;break;
case0xbe:
key=2;flag=1;break;
case0xde:
key=3;flag=1;break;
case0xee:
key=4;flag=1;break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay_ms(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x7d:
key=5;flag=1;break;
case0xbd:
key=6;flag=1;break;
case0xdd:
key=7;flag=1;break;
case0xed:
key=8;flag=1;break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay_ms(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x7b:
key=9;flag=1;break;
case0xbb:
key=0;flag=1;break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
returnkey;
}
voidkeyscan3()
{
uchartemp;
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay_ms(10);
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0x77:
clearflag=1;break;
case0xb7:
scanflag=1;break;
case0xd7:
boxingflag=1;break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
voidboxing()
{
keyscan3();
if(boxingflag==1)
{
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
Wchange++;
while(!
key1);
}
}
if(Wchange==1)
{
juchi();
}
if(Wchange==2)
{
sanjiao();
}
if(Wchange==3)
{
Wchange=0;
boxingflag=0;
}
}
}
ucharkeyscan2()
{
keyscan3();
if(flag==1)
{
s++;
if(s==1)
{
dy=keysc