数控直流电源.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数控直流电源
一、方案论证与选择
方案一:原理框图如图1所示,采用数字逻辑控制。通过“+”、“-”两键操作,控制可逆计数器分别作加、减计数,可逆计数器的二进制数字输出一路用于驱动数显电路,指示电源输出电压的大小值;另一路进入D/A转换电路,将数字量按比例转换成模拟电压,然后经过射极跟随器控制调整输出级输出所需的稳定电压。该方案能够完成基本要求,发挥部分受到限制。
图一方案一示意图
方案二:原理框图如图2所示,采用8051单片机产生波形,D/A转换器将其转化为模拟电压,再经过放大器放大。由单片机的软件实现电压的步进增减、对键盘的自动扫描等功能。该方案灵活性大,易于扩展,需要专用的译码驱动芯片。
图二方案二示意图
方案三:数控部分同方案二,原理框图如图三。用74LS164作驱动器,由单片机软件控制数码显示,软件还附有显示器的自动刷新及电路的过零保护等功能。该方案具有方案二的所有优点,而降低了对芯片的要求,提高了系统的可靠性。
图三方案三示意图
综上所述,选用方案三。
二.理论分析与参数计算
1. DAC0832简介
DAC0832是一款采用CMOS 工艺制成的单片电流输出型8位数 / 模转换器,图四是它的逻辑框图和引脚排列。DAC0832有三种工作方式:不带缓冲工作方式,单缓冲工作方式,双缓冲工作方式。
图四 DAC0832的逻辑框图和引脚排列
2.步进01.V 的实现
因为输出电压量程为10V ,VREF 基准电压范围为-10V---+10V ,基准电压可以为5.12V ,这样在DAC0832的8脚输出电压的分辨率为:
V V
02.0256
12.5 即D/A 输入数据端每增加1,电压增加0.02V 。D/A 的电压输出端接放大器OP27 的输入端,放大器的放大倍数为5 ,才能得到输出电压的电压分辨率:
0.02V ×5=0.1V
这样当调节电压的时候,以每次0.1V 的梯度增加或者降低电压。
三.硬件电路图
1.波形转换与放大部分
选用51系列的单片机产生和控制波形。数模转换器用的是DAC0832,本方案中DAC0832采用单缓冲模式。
电路如图五所示,P0口和DAC0832的数据口直接相连, 2WR 和XFER 接地,DAC 数据寄存器处于直通状态,ILE=1,1WR 和CS 连接后接P2.0。在选中该片的地址(CS =0)时,写入数字量,该数字信号就立即传送到DAC 输入寄存器,并直通至DAC 数据寄存器,经过短暂的建立时间,即可以获得相应的模拟电压。
WR和CS立即变为高电平,写入的数据被输入寄存器锁存,直到写入操作结束,1
再次写入刷新。
图五波形产生与转换电路
图六电流放大电路
2.键盘与数码显示部分电路如图七
图七键盘与显示电路
3.稳压电源部分
电源部分输出+5V,+15V,-15V电压供给系统,另外还制作+5.12V直流稳压电源做DAC0832的VERF的基准电压。
四.软件设计与流程图
1.软件介绍
软件部分采用模块化程序设计的方法编写,系统软件由主控制程序、数码显示子程序、键盘服务子程序组成。还添加了自动扫描键盘、显示器的自动刷新、过零保护的功能。编程中C函数和汇编函数相互调用。
2.程序流程图如图九所示
图九软件流程图
五.程序如下
#include
#define uchar unsigned char
sbit dp=P1^4;
sbit sh=P1^5;
void delay(unsigned int t);
uchar Getkey(void);
void Disp(uchar n);
uchar Disptab[10]={0x11,0x7d,0x23,0x29,0x4d,0x89,0x81,0x3d,0x1,0x9}; main()
{ uchar key;
char Vol1=0x00,Vol2=0x00;
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=0x00;
while(1)
{ key=Getkey();
switch(key)
{ case 0x01:break;
case 0x02:break;
case 0x04:if(Vol1==0&&Vol2==0)break;
Vol2--;
if(Vol2<0)
{ Vol2=9;Vol1--; }
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=4.3*(Vol1*10+Vol2);
break;
case 0x08:if(Vol1==9&&Vol2==9)break;
Vol2++;
if(Vol2==10)
{ Vol2=0x00;Vol1++; }
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=4.3*(Vol1*10+Vol2);
break;
default:break; } } }
uchar Getkey(void)
{uchar key;
P1|=0x0f;
if(!(~(P1|0xf0))) return 0x00;
delay(0x20);
if(!(~(P1|0xf0))) return 0x00;
key=~(P1|0xf0);
while(~(P1|0xf0));
return key; }
void delay(unsigned int t)
{ while(--t); }
void Disp(uchar n)
{ uchar i;
for(i=0;i<8;i++){
sh=0;
if(0x80&n){
dp=1; }
else
{ dp=0; }
sh=1;
n=(n<<1)+1; } }