数控直流稳压电源.docx
- 文档编号:17263084
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:23
- 大小:162.14KB
数控直流稳压电源.docx
《数控直流稳压电源.docx》由会员分享,可在线阅读,更多相关《数控直流稳压电源.docx(23页珍藏版)》请在冰点文库上搜索。
数控直流稳压电源
电子系统设计实验
题目:
专业:
姓名:
学号:
一、设计任务及要求
1、要求输出电压0—12V可调,步进为0.1V,输出电流1A。
2、键盘调整输出电压,能数字显示出输出电压。
3、EWB仿真且搭建实物。
二、方案设计与论证
根据设计要求可以用下面两个方案:
方案一:
设计开关电源。
在前期方案设计中采用PWM脉宽调制。
它的功耗小,效率高,稳压范围宽,电路形式灵活多样,功耗小,效率高。
在制作过程中发现,PWM占空比的线性变化使相应的电流呈非线性变化,经分析发现滤波电容的存在对占空比很小的PWM波积分效果明显,导致电压的非线性变化更显著,特别是PWM占空比小时(希望得到的输出电压很小),利用单片机开关电源的PWM技术控制开关的占空比来调整输出电压的,以达到稳定输出的目的。
但数字量控制的作用更加明显。
方案二:
用单片机对电压进行步进和预置调节,使用功率放大器对DAC输出的电压进行放大。
设计方案,其主要由控制模块、D/A转换模块、显示模块、键盘模块、放大模块五部分构成。
液晶屏显示电路,该系统使用LCD1602液晶显示屏,可以清晰地显示分别组成显示电路的十位、个位、小数点位,同时还能显示英文名和电压/电流单位。
其系统框图如图1所示。
图1方案二系统框图
采用常用的AT89C52单片机作为控制器,P2口和DAC0832的数据口直接相连,D/A的电压输出端接放大器OP07的输入端,设定放大器的放大倍数为5,输出电压的分辨率0.1V。
所以,当MCU输出数据增加1的时候,最终输出电压增加0.1V,当调节电压的时候,可以以每次0.1V的梯度增加或者降低电压。
液晶显示电路,该系统用液晶显示屏LCD1602。
本主电路的原理是通过MCU控制D/A的输出电压大小,通过放大器放大。
依据设计要求中所提出的特色及基本技术路线,所以最后选用方案二。
三、硬件设计
数控直流电源的硬件部分主要是由单片机相关的控制电路、键盘电路、显示电路、D/A转换电路和放大电路组成。
3.1单片机电路
本设计采用的是AT89C52单片机,其实现其来简单而且节省元器件,其引脚如下图所示:
图2AT89C52单片机芯片引脚图
在本设计中,单片机AT89C52引脚的P3口与D/A转换器和液晶显示器1602相连接。
其中,P3.0和P3.1口接D/A转换器,P3.2和3.6口接液晶显示器。
RST:
复位输入。
当振荡工作时,RST引脚出现两个机器周期上高电平将使单片机复位。
3.1.1复位电路
启动复位使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
另外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也可以按复位键重新启动。
RST引脚是复位信号的输入端。
复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。
本设计使用频率为12MHz的晶振,则复位信号持续时间应超过2us,才能完成复位操作。
本设计采用手动复位和上电复位两种形式,其电路图如图3所示。
图3复位电路
3.1.2时钟振荡电路
时钟电路用于产生MCS-51单片机工作时所必须的时钟信号。
时钟是时序的基础,为保证同步工作方式的实现,单片机应在唯一的时钟信号控制下,严格地按时序执行指令进行工作。
因此,时钟频率和质量也直接影响单片机系统的速度和稳定性。
常用的时钟电路有内部时钟和外部时钟方式。
本系统采用内部时钟方式,其电路图如图4所示。
图4内部方式时钟产生电路
单片机片内由一个反向放大器构成振荡器,可以由它产生时钟。
该反相放大器的输入端为引脚XTAL1,输出端为引脚XTAL2。
这两个引脚外接石英晶体振荡器作为定时元件,内部反向放大器自激振荡,产生时钟。
C12,C13对频率有微调作用。
C12和C13值选择为30PF。
晶振频率选择11.0592MHZ。
在实际连接中,为了减少寄生电容,更好地保证振荡器稳定,振荡器和电容应尽可能安装得与单片机芯片靠近。
3.2键盘模块电路
在本设计中,利用键盘进行各个功能的选择,它是系统进行人机对话的重要部件。
由于系统需要的按键较多,因此采用了4
4矩阵式键盘。
此种键盘结构把检测线分为两组,一组为行线,一组为列线,按键放在行线和列线的交叉点上。
矩阵式的键盘的优点是需要的测试线的数量少,对于一个N×N的矩阵键盘与主机连接只需要N+N条测试线。
4
4键盘电路的连线图如图5所示。
P14、P15、P16、P17作为键盘的行线,而P10~P13设为列线。
采用查询式的扫描方式,来识别键盘上闭合键是哪个功能键。
本设计选用的是4×4的键盘控制,以P1.0~P1.3做输入线,以P1.4~P1.7作输出线;系统中键盘模块设计十三个按键0~9、增加、减少、确认。
当按下7时P13和P14导通,说明7已被按下。
按下相应的数字按键如:
要设置10.5V电压时,按下“1”、“0”、“5”、“确认”输入的电压值就是10.5V;需要对电压进行微调时,需按下“增加”或者“减少”每按一下电压就相应的增加或者减少0.1V,当达到所需要的数值时,再按下“确认”输入的电压值就相应的增加或者减少。
图54×4键盘连线图
3.31602显示模块电路
显示的方式很多主要分为两类:
LED显示,LCD显示。
前者显示亮度高,制作成本低,适合做远距离显示,但是由于其耗电较大,所用端口随显示的数据位数增加而增加。
如果采用动态扫描方式显示,则占用CPU的时间,如果采用静态显示则需要加锁存器,耗费硬件制作时间,就该题目来说,需要设定电压显示,LCD显示更为清晰、直观,从上面诸多因素来看,采用LCD显示屏上完整显示出比较理想。
LCD最常用的就是1602液晶模块。
LCD1602可以再LCD显示屏上完整显示32个英文字符和日文等一些字符,适合显示英文文字信息较小的地方,可以清晰显示出同时还能显示英文名称和电压/电流单位,电压(三位数字:
十位、个位、小数位),电流(三位数字:
十位、个位、小数位)。
通过单片机编程控制第4脚RS数据/命令选择端(H/L),第5脚R/W读/写选择端(H/L),第6脚E使能信号,从而实现显示效果。
它的显示运行原理如下:
读状态输入RS=L,RW=H,E=H;输出:
D0~D7=状态字
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲;输出:
无
读数据:
输入:
RS=H,RW=H,E=H;输出:
D0~D7=数据
写数据:
输入:
RS=L,RW=L,D0~D7=数据,E=高脉冲;输出:
无
LCD1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
LCD1602可以显示2行16个字符,有8位数据总线D0~D7和RS、R/W和EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
综上所述,LCD1602满足本系统的需求。
LCD1602的接口信号说明如表2所示:
表11602型LCD的接口信号说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
V0
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据/命令选择端(H/L)
12
D5
DataI/O
5
R/W
读写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
其显示部分引脚接口如图6所示:
其引脚与单片机接口连线从上到下依次为P0.0~P0.7
图6LCD显示电路原理图
3.4D/A转换模块电路
D/A转换器作为模拟量输出通道的常用的器件,将数字量转换为模拟量,选择DAC0832,它是8位芯片,可直接接到单片机的数据内含有一个8位输入数据寄存器,一个8位DAC寄存器和一个8位D/A转换器,数字量转换过程是将数字量存在输入数据寄存器,在接到转换命令时将输入数据寄存器的内容传输到DAC寄存器通过D/A转换器转换为模拟量,进行转换,转换时间为1us。
(1)DAC0832主要特性:
①分辨率为8位;
②电流稳定时间1us;
③可单缓冲、双缓冲或直接数字输入;
④只需在满量程下调整其线性度;
⑤单一电源供电(+5V~+15V);
⑥低功耗,200mW。
(2).DAC0832工作方式
输出模拟0-5伏电压,还需要在DAC0832后接一放大器选用OP01,这种放大器的主要特征是增益共模抑制比很高(一般为100dB),而其失调电压和失调电流、温漂以及噪声又很小,其广泛地应用于稳定积分、精密加法、比较、阈值电压检测、微弱信号精确放大等场合,是一种通用性极强的运算放大器。
DAC0832的转换关系如下式
(1)所示:
(1)
式中
—基准电压;
—输入的数字量;
—输出的模拟电压量。
(3)DAC0832与AT89C52连接电路如图7所示:
图7DAC0832与AT89C52连接电路
3.5放大电路
放大电路的特点:
功率放大电路是一种以输出较大功率为目的的电路。
因此,要求同时输出较大的电压。
工作在接近极限状态。
一般直接驱动负载,带动负载能力强。
放大电路图如图8所示,即将D/A输出的电压放大测量。
图8放大电路图
四、软件设计
软件的设计应遵循结构化设计原则,在总体概况设计的基础上进行具体的详细设计、功能分解、模块划分、细化软件层次、优化软件结构,以达到模块功能的独立性,执行的高效性。
该系统的软件程序由主程序和数个子程序模块组成,其中子程序包括显示子程序、按键识别程序、D/A子程序。
4.1系统软件流程图
流程图如图9所示,负责与各子程序模块的接口和检查键盘功能。
程序运行后,开始检测是否有键按下,若有则进入设定按键功能。
液晶LCD1602直接显示CPU设定的数值,使CPU资源得到充分利用。
图9主程序流程图
4.2子程序设计
4.2.1D/A转换子程序
D/A转换器的流程图如图10所示,通过调用D/A转换器子程序对D/A转换器进行控制,控制D/A转换器使其按照要求来运作,将数字信号转换成模拟信号,输送给放大器进行放大。
开始
启动D/A
转换完?
图10D/A子程序流程图
4.2.2键盘子程序设计
程序主要分为两个部分:
一个部分不停地监测是否有按键按下,另一个部分查看哪一个键按下。
在初始状态下,4个列输出端口输出低电平,即P1.0~P1.3输出低电平,然后持续监测4个行输入端口P1.4~P1.7的状态是不是高电平。
如果没有按键按下,则P1.4~P1.7的状态是高电平;如果有按键按下,则被按下的键对应的行输入端口的电平就会被拉低,P1.4~P1.7会有低电平出现,对4个行输入端口P1.4~P1.7的电平的监测即为对按键的监测。
在4个行输入端口P1.4~P1.7上出现低电平时,就转到查询程序SEE。
键盘子程序流程图如图11所示。
图11键盘子程序流程图
4.2.41602显示子程序设计
液晶显示模块的显示器上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;驱动控制芯片当中共有65(8Pagex8bit+1)X132个位的显示RAM区。
而显示器的显示点阵大小为64X128点,所以实际上在液晶显示模块中有用的显示RAM区为64X128个位;按byte为单位划分,共分为8个Page,每个Page为8行,而每一行为128个位(即128列)。
驱动控制芯片的显示RAM区每个byte的数据对应屏上的点的排列方式为:
纵向排列,低位在上高位在下。
如要点亮LCD屏上的某一个点时,实际上就是对该点所对应的显示RAM区中的某一个位进行置1操作;所以就要确定该点所处的行地址、列地址。
从图中可以看出,LCD1602液晶显示模组的行地址实际上就是Page的信息,每一个Page应有8行;而列地址则表示该点的横坐标,在屏上为从左到右排列,Page中的一个Byte对应的是一列(8行,即8个点),达128列,根据这样的关系在程序中控制LCD显示屏的显示。
LCD显示子程序如图12所示。
送设置显示器第
一行的初始地址
写指令地址加1
第一行是否
全部显示
送设置显示器第
二行的初始地址
写指令
地址减1
第二行是否
全部显示
结束
图12LCD显示子程序
五、系统电路及仿真结果
控制模块、D/A转换模块、显示模块、键盘模块、功率放大模块五部都能按照预期的要求来运行。
实现了用键盘来对电压的预置及步进调整,在液晶显示屏上实现了设定电压和输出电压的显示。
电压的实际输出范围也达到了实验的任务书上的要求(3~12V)。
如图13为本次毕业设计Proteus仿真结果。
图13Proteus仿真结果
六、实验结语
本次试验属于比较系统的训练,也比较复杂,实现起来不是很容易,特别是D/A转换模块,我调了一天才将这个模块调好。
这次试验训练虽然很辛苦,但从中确实有很多的收获,让我对学过的知识有了充分的利用,当然也学到一些解决问题和适应的能力:
(1)收收集相关资料。
一方面利用学校图书馆资源,另一方面利用网上资源。
(2)提高设计效率,遇到不解的疑惑与老师、其他同学及时沟通,以迅速解决设计中遇到的问题。
(4)同学之间相互学习、沟通、鼓励、支持。
当然本次试验也遇到了很多需要进一步改进的问题,如对理论知识的不聊解而一味的借鉴别的东西使设计过程中出现很多问题,而且理论功底不足致使设计不到位,也就是理论与实际不能很好的结合。
总之,本次试验设计任务让我受益匪浅,认识到理论知识的重要,我相信这些在以后的学习生活中将对我有很大的帮助。
附录:
系统源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P3^0;
sbiten=P3^1;
sbitDAC_CS=P3^2;
sbitDAC_WR=P3^6;
sbitqingling=P3^3;
unsignedcharshu[]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30};
unsignedcharshu1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e};
ucharcodetable1[]="OutputV:
00.0V";
ucharcodetable2[]="InputV:
00.0V";
unsignedcharData[5]={0,0,0,0,0};
ucharge,j,shifen,keynum,volt,V,dac,data1,data2,data3,flag,shi,c=0;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//写指令到1602
{
rs=0;
//en=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
voidwrite_date(uchardate)//写数据到1602
{
rs=1;
//en=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
voidInit()//初始化
{
ucharnum;
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<14;num++)
{
write_date(table1[num]);
delay(50);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_date(table2[num]);
delay(50);
}
}
voidwrite_voltage(ucharadd,uchardat)//写电压到1602
{
write_com(0x80+0x40+add);
write_date(0x30+dat);
}
voidwrite_outvoltage(ucharaddd,uchardatt)//写电压到1602
{
write_com(0x80+addd);
write_date(datt);
}
voidda0832out(uchardadata)//写电压数据到DAC0832
{
if(dadata<=30)
dadata=30;
if(dadata>120)
dadata=120;
DAC_CS=0;
P2=dadata;
DAC_WR=0;
delay(5);
DAC_WR=1;
DAC_CS=1;
}
voidoutput(uchardataa)
{unsignedintout;
if(dataa>120)
dataa=120;
if(dataa<=30)
dataa=30;
out=dataa*10;
write_outvoltage(9,shu1[out/1000%10]);
delay(10);
write_outvoltage(10,shu1[out%1000/100]);
delay(10);
write_outvoltage(11,shu1[10]);
delay(10);
write_outvoltage(12,shu1[out%100/10]);
delay(10);
write_outvoltage(13,shu1[out%10]);
delay(10);
}
voidkeybarod()
{unsignedchara,i;
unsignedcharnum[]={0xef,0xdf,0xbf,0x7f};
for(i=0;i<4;i++)
{P1=num[i];
if(P1!
=num[i])
{delay(15);//延时十毫秒
if(P1!
=num[i])
a=P1;
c++;
while(P1!
=num[i])
switch(a)
{case0xee:
{Data[c]=shu[4*i+0];break;}
case0xed:
{Data[c]=shu[4*i+1];break;}
case0xeb:
{Data[c]=shu[4*i+2];break;}
case0xe7:
{Data[c]=shu[4*i+3];break;}
case0xde:
{Data[c]=shu[4*i+0];break;}
case0xdd:
{Data[c]=shu[4*i+1];break;}
case0xdb:
{Data[c]=shu[4*i+2];break;}
case0xd7:
{Data[c]=shu[4*i+3];break;}
case0xbe:
{Data[c]=shu[4*i+0];break;}
case0xbd:
{Data[c]=shu[4*i+1];break;}
case0xbb:
{Data[c]=shu[4*i+2];break;}
case0xb7:
{Data[c]=shu[4*i+3];break;}
case0x7e:
{delay(5);Init();break;}
case0x7d:
//增加
{flag=2;
shifen++;
if(shifen==10)
{
shifen=0;
ge++;
if(ge==10)
{
ge=0;
shi++;
write_com(0x80+0x40+7);
write_com(0x0c);
write_voltage(8,shi);
}
write_com(0x80+0x40+8);
write_com(0x0c);
write_voltage(9,ge);
}
write_com(0x80+0x40+10);
write_com(0x0c);
write_voltage(11,shifen);
break;
}
case0x7b:
//减少
{flag=2;
shifen--;
if(shifen==-1)
{
shifen=9;
ge--;
if(ge==-1)
{
ge=9;
shi--;
write_com(0x80+0x40+7);
write_com(0x0c);
write_voltage(8,shi);
}
write_com(0x80+0x40+8);
write_com(0x0c);
write_voltage(9,ge);
}
write_com(0x80+0x40+10);
write_com(0x0c);
write_voltage(11,shifen);
break;
}
case0x77:
//确认
{
delay(5);
if(flag==1)
{
volt=(data1-0x30)*100+(data2-0x30)*10+(data3-0x30);
da0832out(volt);
}
if(flag==2)
{
volt=shi*100+ge*10+shifen;
da0832out(volt);
}
c=0;
break;
}
}
}
}
switch(c)
{
case1:
{data1=Data[1];write_com(0x80+0x40+8);write_date(data1);shi=data1-0x30;break;}
case2:
{data2=Data[2];write_com(0x80+0x40+9);write_date(data2);ge=data2-0x30;break;
case3:
{data3=Data[3];write_com(0x80+0x40+11);write_date(data3);
flag=1;shifen=data3-0x30;break;}
}
}
voidmain()//主函数
{
Init();
ge=0;
shifen=0;
shi=0;
while
(1)
{delay(10);
keybarod();
output(volt);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数控 直流 稳压电源