基于51单片机数控步进直流稳压电源.docx

上传人:b****4 文档编号:27021964 上传时间:2023-06-25 格式:DOCX 页数:29 大小:350.53KB
下载 相关 举报
基于51单片机数控步进直流稳压电源.docx_第1页
第1页 / 共29页
基于51单片机数控步进直流稳压电源.docx_第2页
第2页 / 共29页
基于51单片机数控步进直流稳压电源.docx_第3页
第3页 / 共29页
基于51单片机数控步进直流稳压电源.docx_第4页
第4页 / 共29页
基于51单片机数控步进直流稳压电源.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

基于51单片机数控步进直流稳压电源.docx

《基于51单片机数控步进直流稳压电源.docx》由会员分享,可在线阅读,更多相关《基于51单片机数控步进直流稳压电源.docx(29页珍藏版)》请在冰豆网上搜索。

基于51单片机数控步进直流稳压电源.docx

基于51单片机数控步进直流稳压电源

《数控步进稳压电源》

数控步进直流稳压电源的设计与制作

摘要

随着电子技术的发展,人们对电子产品的精确度与灵活性要求越来越高,其中电子产品中电路对电源的要求也越来越高,可调电源由原来的手动调节开始转变成现如今的步进控制,步进精度可以达到0.1V以下,输出电压范围0~15V,电流可以达到2A。

本文介绍的数控直流步进稳压电源是以AT89S52单片机为控制核心,通过AD/DA转换来步进控制输出电源,并以12864液晶显示器作为显示模块,显示输出电压、电流与功率数值得大小。

关键词:

直流稳压电源;单片机;数控;DAC0832;ADC0809;故障报警

Abstract

Withthedevelopmentofelectronictechnology,peopleontheaccuracyoftheelectronicproductsandflexibilityrequirementmoreandmorehigh,includingelectronicproductstotherequirementsofthepowersupplycircuitmoreandmoreisalsohigh,adjustablepowerfromtheoriginalmanualadjustmentisbeginningtochangeintothenowadayssteppingcontrol,stepprecisioncanreach0.1Vthefollowing,outputvoltagerange0~15V,currentcanbetoreach2A.

ThispaperintroducesthenumericalcontroldcstepvoltagestabilizerAT89S52SCMisascontrolcore,throughtheAD/DAconversiontosteppingcontroloutputpower,andwith12864LCDdisplaymoduleasshowsthattheoutputvoltage,current,andpowerworthsizenumber.

Keywords:

dcvoltagestabilizer;SCM;Numericalcontrol;DAC0832;ADC0809;Faultalarm

第一章方案比较与设计

1.1设计题目及要求

基本要求:

1、输出电压:

范围0V~10V,步进0.1V,可“+”“-”

2、LCD12864显示输出电压值

3、LCD显示的电压必须与测量的电压完全相等

4、电压精度为0.1V

发挥部分:

1、显示电流值

2、显示输出功率

3、纹波小于10mV

4、蜂鸣报警

5、输出精度为0.001V

1.2方案比较与选择

1.2.1控制电路方案比较与选择

方案一:

采用简单数字芯片电路来实现,它是将“+”、“-”信号接入CD4013单稳态电路,克服按键抖动引起的误操作,方波信号可用CD4060产生,利用CD4011及4069实现对CD192“+”、“-”计数的选通,然后通过CD4511译码后送入数码管显示。

缺点制造过程繁琐,而且电路也较复杂。

方案二:

采用AT89S52系列单片机为控制核心,利用AD/DA转换,来控制输出电源,如图1.1所示。

比较上述2种方案,方案二电路简单、软件简洁、功能强,本课题中我们采用方案二。

 

1.2.2显示电路方案比较与选择

方案一:

采用数码管显示,成本低,亮度高,醒目。

但在显示较多的项目时,硬件电路复杂,功耗较大。

方案二:

采用带字库的12864液晶显示屏作为显示模块,它的驱动程序简单,可以显示16行16列汉字。

显示信息量大,外形美观。

课题中需要同时显示电压,电流的设定值和输出值等,要求显示内容丰富。

比较上述2种方案,方案二电路简单、显示信息量大、能很好的满足题目要求,我们采用方案二,如图1.2所示。

 

1.3方案设计与论证

1.3.1整体电路的设计

电路部分主要有:

微处理模块,AD/DA转换电路,控制电路,显示电路,保护电路,显示电路等模块组成。

