电子设计大赛直流数控稳压电源.docx
《电子设计大赛直流数控稳压电源.docx》由会员分享,可在线阅读,更多相关《电子设计大赛直流数控稳压电源.docx(33页珍藏版)》请在冰豆网上搜索。
电子设计大赛直流数控稳压电源
电子设计大赛
参赛题目:
数控直流稳压电压源设计
参赛队员:
王默超徐建孟祥举李艳娇张春娜
摘要:
本系统以直流电压源为核心,ATC89S52单片机为主控制器,通过键盘来设置直流电源的输出电压,设置步进等级可达0.1V,输出电压范围为0—9.9V,输出电流为500mA,并由数码管显示输出电压值。
由“+”、“-”两键分别控制输出电压步进增减,并且输出电压可预置在0~9.9V之间的任意一个值。
扩展输出电压种类后可输出三角波、梯形波、锯齿波、方波等波形。
本系统由单片机程控输出数字信号,经过D/A转换器(DA0832)输出模拟电流量,再经过运算放大器隔离放大输出模拟电压量,控制稳压芯片LM7805电压的变化而输出不同的电压。
实际测试结果表明本系统输出电压值精确度较高。
本系统实际应用于需要高稳定度小功率恒压源的领域。
关键词:
数控直流电源,ATC89S52,,DAC0832,OP07,精密基准源LM336-2.5
一.绪论
1.1设计背景
随着电子技术的迅速发展,各种电子产品层出不穷,不过不管是哪种电子产品或设备,都需要电源供电才能进行正常的工作,而且对于不同的产品或设备来说,其需要不同的工作电源,但是往往市面上的很多电源模块都只能输出固定而单一的电压,从而不能提供各种不同数值的电压,因此,在这里做一个数控直流电源的设计。
该数控电源采用步进调整方式,调整范围为0.0V~9.9V,调整手段采用按键进行调整,当需要改变电压值时,启动数控系统,输入想要得到的电压值,再按下确定键,即可输出相应的电压。
该系统采用单片机作主控器件,结合软件和硬件设计方法,使该系统的结构较简单,可控性强,使用也很方便。
1.2设计任务
1.基本功能实现:
(1)可输出电压:
范围0~+9.9V,步进0.1V,纹波不大于10mV;
(2)可输出电压值由数码管显示;
(3)由“+”、“-”两键分别控制输出电压步进增减;
(4)为实现上述几部件工作,自制一稳压直流电源,输出输出±15v,+5v;
2.扩展功能与创新:
(1)输出电压可预置在0~9.9V之间的任意一个值;
(2)扩展输出电压种类(比如三角波等);
(3)最大输出电流可达1.5A;
(4)负载电流在0~1.5A间变化时输出电压的变化量不超过0.1V;
(5)设计并制作一个电子负载,用于测试上述电源的负载调整率,电子负载恒定电流的可调范围为0.1A~1.5A。
二.方案论证
2.1方案一说明
把220V的交流电经过变压,整流,滤波,调整后输出,对输出电压的控制是通过键盘给单片机ATC89S52输入数据,经过DAC0832转换输出-0.99~0V的电压。
再经过运放放大比较,通过L7805输出0~9.9V的电压并显示在数码管上。
方案一原理框图
2.2方案二说明
通过键盘给单片机ATC89S52输入一个数据,这个数据在数码管上显示出来,单片机把这个数据给DAC0832转换成模拟信号后经过运算放大器的处理后最终输出。
方案二原理框图
比较这两种方案,两种方案均是通过按键命令单片机给DAC数字量然后经过DAC和运放输出模拟量。
但第一种方案又将输出量采集回来与放大后的电压量比较使得输出电压更加精准,同时方案一是经过LM7805稳压芯片调整稳压,7805输出电流最大可达到1.5A,使得输出电流能够达到要求。
而方案二是经过运放放大后的电压直接输出,电流很小。
所以采用第一种设计方案完成设计任务。
三.硬件系统设计
3.1电源设计
作为一个电路系统来说,电源当然是必不可少的,这里需要三电源供电,即+5V、±15V。
+5V供数字部分使用,±15V供模拟放大部分使用,三种电压都共用一个地。
电源电路如图所示,首先采用带中间抽头的15V变压器,获得±15V的交流电压,再通过整流、滤波电路,获得±15V的直流电压,这时已经获得了两个电压值,再利用所获得的电压进行处理,即可获得+5V电压,这里采用三端稳压器LM7805,LM7805的稳压输出值为+5V,正好符合要求,它的体积较小,且只有三个引脚,即输入、接地和输出,接线比较方便,重要的是用它来降压可使电路结构很简单。
3.2单片机控制电路设计
我们采用8052系列的AT89S52作为CPU,AT89S52是一种带4K字节FLASH可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
主要特性
1)与MCS-51兼容;
2)8位字长的CPU;
3)可在线ISP编程的4KB片内FLASH存储器,用于程序存储,可擦写1000次;
4)256B的片内数据存储器,其中高128字节地址被特殊功能寄存器SFR占用;
5)可编程的32根I/O口线(P0~P3);
6)2个可编程16位定时器;
7)一个数据指针DPTR;
8)1个可编程的全双工串行通信口;
9)具有“空闲”和“掉电”两种低功耗工作方式;
10)可编程的3级程序锁定位;
11)工作电源的电压为5(1±0.2)V;
12)振荡器最高频率为24MHz;
13)编程频率3~24MHz,编程电流1mA,编程电压为5V。
3.3数模转换电路设计
由于数控电源输出的是模拟信号,而单片机输出的是数字信号,所以,必须要通过数/模转换。
数/模转换芯片众多,有电流输出,也有电压输出,分辨率也有所不同,有8位,12位,16位等等,不同的分辨率,价格也有很大的差距,因数控电源输出的精确度要求不是很高,且从成本上考虑,这里使用8位的数/模转换器DAC0832即可。
3.3.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.3.2DAC0832的数字接口
因在本系统中,单片机不仅要送D/A转换数据,还要送显示数据,且都是和P0口相连,而且,数控电源的转换速率要求不高,输出也只有一路,因此,本系统采用单缓冲工作方式DAC0832与单片机的连接电路图如图3.1所示。
图3.1DAC0832与单片机的连接电路图
当需要进行转换时,CS和WR有效,单片机从P0口输出数据到DAC0832上并启动转换,这时,DAC0832将转换后的电流值从Iout1和Iout2输出。
3.3.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个调整步进。
3.4运算放大部分设计
预算放大电路选用双电源供电的高精度运算放大器OP-07。
将其连成反向比例放大电路用。
于反向和放大D/A转换后输出的负电压,将此电压反向后放大10倍得到需要的0-9.9V。
为防止通过电源内阻造成低频振荡或高频振荡需要在OP-07正负供电电源的输入端对地一端分别加入一个10mF的电解电容和一个0.01mF-0.1mF的高频滤波电容。
3.5稳压基准源设计
稳压基准源采用LM336-2.5稳压芯片来稳定电压,将电压稳定在2.56V。
然后提供给DAC,就可以使得8位DAC的最小精度达到0.01V这个精确值,从而减小转换误差。
3.6按键部分设计
为使得编程简单,按键采用四个独立式按键Key0-Key3。
分别接于单片机的P2.0-P2.3口。
其中Key0为功能键,采用自锁按键。
实现功能一:
预设电压模式和步进模式电压的转换;实现功能二:
输出波形的确定和三角波,梯形波,锯齿波和方波的转换。
Key1键和Key2键集步进和预设功能为一体,由Key0功能键配合使用。
Key3键为波形调整键,通过Key3可选择输出的波形类型。
3.7显示部分设计
LED显示电路有静态显示和动态显示,静态显示是指所有的LED数码管同时显示,这种显示方法使得软件结构比较简单,显示效果好,不过电路结构比较复杂,占用处理器的端口较多,功耗也较大。
动态显示是指处理器定时地对LED数码管扫描,数码管分时工作,每次只有一个数码管显示,由于扫描的频率比较高,又因人眼的视觉暂留,所以,看起来,似乎所有的数码管同时在显示,采用这种方法的电路结构变得较简单,占用处理器的端口较少,功耗也较低,不过软件结构比较复杂,必须要在软件中消隐,而且显示的效果受到扫描频率的影响。
数码管采用四位一体共阴极数码管,考虑到节省I/O口,其驱动电路由两片74HC573锁存器来实现。
3.8功率放大部分设计
电压经过7805比较输出后再经过TIP122和TIP127搭建的推挽放大将功率二次放大。
四.系统软件调试部分
4.1预设电压流程图
4.2主程序流程图
否
是
否
4.3输出波形流程图
五.系统功能指标及参数
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。
(6)放大器调试:
首先使输入电压量为0,调整OP07的1脚和8脚之间的调零电阻,使零飘为0。
然后使输入电压量为设计最大值,调整OP07的R电阻使得放大倍数为10倍。
5.2系统测试
测试时间:
2011年7月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点的调零误差。
六.附录
名称
型号
封装
数量
单位
三抽头双输出变压器
18V50W
1
个
集成电路
LM7805
直插
2
个
集成电路
KA7815
直插
1
个
集成电路
KA7915
直插
1
个
集成电路
OP07
DIP-8
3
个
集成电路
DAC0832
DIP-20
1
个
集成电路
74HC573
DIP-20
2
个
集成电路
LM336-2.5
直插
1
个
集成电路
AT89S52
DIP-40
1
个
数码管
共阴
直插
1
个
晶振
12M
直插
1
个
二极管
IN4007
直插
5
个
整流桥
KBL406
直插
1
个
电位器
102
直插
1
个
电位器
103
直插
1
个
电位器
203
直插
3
个
电位器
503
直插
1
个
电位器
104
直插
1
个
按钮开关
直插
4
个
电解电容
4700uf35V
直插
2
个
电解电容
4700uf25V
直插
2
个
电解电容
4700uf16V
直插
1
个
电解电容
10uf50V
直插
6
个
瓷片电容
104
直插
10
个
瓷片电容
30PF
直插
2
个
瓷片电容
150PF
直插
2
个
排阻
10K
直插
1
个
电阻
100K
直插
个
电阻
50K
直插
个
电阻
1K
直插
个
附录一使用原件清单
附录二电路原理图
附录三程序清单
#include
#defineuintunsignedint//无符号字符8位
#defineucharunsignedchar//无符号整数16位
sbitdula=P2^6;//锁存器段选
sbitwela=P2^7;//锁存器位选
sbitlcdrs=P3^1;//1602数据命令选择
sbitlcden=P3^0;//1602使能信号端
sbitkey1=P2^3;//+键
sbitkey2=P2^2;//-键
sbitkey3=P2^1;//波产生键
sbitkey0=P2^0;//功能键
sbitwr_da=P2^5;//DAC选通
ucharnum,num0,num1,zsys,xsys,bxsz;
ucharcodetable_x[]={//编码表无点数码管显示
0x3f,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0f,0x7f,0x5f};
ucharcodetable_z[]={//编码表带点数码管显示
0xbf,0x8c,0xf6,0xde,0xcd,0xdb,0xfb,0x8f,0xff,0xdf};
voiddelay(uintz);
voiddisplay_bjys(ucharzsys,ucharxsys);
voiddisplay_bxsz(ucharbxsz);
voidtrigle();
voidtrap();
voidsaw();
voidsquare();
voidkeycan_bjys();
voidkeycan_bxsz();
voidwrite_com(ucharcom);
voidwrite_date(uchardate);
voidinit_kjhm();
voidinit_bjhm();
voidinit_yshm();
voidinit_bxxzhm();
voidinit_trigle();
voidinit_trap();
voidinit_saw();
voidinit_square();
voidinit();
voidmain()
{init_kjhm();
init();//初始化子程序
while
(1)
{dula=1;
P1=0x3f;
dula=0;
wela=1;
P1=0xf0;
wela=0;
if(key1==0||key2==0)
{if(key0==0)
init_bjhm();
if(key0!
=0)
init_yshm();
while
(1)
{keycan_bjys();
if(key3==0)
{dula=1;
P1=0xff;
dula=0;
wela=1;
P1=0xff;
wela=0;}
if(key3==0)
break;
}
}
if(key3==0)
{init_bxxzhm();
while
(1)
{keycan_bxsz();
if(key1==0||key2==0)
{dula=1;
P1=0xff;
dula=0;
wela=1;
P1=0xff;
wela=0;
}
if(key1==0||key2==0)
break;
}
}
}
}
voiddelay(uintz)//延时函数
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay_bjys(ucharzsys,ucharxsys)//预设&步进数
{dula=1;
P1=table_z[zsys];
dula=0;
P1=0xff;
wela=1;
P1=0xfe;
wela=0;
delay
(1);
dula=1;
P1=table_x[xsys];
dula=0;
P1=0xff;
wela=1;
P1=0xfd;
wela=0;
delay
(1);
}
voiddisplay_bxsz(ucharbxsz)//波形设置数码管扫描子函数
{dula=1;
P1=table_x[bxsz];
dula=0;
P1=0xff;
wela=1;
P1=0xf0;
wela=0;
delay
(1);
}
voidkeycan_bjys()//预设&步进按键扫描
{if(key1==0)//按key1键加数
{
delay(5);
if(key1==0)
{num++;
if(num==100)
num=0;
}
while(!
key1);
delay(5);
while(!
key1);
}
if(key2==0)//按key2键减数
{delay(5);
if(key2==0)
{num--;
if(num==-1)
num=99;
}
while(!
key2);
delay(5);
while(!
key2);
}
zsys=num/10;
xsys=num%10;
display_bjys(zsys,xsys);
if(key0==0)//预设功能
{P0=num;
wr_da=0;
delay
(1);
}
}
voidkeycan_bxsz()//波形按键扫描
{
if(key3==0)
{delay(5);
if(key3==0)
{num1++;//num1自加选择波形
if(num1==5)
num1=1;
bxsz=num1;
display_bxsz(bxsz);
while(!
key3);
delay(5);
while(!
key3);
}
if(key0==0)//功能键按下确定波形输出
{if(num1==1)
{init_trigle();
while
(1)
{trigle();
if(key0!
=0)
break;
}
}
if(num1==2)
{init_trap();
while
(1)
{trap();
if(key0!
=0)
break;
}
}
if(num1==3)
{init_saw();
while
(1)
{saw();
if(key0!
=0)
break;
}
}
if(num1==4)
{init_square();
while
(1)
{square();
if(key0!
=0)
break;
}
}
}
}
}
voidinit_kjhm()//初始化1开机显示画面函数
{dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
write_com(0x80+0x40);
}
voidinit_bjhm()//初始化2步进电压画面显示函数
{dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
write_com(0x80+0x40);
}
voidinit_yshm()//初始化3预设电压画面显示函数
{dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0