简易数控直流电源最终上交版Word格式.docx
《简易数控直流电源最终上交版Word格式.docx》由会员分享,可在线阅读,更多相关《简易数控直流电源最终上交版Word格式.docx(32页珍藏版)》请在冰豆网上搜索。
Summary
TheDCpowertotheCNCtechnologySTC89C52macrocrystalchipforthecontrolofthecore,throughthe8-bitDAconverterchipDAC0832analogcontroloutput,amplifiedbythetwoopampinordertoachievethesubjectrequirements.Step-downtransformerpowersupplyfirst,andthenby78,79three-terminalregulatorchipoutput±
15V,+5Vforsystemuse.SystemusesanADchipAD770516-bitreal-timemonitoringofoutputvoltage,theskyalltheworkstatuswillbedisplayedintheLCDdisplayonthe12864,sounusualandtimelyadjustment.PoweroutputcircuitwithDarlingtonTIP122andTIP127closedlooppush-pulloutputformattoensuretheoutputcurrent.
Keywords:
STC89C52DAC0832AD7705OP07LCD12864
一.方案论证与分析
本题要求设计并制作一建议数控直流电源。
要求输出电压范围0~+9.9V,通过按键控制步进0.1V,可保证有500mA的电流输出,并可显示电压值,以及其他一些扩展功能,上述各模块的方案论证如下:
1.1微控制器模块论证与分析
方案一:
采用STC公司出产的STC89C52单片机。
此单片机价格便宜,应用广泛,编程方便,只需要添加一片DAC0832就可以很简单的实现题目要求。
方案二:
采用SPCE061A单片机来实现,此单片机内置8路10位ADC和2路DAC,避免了外接A/D转换芯片和D/A转换芯片,并且I/O接口比较多,易于扩展外围电路,但是很多功能在本次设计中都没有用到。
所以综合考虑成本与本体要求选择方案一
1.2键盘模块论证与分析
采用独立键盘
考虑到一些扩展功能,接四个独立按键,以方便进行各功能的调整、转换。
方案二:
矩阵键盘模块
采用矩阵键盘进行编程和控制操作,可利用的键盘个数满足要求,而且占用的单片机端口相对较少,利用率高,对于扩展功能提供发展空间。
综合考虑,本设计不需要过多按键,而且单片机IO口充足,故此采用独立按键。
1.3显示模块论证与分析
用LED进行显示。
数码管由于显示速度快,对环境要求低,使用简单,显示效果简洁明了而得到了广泛应用,但是耗能高,而且动态显示要在各位延时上设置合理,而且显示信息量太少,考虑到系统的AD7705芯片采样周期长,系统显示信息量较大,故不采用此方案。
128*64液晶显示。
这个显示器可以显示文字,图片等,显示的内容比较丰富,正好手头有一个,故此用12864显示。
综合考虑选择方案二作为显示模块。
1.4功率输出模块论证与分析
考虑到从运放输出的电流值达不到题目要求,故在此用达林顿管TIP122与TIP127构成闭环推挽输出形式,保证输出电流,而且达林顿管应用广泛、价格低廉。
二.系统硬件设计
2.1系统总体设计
本系统以STC89C52为控制核心通过LCD12864进行实时显示,通过控制改变DA的值,达到题目要求的步进增减,通过程序的编写,可实现步进增减、自动扫描、手动预设值、特殊波形输出等各项功能。
程序流程图见上图
中央处理器选用的是STC89C52单片机,其原理图电路如下:
其中包括单片机的时钟电路、上点自动复位、手动复位等各模块,以及实现控制的键盘接口等。
2.2DA转换放大模块设计
本系统采用的是DAC0832芯片进行DA转换,在DA输出端接一运放OP07将DAC0832输出的电流转换为电压,再通过一次反相比例将电压值转换为正电压,以便进行AD采样检测。
再通过以及正相比例运算,将电压值放大两倍,已达到题目要求。
原理图如下:
2.3AD采样模块设计
AD采样使用芯片AD7705,将经过反相放大后的电压值采样,并实时显示在显示器上,以便检测,原理图如下:
2.4显示模块设计
液晶显示选用的是LCD12864液晶显示屏,
接线方式如右图所示:
2.5电源及功率模块设计
电源用变压器变压,通过三端稳压芯片得到稳定电压。
功率输出用达林顿管TIP122与TIP127构成闭环推挽输出形式,保证输出电流。
三.系统软件设计
经过我们的分析得到如下结论,要使整个系统稳定且高效的运行,则程序之间的配合要达到互不干扰的程度,严格按照芯片的驱动程序对各个芯片经行初始化,进而进行控制。
总的程序框图如右图所示:
四.系统测试
4.1测试仪器及设备
仪器名称
型号
数量
数字万用表
DT9205N
1
模拟示波器
JC2042M
4.2功能测试
4.2.1基本功能测试
这个系统所有的基本功能是步进输出电压测量结果如下:
测量次数
理想电压
实际电压
3.5V
3.53V
2
5.5V
5.53V
3
7.5V
7.53V
4
8.5V
8.54V
5
9.8V
9.84V
五.结论
本数控直流电源以宏晶科技的STC89C52单片机为控制核心,通过8位DA转换芯片DAC0832控制输出模拟量,通过两级运放放大以达到题目要求。
在这几天中,我们遇到许许多多难题,通过本组成员的努力,及老师和同学的帮助大体得以解决。
这几天的设计竞赛,增强了实践能力和协作精神,懂得了联系实际的重要性。
我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。
六.附录
6.1参考资料
[1]黄智伟.全国大学生电子设计竞赛系统设计(第2版)北京航空航天大学出版社,2011
[2]林红,周鑫霞.模拟电路基础.清华大学出版社,2008
[3]谭浩强.C语言程序设计(第二版).北京:
清华大学出版社,2000
6.2部分源程序
//以下是main.c文件内容
#include<
REGX52.H>
setjmp.h>
#include"
delay.h"
isme.h"
alonekeyscan.h"
#include"
lcd12864.h"
ad7705.h"
ucharcodetitleAsc[]="
简易数控直流电源"
;
ucharcodewriteVoltageAsc[]="
控制电压:
V"
ucharcodeinputVoltageAsc[]="
设置输出电压:
ucharcodereadVoltageAsc[]="
测量电压:
ucharcodebujinVoltageAsc[]="
步进0.1V"
ucharcodesetVoltageAsc[]="
手动输入"
ucharcodeset0Asc[]="
|"
ucharcodeset1Asc[]="
|"
ucharcodeifSaveTheSetAsc[]="
是否保存设置?
"
ucharcodekeyToChooseAsc[]="
1保存2取消"
ucharcodesavedAsc[]="
保存成功"
ucharcodenotSaveAsc[]="
未保存"
ucharcodeautoScanAsc[]="
自动扫描"
ucharcodeautoAddAsc[]="
自增"
ucharcodeautoReduceAsc[]="
自减"
ucharcodepauseScanAsc[]="
暂停扫描"
ucharcodewaveOutPutAsc[]="
输出三角波"
ucharcodewaveOutPut2Asc[]="
输出方波"
ucharcodecreatWaveAsc[]="
数字波形发生器"
ucharcodewaveTAsc[]="
波形周期:
"
ucharcodewaveMAsc[]="
波形峰值:
ucharfnType=0;
bitb_scanType=0;
bitb_waveType=0;
bitsetType=0;
u8toDa=50;
u8timer0AutoCount,timer1AutoCount;
u8t=30;
u8m=1;
u8waveOut;
u16wave;
jmp_bufbuf;
voidInitInterrupt(void)
{
EA=1;
ET1=1;
ET0=1;
TH1=0X3c;
TL1=0Xb0;
TH0=236;
TL0=236;
TMOD=0X12;
}
voidSet12864(void)
Cle12864Scr();
//第一行显示:
简易数控直流电源
Dis12864StrSer(titleAsc);
//第二行显示:
Wr12864Ser(SECOND_LIN,COM);
Dis12864StrSer(writeVoltageAsc);
//第三行显示:
Wr12864Ser(THIRD_LIN,COM);
Dis12864StrSer(readVoltageAsc);
voidDisFnType(uchartype)
Wr12864Ser(FOURTH_LIN,COM);
if(type==0)//步进0.1
{
Dis12864StrSer(bujinVoltageAsc);
}
elseif(type==1)//手动输入电压值
Dis12864StrSer(setVoltageAsc);
elseif(type==2)//自动扫描
Dis12864StrSer(autoScanAsc);
elseif(type==3)//输出三角波
Dis12864StrSer(waveOutPutAsc);
elseif(type==4)//输出方波
Dis12864StrSer(waveOutPut2Asc);
voidDisAdVoltage(u16dat)
floatfVoltageVal;
u16disV;
u8temp;
fVoltageVal=(dat/65535.0)*10;
disV=(u16)(fVoltageVal*100);
Wr12864Ser(AFTER36,COM);
temp=disV/1000%10;
if(temp==0)
Wr12864Ser(numAsc[11],DAT);
else
Wr12864Ser(numAsc[temp],DAT);
temp=disV/100%10;
Wr12864Ser(numAsc[temp],DAT);
Wr12864Ser(numAsc[10],DAT);
temp=disV/10%10;
temp=disV%10;
voidDisDaVoltage(u8dat)
u8temp;
Wr12864Ser(AFTER27,COM);
dat/=2;
temp=dat/10%10;
temp=dat%10;
voidSetOutputVoltage(void)
u8keyVal,tempDa;
bitsetWho=0;
tempDa=toDa;
Dis12864StrSer(inputVoltageAsc);
while
(1)
keyVal=Alone4KeyScan();
if(keyVal==1)
{
Cle12864Scr();
Dis12864StrSer(ifSaveTheSetAsc);
Wr12864Ser(SECOND_LIN,COM);
Dis12864StrSer(keyToChooseAsc);
while
(1)
{
keyVal=Alone4KeyScan();
if(keyVal==1)
{
toDa=tempDa;
Cle12864Scr();
Wr12864Ser(AFTER23,COM);
Dis12864StrSer(savedAsc);
DelayXMs(2000);
longjmp(buf,1);
}
elseif(keyVal==2)
Dis12864StrSer(notSaveAsc);
}
}
elseif(keyVal==2)
setWho=~setWho;
elseif(keyVal==3)
if(setWho==0&
&
tempDa<
198)
tempDa+=2;
elseif(tempDa<
180)
tempDa+=20;
elseif(keyVal==4)
tempDa>
=2)
tempDa-=2;
elseif(tempDa>
20)
tempDa-=20;
Wr12864Ser(AFTER37,COM);
if(setWho==0)
Dis12864StrSer(set0Asc);
else
Dis12864StrSer(set1Asc);
DisDaVoltage(tempDa);
voidAutoScanVoltage(void)
u8keyVal;
//默认自增
Wr12864Ser(AFTER47,COM);
Dis12864StrSer(autoAddAsc);
InitInterrupt();
//定时器初始化
TR1=1;
//开定时器1
P0=toDa;
TR1=0;
EA=0;
longjmp(buf,1);
toDa=0;
elseif(keyVal==3)
TR1=~TR1;
elseif(keyVal==4)
b_scanType=~b_scanType;
Wr12864Ser(AFTER47,COM);
if(b_scanType==0)
Dis12864StrSer(autoAddAsc);
else
Dis12864StrSer(autoReduceAsc);
DisDaVoltage(toDa);
//自动扫描
Wr12864Ser(FOURTH_LIN,COM);
if(TR1==1)
Dis12864StrSer(autoScanAsc);
Dis12864StrSer(pauseScanAsc);
voidDisWaveInf(u8dat)
dat*=8;
//显示周期
Wr12864Ser(numAsc[11],DAT);
if(dat>
99)
temp=dat/100%10;
9)
temp=dat/10%10;
voidDisMaxInf(u8dat)
switch(m)
case1:
dat=10;
break;
case2:
dat=5;
case5:
dat=2;
case10:
dat=1;
Wr12864Ser(AFTER37,COM);
voidWaveOutPut(void)
数字波形发生器
Dis12864StrSer(creatWaveAsc);
//输出波形
if(fnType==3)
elseif(fnType==4)
if(setType==0)
Dis12864StrSer(waveTAsc);
DisWaveInf(t);
Di