采用单片机作为整机的控制单元,通过改变输出数字量来改变输出电压值,从而使输出调整管的基极电压发生变化,间接地改变输出电压的大小。

为了能够使系统具备检测实际输出电压值的大小,我们通过ADC0809进行模数转换,通过单片机实时对电压进行采样,然后进行数据处理及显示。

采用软件方法来解决数据的步进控制,使系统硬件更加简洁,本系统以直流电源为核心,利用单片机为主控制器,通过键盘来设置直流电源的输出电压,设置步进等级可达0.1V,并可由液晶12864显示实际输出电压、电流与功率值。

利用单片机程控输出数字信号,经过D/A转换器(DA0832)输出模拟量,再经过运算放大器隔离放大,控制输出功率管的基极,随着调整管基极电流的变化而输出不同的电压。

单片机系统还兼顾对恒压源进行实时监控,输出电压经过电流/电压转变后,通过A/D转换芯片,实时把模拟量转化为数据量,经单片机分析处理,通过数据形式的反馈环节,使电压更加稳定,构成了精确的压控直流步进电压源。

1.3.2总体电路组成框图

图1.5电路组成方框图

第二章电路设计、理论分析

2.1主要电路模块的分析计算与设计

2.1.1控制、稳压电路

图2.1控制、稳压电路

 

2.1.2主控电路

控制电路主要由AT89S52单片机及外围电路、键盘电路等组成。

单片机接收检测电路传输来的信号,经过A/D转换后将电压和电流值显示到液晶上。

该电路能够通过按键设定电源的输出电压值和电流值,通过控制D/A芯片的设定值实现控制输出电压值和电流值。

并根据检测实际输出的电流(压)值与设定值比较后,调整D/A芯片的设定值,使得电源的输出稳定、可靠,如图2.2所示。

图2.1AT89C52构成的处理模块

 

2.1.3显示电路

显示电路采用16行16列的汉字液晶屏显示实际的设定电流值、设定电压值、实际输出的电流值、实际输出电压值。

电压分辨率0.1V。

电流分辨率1mA。

液晶屏能够在设定时显示设定的电压和电流值,如图2.3所示。

图2.312864液晶显示模块

2.1.4电源电路

本电路采用双电源供电,由三端稳压块7812、7912、7805组成,+12V与-12V供给辅助控制回路芯片LM324。

其他模块由+5V供电,如图2.4所示。

图2.4电源供电电路

2.1.5报警电路

当电流过大时,通过一个光电耦合器驱动报警电路,蜂鸣器发声报警,以示警告如图2.5所示。

图2.5报警电路

2.1.6按键部分

采用独立式按键,按键控制控制电压的步进输出,如图2.6所示。

图2.6按键电路

 

2.2软件设计

2.2.1程序流程图

第三章测试数据与结果分析

本题目制作完成后,对整体电路的主要指标进行了实际测试。

测试情况如下:

3.1题目要求的测试

根据题目基本要求和发挥部分的要求,我们按要求条件反复作了多次测试,记录了测试结果,并对测试结果做了分析、对比,如表3.1所示。

表3-1结果分析表

项目

题目要求

测试结果

结果分析

控制状态

实现步进控制

0.1V

0.1V

满足要求

电压的可调范围

0-10V

0-10V

满足要求

输出恒压状态

改变负载,输出电压波动

≤0.5V

≤0.2V

满足要求

纹波电压

≤20mV

≤10mV

满足要求

数字显示

数字显示功能

实现

实现

满足要求

输出恒流状态

改变负载,输出电流变化

≤3mA

≤3mA

满足要求

纹波电流

≤1mA

≤1mA

满足要求

输出恒压状态

改变负载,输出电压波动

≤0.2V

≤0.2V

满足要求

纹波电压

≤10mV

≤10mV

满足要求

保护功能

电源温度≥60oC时,保护;降温后恢复

实现

实现

满足要求

本作品设计、制作完成后,对其主要指标进行了实际测试,并将测试结果与题目要求进行了比较、分析。

测试、分析结果:

本设计主要指标全部满足了题目基本要求和发挥部分的要求。

 

设计总结

通过这次数控电源的设计,我们的软件设计能力与硬件设计能力都有很大幅度的提高,在这次设计过程中,我们碰到了很多始料未及的问题,当然,碰到问题就要解决问题,这些问题经过我们团队的细心讨论,最终得到解决。

