单片机的数控直流稳压电源的方案设计课程方案设计.docx
《单片机的数控直流稳压电源的方案设计课程方案设计.docx》由会员分享,可在线阅读,更多相关《单片机的数控直流稳压电源的方案设计课程方案设计.docx(25页珍藏版)》请在冰豆网上搜索。
单片机的数控直流稳压电源的方案设计课程方案设计
专业电气工程及其自动化
指导教师姓名
专业技术职务讲师
摘要1
第一章引言1
1.1.数控电源的发展史1
1.2.数控电源的应用范围2
1.3.数控电源的优点2
第二章系统的设计要求和方案选择3
2.1.设计要求3
2.2.方案论证与比较3
2.2.1稳压电源的选择3
2.2.2数字显示方案4
第三章系统硬件设计4
3.1.系统设计4
3.2.微控制器模块5
3.2.18051单片机的性能5
3.2.28051单片机的最小系统6
3.3.电源模块7
3.3.1单片机供电模块7
3.3.2整流滤波电路和+5v供电模块7
3.4.W117电阻网络和继电器驱动电路8
3.5.显示电路10
3.6.键盘电路10
第四章软件11
4.1.主程序11
4.2.扫描键盘程序17
4.3.显示驱动程序18
第五章总结23
第六章附件(电路图)24
参考文献25
致谢26
摘要
数控直流稳压源就是能用数字来控制电源输出电压的大小,而且能使输出的直流电压能保持稳定、精确的直流电压源;数控电源是针对传统电源的不足设计的,数字化能够减少生产过程中的不确定因素和人为参与的环节数,有效地解决电源模块中诸如可靠性、智能化和产品一致性等工程问题,极大地提高生产效率和产品的可维护性,市场前景广阔。
在本文中控制部分主要以8051单片机为核心制作控制电路,稳压部分主要以w117为核心制作三端稳压电路,显示部分采用数码管显示,输入采用键盘式输入再加一个驱动电路;通过软件编程有效的实现可控、可显的电源输出。
关键词:
直流稳压电源;8051单片机;数码管显示。
第一章引言
1.1.数控电源的发展史
电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。
电力电子技术是电能的最佳应用技术之一。
当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。
随着计算机和通讯技术发展而来的现代信息技术革命,给电力电子技术提供了广阔的发展前景,同时也给电源提出了更高的要求。
随着数控电源在电子装置中的普遍使用,普通电源在工作时产生的误差,会影响整个系统的精确度。
电源在使用时会造成很多不良后果,世界各国纷纷对电源产品提出了不同要求并制定了一系列的产品精度标准。
只有满足产品标准,才能够进入市场。
随着经济全球化的发展,满足国际标准的产品才能获得进出的通行证。
数控电源是从80年代才真正的发展起来的,期间系统的电力电子理论开始建立。
这些理论为其后来的发展提供了一个良好的基础。
在以后的一段时间里,数控电源技术有了长足的发展。
但其产品存在数控程度达不到要求、分辨率不高、功率密度比较低、可靠性较差的缺点。
因此数控电源主要的发展方向,是针对上述缺点不断加以改善。
单片机技术及电压转换模块的出现为精确数控电源的发展提供了有利的条件。
新的变换技术和控制理论的不断发展,各种类型专用集成电路、数字信号处理器件的研制应用。
到90年代,己出现了数控精度达到0.05V的数控电源,功率密度达到每立方英寸50W的数控电源。
从组成上,数控电源可分成器件、主电路与控制等三部分。
目前在电力电子器件方面,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦。
数字化智能电源是针对传统电源的不足设计的,数字化能够减少生产过程中的不确定因素和人为参与的环节数,有效地解决电源模块中诸如可靠性、智能化和产品一致性等工程问题,极大地提高生产效率和产品的可维护性。
1.2.数控电源的应用范围
在家用电器和其他各类电子设备中,通常都需要电压稳定的直流电源供电。
但在实际生活中,都是由220V的交流电网供电。
这就需要通过变压、整流、滤波、稳压电路将交流电转换成稳定的直流电。
滤波器用于滤去整流输出电压中的纹波,一般传统电路由滤波扼流圈和电容器组成,若由晶体管滤波器来替代,则可缩小直流电源的体积,减轻其重量,且晶体管滤波直流电源不需直流稳压器就能用作家用电器的电源,这既降低了家用电器的成本,又缩小了其体积,使家用电器小型化。
传统的直流稳压电源通常采用电位器和波段开关来实现电压的调节,并由电压表指示电压值的大小.因此,电压的调整精度不高,读数欠直观,电位器也易磨损.而基于单片机控制的直流稳压电源能较好地解决以上传统稳压电源的不足。
从上世纪九十年代末起,随着对系统更高效率和更低功耗的需求,电信与数据通讯设备的技术更新推动电源行业中直流/直流电源转换器向更高灵活性和智能化方向发展。
整流系统由以前的分立元件和集成电路控制发展为微机控制,从而使直流电源智能化,基本实现了直流电源的无人值守 。
直流稳压电源是最常用的仪器设备,在科研及实验中都是必不可少的。
数控电源采用按键盘,可对输出电压进行设置,输出由单片机通过D/A,控制驱动模块输出一个稳定电压。
同时稳压方法采用单片机控制,单片机通过A/D采样输出电压,与设定值进行比较,若有偏差则调整输出,越限则输出报警信号并截流。
工作过程中,稳压电源的工作状态(输出电压、电流等各种工作状态)均由单片机输出驱动LCD显示,由键盘控制进行动态逻辑切换。
以单片机为核心的智能化高精度简易直流电源的设计,电源采用数字调节、输出精度高,特别适用于各种有较高精度要求的场合。
1.3.数控电源的优点
(1)易于采用先进的控制方法和智能控制策略,使电源模块的智能化程度更高,性能更完美。
(2)控制灵活,系统升级方便,甚至可以在线修改控制算法,而不必改动硬件线路。
(3)控制系统的可靠性提高,易于标准化,可以针对不同的系统(或不同型号的产品),采用统一的控制板,而只是对控制软件做一些调整即可。
第二章系统的设计要求和方案选择
2.1.设计要求
系统电压调节范围为0~12V,最大输出电流1A,具有过载和短路保护功能。
输出电压可用1602LCD液晶显示。
键盘设有6个键,复位键,步进增减1V两个键,步进增减0.1V两个键以及确认键。
复位键用于启动参数设定状态(5V),步进增减键用于设定参数数值,确认键用于确认输出设定值.
电源开机设定电压输出默认值为5V。
通过步进增减按键功能选择可在不同的设定参数之间切换,再按确认键进入设定电压输出状态。
若按复位键,则电压输出恢复5V。
系统设有自动识别功能,将不接受超出使用范围(0~12V)的设定值
2.2.方案论证与比较
2.2.1稳压电源的选择
方案一:
简单的并联型稳压电源
并联型稳压电源的调整元件与负载并联,因而具有极低的输出电阻,动态特性好,电路简单,并具有自动保护功能;负载短路时调整管截止,可靠性高,但效率低,尤其是在小电流时调整管需承受很大的电流,损耗过大。
方案二:
串联型稳压电源
并联稳压电源有效率低、输出电压调节范围小和稳定度不高这三个缺点。
而串联稳压电源可以避免这些缺点,同时串联稳压电源可以通过三端稳压实现,而且这类芯片内部都有过流和过热的保护电路,例如W117,其额定电流可达1.5A,输出电压的调节范围为1.2-37V,内部有过流和过热保护电路,而且价格也的相当便宜如图2.1所示,所以综合考虑采用方案二。
图2.1三端稳压器
2.2.2数字显示方案
方案一:
液晶显示器显示
利用单片机的软硬件资源实现高精度高速A/D转换,转换精度和转换速度可以通过软件来改变。
但是对软件部分要求非常高不易实现。
方案二:
数码管显示
数码管显示分为静态显示和动态显示两种,但是不管哪种显示都具有结构简单、易于实现等优点。
同时采用3位数码管完全可以满足本设计的要求。
在用8051控制的同时,可以简化软件程序,快速实现。
所以本设计中采用数码管显示。
第三章系统硬件设计
3.1.系统设计
由于本设计的输入为220V的交流电电压,所以必须先经过整流滤波电路然后经过三端稳压器的处理输出直流稳定的电压,当然在输出前还得有单片机的控制才可以输出。
在控制中单片机通过接受来自键盘的指令信号,并且通过数码显示器显示当前值,然后由单片机发出控制信号控制接口和驱动电路来控制稳压器的输出,通过数码显示器显示输出值。
具体的系统图如图3.1所示。
图3.1系统流程图
3.2.微控制器模块
3.2.18051单片机的性能
AT89S51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性为:
(1)与MCS-51兼容
(2)4K字节可编程闪烁存储器
(3)寿命:
1000写/擦循环
(4)数据保留时间:
10年
(5)全静态工作:
0Hz-24Hz
(6)三级程序存储器锁定
(7)128*8位内部RAM
(8)32可编程I/O线
(9)两个16位定时器/计数器
(10)5个中断源
(11)可编程串行通道
(12)低功耗的闲置和掉电模式
(13)片内振荡器和时钟电路
3.2.28051单片机的最小系统
对于一个完整的电子设计来讲,首要问题就是为整个系统提供电源供电模块,电源模块的稳定可靠是系统平稳运行的前提和基础。
51单片机虽然使用时间最早、应用范围最广,但是在实际使用过程中,一个和典型的问题就是相比其他系列的单片机,51单片机更容易受到干扰而出现程序跑飞的现象,克服这种现象出现的一个重要手段就是为单片机系统配置一个稳定可靠的电源供电模块。
在次最小系统中包含了复位电路、振荡电路和供电电路。
如图3.2所示。
图3.2单片机最小系统
3.3.电源模块
3.3.1单片机供电模块
为了满足单片机的正常工作,必须给其提供+5v的直流电源,所以设计一个可以使用usb的5v直流供电电路,具体电路如图3.3.1所示。
图3.3.1单片机供电图
3.3.2整流滤波电路和+5v供电模块
整流电路采用桥式电路,整流管采用普遍使用桥堆。
根据使用手册可知W7805的输入端电压为9V,W117的输入电压为25V,具体电路如图3.3.2所示。
图3.3.2辅助电源模块
3.4.W117电阻网络和继电器驱动电路
根据w117的基本功能,调压电阻网络可采用如图3.4.1所示电路。
这里的电阻网络采用分立元件组成的8为权电阻串联式网络,而开关采用舌簧式继电器的触点。
为了使W117正常工作,要求流过R1的电流不小于5mA,而R1两端的电压为恒定的1.25v,所以若取流过R1的电流为5mA,则R1=1.25V/5mA=250,为了满足调节单位为0.1v,故R=0.1/5mA=20,则可以求得该网络的其他电阻值。
图3.4.1W117的调压电阻网络和驱动电路
3.5.显示电路
在显示电路中分为静态显示和动态显示,由于本设计是要求采用三位数码管,而静态显示无法满足设计的需要,故在本设计中采用并联动态显示。
图3.5是动态显示的原理图,只要有一位接通过单片机的扫描让每位选线轮流选通,同时在段选线上送出该位要显示的段位码。
3.6.键盘电路
第四章软件
4.1.主程序
C语言程序如下:
#include
Unsignedchar
led[15]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f,0x39,0x52,0x64,0x37,0x0e}。
//9876543210
voidmain()//主函数
{
voidledout(unsignedcharATA,charadd,charj)。
voiddelays(unsignedchart)。
unsignedcharodata,key,temp。
unsignedintF,f=0x100。
//初始频率
charadd=0,j=1。
odata=155。
//电压初值为5v
j=1。
while
(1)
{
for(F=f。
F<0x110。
F++)
{
P3=0xff。
key=P3。
if(key!
=0xff)
{
unsignedchari。
for(i=0。
i<10。
i++)
{
ledout(odata,add,j)。
delays(10)。
ledout(odata,add,-j)。
delays(10)。
}
key=P3。
if(key==0xff)break。
for(i=0。
i<10。
i++)
{
ledout(odata,add,j)。
delays(10)。
ledout(odata,add,-j)。
delays(10)。
}
if(add==0)temp=odata。
//记录当前电压值
switch(key)
{
case0x7f:
if(add==0)
if(odata>57)
odata=odata-2。
//电压加0.1V
break。
case0xbf:
if(add==0)
if(odata<255)
odata=odata+2。
break。
case0xdf:
if(add==0)
{//三角波
f=0x100。
//1时为频率最高,最大允许256
odata=155。
add=1。
}
elseif(add==1)
{//方波
//f=f*200。
//频率跟随
f=0x100。
odata=55。
add=200。
}
elseif(add==-1)
{
//f=f*200。
f=0x100。
odata=55。
add=200。
}
elseif(add==200)
{//直流电压
add=0。
odata=temp。
//电压记忆恢复
}
else
{
add=0。
odata=temp。
}
break。
case0xef:
if(add!
=0)
{
f=f/2。
//频率频率加
if(f==1)
if(add==1)
f=0x100。
elsef=0x3200。
}
break。
}
}
if(odata==255)
add=-add。
odata=odata+add。
if(odata==55)
add=-add。
P0=odata。
//送数据
}
ledout(odata,add,j)。
//送显示
j=-j。
}
}
voidledout(unsignedcharATA,charadd,charj)
{
unsignedcharDH,DL,temp。
switch(add)
{
case0:
{
temp=((ATA-55)/2)-1。
//十进制转换
DH=temp/10。
DL=temp%10。
}break。
case1:
{
DH=11。
DL=12。
}break。
case-1:
{
DH=11。
DL=12。
}break。
case200:
{
DH=13。
DL=14。
}break。
case-200:
{
DH=13。
DL=14。
}break。
}
switch(j)
{
case1:
{
P1=led[DH]。
//送数码管高位显示
P1_7=1。
//动态显示
}break。
case-1:
P1=led[DL]。
//送数码管低位显示
break。
}
}
voiddelays(unsignedchart)
{
unsignedchars。
for(。
t>0。
t--)
for(s=0。
s<255。
s++)。
}
4.2.扫描键盘程序
C语言程序如下:
#include
voidkey_deal(void)
{unsignedcharKey_value。
//按键键值
P1|=0x07。
//P1.0~P1.2为输入端口
Key_value=P1&07。
//屏蔽P1口高5位,取键值
switch(Key_value){
case6:
Sub_S1()。
break。
//S1按键按下,执行对应子程序
case5:
Sub_S2()。
break。
//S2按键按下,执行对应子程序
case3:
Sub_S3()。
break。
//S3按键按下,执行对应子程序
default:
break。
}
}
4.3.显示驱动程序
C语言程序如下:
#include
#include
#include
codeuchardisp_seg[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71,0x40,0x00,0xff,0xf3}。
//0123456789abcdef-全灭,全亮,P.
//定义显示缓冲区(由定时中断程序自动扫描)
ucharDispBuf[8]。
//8位数码管显示的数字码(显示段码的偏移量)
ucharbdatakey_flag=0。
//定义键盘状态标志位
sbitkey_first_flag=key_flag^0。
sbitkey_delay_flag=key_flag^1。
sbitkey_valid_flag=key_flag^2。
ucharkey_value。
//key_value=0:
nokey,orkey_value=1-8standforkey1-key8
voidDispInit()。
//数码管扫描显示初始化
voidDispClear()。
//清除数码管的所有显示
voidDispP()。
//显示"P."
//在数码管位置x(0~7)处显示字符c(仅限十进制数字和减号)
//voidDispChar(unsignedcharx,unsignedchary)。
//显示指定位置x(0~7)处的小数点
//voidDispDotOn(unsignedcharx)。
/*
函数:
T1INTSVC()
功能:
定时器T0的中断服务函数
*/
voidT1INTSVC()interrupt1using1//interrupt3forT1
{
codeucharcom[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}。
staticucharkey_value_temp,n=0。
ucharkey_in,i。
TR0=0。
TH0=0xf8。
//0xfc66:
1msfor11.0592MHz,oxf8cd:
2ms,0xB800:
20ms,0x4C00:
50ms
TL0=0xcd。
P1=0xFF。
//暂停显示
if((DispBuf[n]&0x80)==0x80)//带小数点显示
{DispBuf[n]=DispBuf[n]&0x7f。
LED_OUT=~(disp_seg[DispBuf[n]]|0x80)。
//更新扫描数据
}
else
LED_OUT=~disp_seg[DispBuf[n]]。
//更新扫描数据
P1=~com[n]。
//重新显示
if(key_first_flag==0)
{
key_in=KEY_IN。
if(key_in!
=0xff)//初次检测到有键按下
{
for(i=0。
ii++)//n:
当前扫描键
key_in=key_in>>1。
if((key_in&0x01)==0x00)//若键按下,对应KEY_IN的输入口读入状态位为0
{
key_first_flag=1。
//置标志
key_value_temp=i。
//暂存
}
}
}
elseif(key_delay_flag==0&&n==key_value_temp)
{
key_in=KEY_IN。
for(i=0。
ii++)
key_in=key_in>>1。
if((key_in&0x01)==0x00)//经过一轮扫描后(8*2ms=16ms),第一次按下的键仍被按下
key_delay_flag=1。
}
elseif(key_delay_flag==1&&n==key_value_temp)
{
key_in=KEY_IN。
for(i=0。
ii++)
key_in=key_in>>1。
if((key_in&0x01)==0x01)//再经过一轮扫描后,按键已释放:
则为有效键
{
key_valid_flag=1。
key_value=key_value_temp+1。
}
}
n++。
n&=0x07。
-////////////////////////////-----------------------------------------------------------------------。
TR0=1。
}
/*
函数:
DispClear()
功能:
清除数码管的所有显示
*/
voidDispClear()
{
unsignedchari。
for(i=0。
i<8。
i++)
{
DispBuf=0x11。
//0x00。
}
}
/*
函数:
DispP()
功能:
显示"P.",即最高为显示"P.",其余显示灭
*/
voidDispP()
{
DispClear()。
DispBuf[7]=0x13。
//0xf3。
}
/*
函数:
DispChar()
功能:
在数码管上显示字符