(整理)数控直流电源设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数控直流电源

功能说明:

本作品采用DAC0832作为电压信号输出。DAC0832是一款采用CMOS工艺制成的单片电流输出型8位数/模转换器。DAC0832有三种工作方式:不带缓冲工作方式,单缓冲工作方式,双缓冲工作方式。因为输出电压量程为10V,VREF基准电压范围为-10V---+10V,基准电压可以为5.12V,这样在DAC0832的8脚输出电压的分辨率为:即D/A输入数据端每增加1,电压增加0.02V。D/A的电压输出端接放大器OP27的输入端,放大器的放大倍数为5 ,才能得到输出电压的电压分辨率:0.02V×5=0.1V这样当调节电压的时候,以每次0.1V的梯度增加或者降低电压。

硬件电路图:

1.波形转换与放大部分

选用51系列的单片机产生和控制波形。数模转换器用的是DAC0832,本方案中DAC0832采用单缓冲模式。

电路如图五所示,P0口和DAC0832的数据口直接相连,2

W R和XFER接地,DAC数据寄存器处于直通状态,ILE=1,和连接后接P2.0。在选中该片的地址(=0)时,写入数字量,该数字信号就立即传送到DAC输入寄存器,并直通至DAC数据寄存器,经过短暂的建立时间,即可以获得相应的模拟电压。写入操作结束,和立即变为高电平,写入的数据被输入寄存器锁存,直到再次写入刷新。

图一波形产生与转换电路

图二电流放大电路

2.键盘与数码显示部分电路如图七

图三键盘与显示电路

3.稳压电源部分

电源部分输出+5V,+15V,-15V电压供给系统,另外还制作+5.12V直流稳压电源做DAC0832的VERF的基准电压。

软件设计与流程图

1.软件介绍

软件部分采用模块化程序设计的方法编写,系统软件由主控制程序、数码显示子程序、键盘服务子程序组成。还添加了自动扫描键盘、显示器的自动刷新、过零保护的功能。编程中C函数和汇编函数相互调用。

2.程序流程图如图四所示

开始

系统初始化

显示0.0

扫描键盘

+键按下?

-键按下?

方波键按下?锯齿波键按下执行电压增加子程序执行电压减小子程序

N N

N N

执行产生方波

子程序

执行产生锯齿波

子程序

Y

Y

Y

Y

图四软件流程图

程序附录:

#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;

}

相关文档
最新文档