在硬件设计过程中我们做的第一套设计方案是不可行的,最后经大家的讨论将硬件电路重新设计定下第二套方案,由于第二套方案定下后我们已经没有多少时间,在快速绘图制版过程中,我们忽略了一些很重要问题,由于我们做的是双面版所以在做好板子之后要在做好的电路板上更改是一件很困难的事情,但是由于时间问题,我们只有选择在电路板上更改,最后在调试过程中遇到了很多问题,这些问题导致了我们的调试没有成功。

总结这次设计,我发现,团队合作很重要,分工也很重要,合作好了、分工明确了速度也就上来了,还有在设计方案的时候一定要仔细琢磨,不要再做的过程中发现这个方案有问题,定下方案后也要仔细核查,只有前期工作做好了,后期工作才会较顺利,在做自己的任务中要保持一颗细心专一的心态,比如绘制原理图的时候如果有一点小错误,PCB也错,做出来的板子也是不可以用的。

我知道我们离独立自行设计还有一段距离,我们的电路,也是参考了几个的电路,经过自己的修改合并,然后成为自己的东西,我觉得这是我们成长阶段所要经历的。

可是我们也不能拿到别人的一张图就开始做电路,我们要有自己的思想,独立的方案体系,只有慢慢把不是自己的转变成自己的,我们才会不断进步。

 

 

致谢

感谢这段时间王文海老师与戴俨炯老师耐心的辅导,他们几乎寸步不离的陪我们走过这段苦却乐的日子,王老师与戴老师这段时间为我们劳累,我们需要什么他们就提供什么,不知道的他们来引导,做的不正确的他们耐心的纠正。

时间短暂,但我们很充实,通过项目化得训练我发现自己做事情更加有耐心且细心。

这段时间老师与同学们共同奋斗努力,也作出了一些成果,这里面有大家共同的汗水与乐趣相融合。

 

附录

附录1电路原理图

PCB图

附录2程序清单

#include

#include<12864.h>//12864显示

#include

#include//AD转换

#include//DA转换

#include//IIC协议

#defineucharunsignedchar

#defineuintunsignedint

voidmain(){key1=1;

key2=1;

if(read_add(0)==0xff){write_add(0,150);}//检测IIC内是否有数据,没有就写入数据;

num1=read_add(0);

iic_init();//IIC初始化

lcd_init();//12864初始化

SCLK_595=0;

RCK_595=1;

while

(1)

{

display(0,0,"------电源------");

AD();

DA();

write_add(0,num1);

/**************串并转换*************/

temp=dat;

WR_595();

OUT_595();

}

}

sbitRS=P1^0;

sbitRW=P1^1;

sbitE=P1^2;

#defineucharunsignedchar

#defineuintunsignedint

uchari;

/**************延时子函数**************/

voiddelay(uintz)

{uintx,y;

for(x=z;x>0;x--)

for(y=120;y>0;y--);}

/*********写指令************************/

voidwrite_cmd(ucharcmd)

{RS=0;

RW=0;

E=0;

P0=cmd;

delay(5);

E=1;

delay(5);

E=0;

}

/************写数据*****************/

voidwrite_dat(uchardat)

{RS=1;

RW=0;

E=0;

P0=dat;

delay(5);

E=1;

delay(5);

E=0;

}

/*********设定显示的位置*****************/

voidlcd_pos(ucharX,ucharY)//X行Y列

{ucharpos;

if(X==0)

{X=0X80;}//第一行

elseif(X==1)

{X=0X90;}//第二行

elseif(X==2)

{X=0X88;}//第三行

elseif(X==3)

{X=0X98;}//第四行

pos=X+Y;

write_cmd(pos);//显示地址

}

/*********设定显示的位置及数据*****************/

voiddisplay(ucharX,ucharY,uchardis[])//X行Y列数据

{ucharpos;

if(X==0)

{X=0X80;}//第一行

elseif(X==1)

{X=0X90;}//第二行

elseif(X==2)

{X=0X88;}//第三行

elseif(X==3)

{X=0X98;}//第四行

pos=X+Y;

write_cmd(pos);//显示地址

i=0;

while(dis[i]!

='\0')

{RS=1;

RW=0;

E=0;

P0=dis[i];

delay(5);

E=1;

delay(5);

E=0;

i++;}

}

/***********LCD初始化设定***************/

voidlcd_init()

{

write_cmd(0x30);//基本指令操作

delay(5);

write_cmd(0x0c);//开显示,关光标

delay(5);

write_cmd(0x01);//清屏

delay(5);

}

sbiteoc=P3^4;

sbitADD=P3^5;

sbitoe=P3^6;

sbitstart=P3^7;

ucharcodetable[]={"0123456789"};

ucharnum,num2,d[4];

uintc;

longa,b,j;

floatf,g,h;

voidad_init()

{

start=0;

delay

(1);

start=1;

delay

(1);

start=0;

while(!

eoc);

}

voidAD()

{

/***********通道0******************/

ADD=0;

ad_init();

num=P2;

f=num/51.0;

a=f*1000;

d[0]=a/1000;//取出千位

d[1]=a%1000/100;//取出百位

d[2]=a%1000%100/10;//取出十位

d[3]=a%10;//取出个位

display(1,0,"输出电压:

");//电压

write_dat(table[d[0]]);

write_dat('.');//小数点

write_dat(table[d[1]]);

write_dat(table[d[2]]);

if(d[3]>0){write_dat(table[d[3]]);}

write_dat('V');

write_dat('');

/*****************通道1************/

ADD=1;

ad_init();

num2=P2;

h=num2/51.0;

b=h*1000;

j=a-b;

d[0]=j/1000;//取出千位

d[1]=j%1000/100;//取出百位

d[2]=j%1000%100/10;//取出十位

d[3]=j%10;//取出个位

display(2,0,"输出电流:

");//电流

//lcd_pos(2,3);

write_dat(table[d[0]]);

write_dat('.');//小数点

write_dat(table[d[1]]);

write_dat(table[d[2]]);

if(d[3]>0){write_dat(table[d[3]]);}

write_dat('A');

write_dat('');

/**************功率****************/

display(3,0,"输出功率:

");//功率

g=f*(f-h);

a=g*1000;

d[0]=a/10000;

d[1]=a%10000/1000;

d[2]=a%10000%1000/100;

d[3]=a%10000%1000%100/10;

d[4]=a%10;

//lcd_pos(3,3);

if(d[0]>0){write_dat(table[d[0]]);}

write_dat(table[d[1]]);

write_dat('.');//小数点

write_dat(table[d[2]]);

write_dat(table[d[3]]);

if(d[4]>0){write_dat(table[d[4]]);}

write_dat('W');

write_dat('');

write_dat('');

}

sbitSDATA_595=P1^5;//串行数据输入

sbitSCLK_595=P1^6;//移位时钟脉冲

sbitRCK_595=P1^7;//输出锁存器控制脉冲

sbitkey1=P1^3;

sbitkey2=P1^4;

uchartemp,num1,dat;

ucharcodedianya[]={0,};//建表(使输出步进0.1V)//由于硬件一直没做出来,所以此表格暂时没有数据;

/**********延时子程序*************/

voiddelay1(intms)

{

intk;

while(ms--)

{

for(k=0;k<250;k++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

/************将数据送入74HC595内部移位寄存器*********/

voidWR_595(void)

{

ucharj;

for(j=0;j<8;j++)

{

temp=temp<<1;

SDATA_595=CY;

SCLK_595=1;//上升沿发生移位

_nop_();

_nop_();

SCLK_595=0;

}

}

/*******将移位寄存器内的数据锁存到输出寄存器并显示**********/

voidOUT_595(void)

{

RCK_595=0;

_nop_();

_nop_();

RCK_595=1;//上升沿将数据送到输出锁存器

_nop_();

_nop_();

_nop_();

RCK_595=0;

}

/*****************DA子程序********************************/

voidDA(){

if(key1==0){delay(10);

if(key1==0)

{while(!

key1);

num1++;

//dat=num1;

dat=dianya[num1];

}

}

if(key2==0){delay(10);

if(key2==0)

{while(!

key2);

if(num1<=0){num1=1;}

num1--;

//dat=num1;

dat=dianya[num1];

}

}

}

#defineuintunsignedint

#defineucharunsignedchar

sbitsda=P3^0;//数据线

sbitscl=P3^1;//时钟线

voidiic_delay()

{;;}

/***********开始*************/

voidiic_start()

{

sda=1;

scl=1;

iic_delay();

sda=0;

iic_delay();

}

/************停止***********/

voidiic_stop()

{

sda=0;

iic_delay();

scl=1;

iic_delay();

sda=1;

iic_delay();

}

/**********应答*************/

voidask()

{

uchari;

scl=1;

iic_delay();

if((sda==1)&&(i<1))

i++;

sda=0;

scl=0;

iic_delay();

}

/**********初始化***********/

voidi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1