资源描述
目录
一、前言 4
二、系统功能 5
三、方案论证 6
3.1 稳压电源的分类 6
3.2 稳压电源部分方案 6
3.3 三端集成稳压芯片 8
3.4 数字显示部分 9
四、系统硬件设计 9
1、电路原理 9
2、硬件模块分析 10
2.1 ATmage16单片机模块 9
2.2 L6203驱动模块 12
2.3 5V系统电源模块 14
2.4 1602液晶显示模块 14
2.5输出电压采集反馈电路模块 15
五、系统的软件设计 15
1 程序设计 15
2.程序流程图 16
六.结束语 16
七.参考文献 17
附录1(电路原理图) 18
附录2(电子万年历程序) 19
摘要
将单片机数字控制技术,有机地融入直流稳压电源的设计中,设计出一款数字化通用直流稳压电源。该电源具有液晶显示、数字输入调压、电压调节精度高的特点。通过软件编程,易于实现功能的扩展。
AVR 系列的单片机不仅具有良好的集成性能, 而且都具备在线编程接口, 其中的Mega 系列还具备JTAG 仿真和下载功能; 含有片内看门狗电路、片内程序Flash、同步串行接口SPI; 多数AVR 单片机还内嵌了A/D 转换器、EEPROM
、模拟比较器、PWM 定时计数器等多种功能; AVR 单片机的I/O 接口具有很强的驱动能力, 灌入电流可直接驱动继电器、LCD 等元件, 从而省去驱动电路, 节约系统成本。
关键词:直流稳压电源;AVR单片机;液晶显示
一、前言
电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。电力电子技术是电能的最佳应用技术之一。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。随着计算机和通讯技术发展而来的现代信息技术革命,给电力电子技术提供了广阔的发展前景,同时也给电源提出了更高的要求。随着数控电源在电子装置中的普遍使用,普通电源在工作时产生的误差,会影响整个系统的精确度。电源在使用时会造成很多不良后果,世界各国纷纷对电源产品提出了不同要求并制定了一系列的产品精度标准。只有满足产品标准,才能够进入市场。随着经济全球化的发展,满足国际标准的产品才能获得进出的通行证。数控电源是从80年代才真正的发展起来的,期间系统的电力电子理论开始建立。这些理论为其后来的发展提供了一个良好的基础。在以后的一段时间里,数控电源技术有了长足的发展。但其产品存在数控程度达不到要求、分辨率不高、功率密度比较低、可靠性较差的缺点。因此数控电源主要的发展方向,是针对上述缺点不断加以改善。单片机技术及电压转换模块的出现为精确数控电源的发展提供了有利的条件。新的变换技术和控制理论的不断发展,各种类型专用集成电路、数字信号处理器件的研制应用,到90年代,己出现了数控精度达到0.05V的数控电源,功率密度达到每立方英寸50W的数控电源。从组成上,数控电源可分成器件、主电路与控制等三部分。目前在电力电子器件方面,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦。数字化智能电源是针对传统电源的不足设计的,数字化能够减少生产过程中的不确定因素和人为参与的环节数,有效地解决电源模块中诸如可靠性、智能化和产品一致性等工程问题,极大地提高生产效率和产品的可维护性。
在家用电器和其他各类电子设备中,通常都需要电压稳定的直流电源供电。但在实际生活中,都是由220V 的交流电网供电。这就需要通过变压、整流、滤波、稳压电路将交流电转换成稳定的直流电。滤波器用于滤去整流输出电压中的纹波,一般传统电路由滤波扼流圈和电容器组成,若由晶体管滤波器来替代,则可缩小直流电源的体积,减轻其重量,且晶体管滤波直流电源不需直流稳压器就能用作家用电器的电源,这既降低了家用电器的成本,又缩小了其体积,使家用电器小型化。传统的直流稳压电源通常采用电位器和波段开关来实现电压的调节,并由电压表指示电压值的大小. 因此,电压的调整精度不高,读数欠直观,电位器也易磨损.而基于单片机控制的直流稳压电源能较好地解决以上传统稳压电源的不足。
从上世纪九十年代末起,随着对系统更高效率和更低功耗的需求,电信与数据通讯设备的技术更新推动电源行业中直流/直流电源转换器向更高灵活性和智能化方向发展。整流系统由以前的分立元件和集成电路控制发展为微机控制, 从而使直流电源智能化, 基本实现了直流电源的无人值守 。直流稳压电源是最常用的仪器设备, 在科研及实验中都是必不可少的。数控电源采用按键盘,可对输出电压进行设置, 输出由单片机通过D/A,控制驱动模块输出一个稳定电压。同时稳压方法采用单片机控制, 单片机通过A/D 采样输出电压, 与设定值进行比较, 若有偏差则调整输出, 越限则输出报警信号并截流。工作过程中, 稳压电源的工作状态(输出电压、电流等各种工作状态) 均由单片机输出驱动LCD显示, 由键盘控制进行动态逻辑切换。以单片机为核心的智能化高精度简易直流电源的设计,电源采用数字调节、输出精度高, 特别适用于各种有较高精度要求的场合。
电源采用数字控制,具有以下明显优点:
1)易于采用先进的控制方法和智能控制策略,使电源模块的智能化程度更高,性能更完美。
2)控制灵活,系统升级方便,甚至可以在线修改控制算法,而不必改动硬件线路。
3)控制系统的可靠性提高,易于标准化,可以针对不同的系统(或不同型号的产品),采用统一的控制板,而只是对控制软件做一些调整即可。
二、系统功能
系统电压调节范围为0~12V,最大输出电流1A,具有过载和短路保护功能。输出电压可用1602LCD液晶显示。键盘设有6个键,复位键,步进增减1V两个键,步进增减0.1V两个键以及确认键。复位键用于启动参数设定状态(5V),步进增减键用于设定参数数值,确认键用于确认输出设定值.
电源开机设定电压输出默认值为5V。通过步进增减按键功能选择可在不同的设定参数之间切换,再按确认键进入设定电压输出状态。若按复位键,则电压输出恢复5V。系统设有自动识别功能,将不接受超出使用范围(0~12V)的设定值。
三、方案论证
3.1 稳压电源的分类
稳压电源的分类方法繁多,按输出电源的类型分有直流稳压电源和交流稳压电源;按稳压电路与负载的连接方式分有串联稳压电源和并联稳压电源;按调整管的工作状态分有线性稳压电源和开关稳压电源;按电路类型分有简单稳压电源和反馈型稳压电源,等等。如此繁多的分类方式会让我们摸不着头脑,不知道从哪里入手。我们必须弄清楚各个类别的特点,才能从中选出最佳方案。
3.2 稳压电源设计方案
方案:输出可调的开关电源
开关电源的功能元件工作在开关状态,因而效率高,输出功率大;且容易实现短路保护与过流保护,只是电路在低输出电压时开关频率低,纹波大,稳定度差。
综合考虑效率,输出功率,输入输出电压,负载调整率, 本设计选用方案三,要求较低,较易实现.对于效率和纹波的要求可以通过仔细调整磁性元件的参数(L,Q,M等)使其工作在最佳状态。我们在选择方案的时候考虑到电路要简单,元件要容易找,所以我们选择了上述的方案中的第三个方案。
稳压电路部分可以采用三极管等分立元件来实现,也可以采用集成三端集成稳压芯片。从性价比来说,采用三端集成稳压芯片来实现要好很多,现在的稳压芯片功能强大,且价格低廉,很适合我们此次的设计。
3.3 三端集成稳压芯片
方案:采用LM317可调式三端稳压器电源
LM317可调式三端稳压器电源能够连续输出可调的直流电压.
不过它只能连续调正电压,稳压器内部含有过流,过热保护电路;由一个电阻(R)和一个可变电位器(RP)组成电压输出调节电路,输出电压为:Vo=1.25(1+RP/R).
3.4 数字显示部分
方案:用Atmage16实现模数转换
利用单片机的软硬件资源实现高精度高速A/D转换,转换精度和转换速度还可以通过软件来改变,价格也低廉。不过对软件部分要求较高。
四、系统硬件设计
1、电路原理
电路系统结构如图1所示,系统选用Atmage16单片机为控制核心,外部扩展1602驱动芯片用以实现电压输出功能,同时1602液晶显示相应的输出电压值。单片机计算设定值与A/D转换采样反馈值的偏差以及偏差的变化率,得出相应的输出值,由D/A转换变换为模拟量去驱动电压输出控制电路,从而使电压稳定在设定值。
键盘
单片机
驱动芯片
负载
显示器
电 源
图1 电路系统结构图
2、硬件模块分析
2.1 ATmage16单片机模块
1)ATmage16的简介
ATmega16是AVR系列单片机中比较典型的芯片,其主要特点有:
(1)采用先进RISC结构的AVR内核(2)片内含有较大容量的非易失性的程序和数据存储器(3)片内含JTAG接口(4)宽电压、高速度、低功耗(5)片内含上电复位电路以及可编程的掉电检测复位电路BOD;片内含有1M/2M/4M/8M,经过标定的、可校正的RC振荡器,可作为系统时钟使用;多达21个各种类型的内外部中断源;有6种休眠模式支持省电方式工作等等。
2)ATmage16的引脚分析
其外部引脚封装如图2所示
图2 ATmage16 外部引脚与封装示意图
其中,各个引脚的功能如下:
(1) 电源、系统晶振、芯片复位引脚
Vcc: 芯片供电(片内数字电路电源)输入引脚,使用时连接到电源正极。
AVcc:为端口A和片内ADC模拟电路电源输入引脚。不使用ADC时,直接连接到电源正极;使用ADC时,应通过一个低通电源滤波器与Vcc连接。
AREF:使用ADC时,可作为外部ADC参考源的输入引脚。
GND: 芯片接地引脚,使用时接地。
XTAL2:片内反相振荡放大器的输出端。
XTAL1:片内反相振荡放大器和内部时钟操作电路的输入端。
RESET:RESET为芯片复位输入引脚。在该引脚上施加(拉低)一个最小脉冲宽度为1.5us的低电平,将引起芯片的硬件复位(外部复位)。
(2) 32根I/O引脚,分成PA、PB、PC和PD四个8位端口,他们全部是可编程控制的双(多)功能复用的I/O引脚(口)。
四个端口的第一功能是通用的双向数字输入/输出(I/O)口,其中每一位都可以由指令设置为独立的输入口,或输出口。当I/O设置为输入时,引脚内部还配置有上拉电阻,这个内部的上拉电阻可通过编程设置为上拉有效或上拉无效。
如果AVR的I/O口设置为输出方式工作,当其输出高电平时,能够输出20mA的电流,而当其输出低电平时,可以吸收40mA的电流。因此AVR的I/O口驱动能力非常强,能够直接驱动LED发光二极管、数码管等。而早期单片机I/O口的驱动能力只有5mA,驱动LED时,还需要增加外部的驱动电路和器件。
芯片Reset复位后,所有I/O口的缺省状态为输入方式,上拉电阻无效,即I/O为输入高阻的三态状态。
3)ATmage16在电路中的主控作用
应用ATmage16 主要完成PWM 波的输出及控制功能。它可以先产生一定脉宽的PWM 波,作为L1603 驱动电路输入信号,然后根据所需要的基准电压与检测到的输出电压的比较,调整脉宽,即改变占空比,最终实现高性能可调直流稳压。
图3内部晶体振荡器外接电路
2.2 L6203驱动模块
L6203驱动模块就是将5V的输入电压变成Vin的电压24V,一方面提高电压,一方面提高电流。电源驱动芯片的选择,由于器材的限制以及使用CMOS管需要的驱动需要注意比较多的前级推动,如果直接使用电机驱动芯片L6203,其价格实惠,电路简单而且效果非常好。
图4 L6203驱动模块
图5 L6203的外观图
2.3 5V系统电源模块
单片机要工作需要有5V电源输入,本设计采用7805稳压电源电路
图6 5V系统电源模块
2.4 1602液晶显示模块
如果采用数码管显示,其价格便宜,但是占用端口较多,功耗大、显示不功能不全。而用1602液晶显示,则占用端口少,显示功能较全面,驱动电流小。所以选择选择1602液晶显示。
图7 给出1602 字符液晶作为信号显示部分
图7 1602液晶显示模块
2.5 输出电压采集反馈电路模块
图8 输出电压采集反馈电路
五、系统的软件设计
1 程序设计
数控直流稳压电源的程序主要包括3个方面的内容:一是单片机从按键中读取数据,而后和原有的输出电压进行比较;二是利用按键进行输出的调整;三是从单片机中读取数据传输到1602液晶显示器,进而显示输出电压值。
2.程序流程图如图9所示
图9程序流程图
六.结束语
利用单片机对直流稳压电源进行控制,改善了电源的性能,使用方便灵活,且成本较低。另一方面,根据对电源的新要求,控制系统在软件上还可进一步改进,以扩展其功能,而并不需要增加硬件开销,从而提高了电源的性能价格比。
七.参考文献
[1]王兆安,黄俊.电力电子技术[M].北京:机械工业出版社,2005
[2]李文元.高精度工业用可调直流电源的设计和制造[R].兰州理工大学,2000.
[3]张毅刚.单片机原理及应用I-M].北京:高等教育出版社,2004
[4]E33范立南.单片微型计算机控制系统设计[M].北京;人民邮电出版社,2004
[5]王水平,史俊杰,田庆安.开关稳压电源—原理、设计及实用电路(修订版)[M].西安:西安电子科技大学出版社,2005
[6]潘永雄.新编单片机原理与应用[M].西安:西安电子科技大学出版社,2003
附录1(电路原理图)
附录2(数控直流稳压电源程序)
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7a Evaluation
Automatic Program Generator
?Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
Project :
Version :
Date : 2010-5-20
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include "1602.c"
#include "adc.c"
/*------------------------------------------------------
全局定义
-----------------------------------------------------*/
#define choice 0x7e
#define up PIND.6
#define down PIND.0
#define right PIND.2
#define left PIND.1
#define ok PIND.3
#define Enable PORTD.7
/**********************定义界面内容*******/
flash uchar set1[]="Plese set Volt: ";
//flash uchar shu[]="0123456789.";
flash uchar putvolt[]=" Volt: ";
flash uchar putamp[]=" Amp: ";
flash uchar start[]="Starting";
//flash uchar error[]="error";
uint volt=50;
/*------------------------------------------------------
功能:进入系统的初始化函数
-----------------------------------------------------*/
void intosys()
{
uchar i;
lcd_init();
write_com(lcd_clr);
write_com(0x80);
delay_ms(5);
for(i=0;i<8;i++)
{
write_data(start[i]); //启动开机界面
delay_ms(2); //延时写入,可以防止液晶处于忙状态
}
write_com(0x80+0x40);
delay_ms(5);
for(i=0;i<16;i++)
{
write_data('-');
delay_ms(100);
}
}
/*------------------------------------------------------
用户界面一,设置界面
-----------------------------------------------------*/
void user_1()
{
uchar i;
write_com(lcd_clr);
write_com(0x80);
delay_ms(5);
for(i=0;i<16;i++)
{
write_data(putvolt[i]);
delay_ms(5);
}
write_com(0x80+0x40);
delay_ms(5);
for(i=0;i<16;i++)
{
write_data(putamp[i]);
delay_ms(5);
}
};
/*------------------------------------------------------
用户界面2,输出状态下
-----------------------------------------------------*/
void user_2()
{
uchar i;
write_com(lcd_clr);
write_com(0x80+1);
delay_ms(5);
for(i=0;i<16;i++)
{
write_data(putvolt[i]);
delay_ms(3);
}
write_com(0x80+0x40);
delay_ms(5);
for(i=0;i<16;i++)
{
write_data(set1[i]);
delay_ms(3);
}
}
/*------------------------------------------------------
显示数据函数,将数据分开
-----------------------------------------------------*/
void show_data(uint data)
{
char ch1,ch2,ch3;
ch1=data/100;
ch2=data/10%10;
ch3=data%10;
if(ch1==0)
{
write_data(0x30+ch2);
delay_ms(4);
write_data('.');
delay_ms(4);
write_data(0x30+ch3);
delay_ms(4);
write_data(0x20);
}
else
{
write_data(0x30+ch1);
delay_ms(4);
write_data(0x30+ch2);
delay_ms(4);
write_data('.');
delay_ms(4);
write_data(0x30+ch3);
delay_ms(4);
}
}
/*------------------------------------------------------
显示电压值
-----------------------------------------------------*/
void show_volt(uint data)
{
write_com(0x80+6);
show_data( data);
}
/*------------------------------------------------------
显示电流值
-----------------------------------------------------*/
void show_amp(uint data)
{
char ch1,ch2,ch3,ch4;
write_com(0x80+0x45);
ch1=data/1000;
ch2=data/100%10;
ch3=data/10%10;
ch4=data%10;
write_data(0x30+ch1);
delay_ms(4);
write_data('.');
delay_ms(4);
write_data(0x30+ch2);
delay_ms(4);
write_data(0x30+ch3);
delay_ms(4);
write_data(0x30+ch4);
delay_ms(4);
}
/*------------------------------------------------------
读取电流值
-----------------------------------------------------*/
uint Read_Amp()
{
unsigned int freeback_amp,ampdata[],temp;
uchar chi,i,j;
for(chi=0;chi<50;chi++)
{
ampdata[chi]=mega16_ad(0)*2.6/10;
//delay_ms(2);
}
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(ampdata[i]<ampdata[j])
{
temp=ampdata[i];
ampdata[i]=ampdata[j];
ampdata[j]=temp;
}
}
}
freeback_amp=(ampdata[24]+ampdata[25]+ampdata[26])/3;
return freeback_amp;
}
/*------------------------------------------------------
读取输出电压
-----------------------------------------------------*/
uint Read_Output_Volt()
{
unsigned int freeback_volt,data[],temp;
uchar chi,i,j;
for(chi=0;chi<30;chi++)
{
data[chi]=mega16_ad(1)*0.15;
//delay_ms(2);
}
for(i=0;i<30;i++)
{
for(j=0;j<30;j++)
{
if(data[i]<data[j])
{
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
}
freeback_volt=(data[14]+data[15]+data[16])/3;
return freeback_volt;
}
/*------------------------------------------------------
输出与设置比较程序
-----------------------------------------------------*/
void cheak()
{
show_volt(Read_Output_Volt());
while(Read_Output_Volt()>volt)
{
OCR1B--;
delay_ms(3);
}
while(Read_Output_Volt()<volt)
{
OCR1B++;
delay_ms(3);
}
show_amp(Read_Amp());
}
/*------------------------------------------------------
电压设置1
-----------------------------------------------------*/
void user_set1()
{
user_2();
Enable=0;
while(ok)
{
SREG.0=0;
if(up==0)
{
volt++;
delay_ms(50);
}
else if(down==0)
{
volt--;
delay_ms(50);
}
else if(right==0)
volt=volt-10;
else if(left==0)
volt=volt+10;
if(SREG.0==1)
{
volt=0;
}
if(volt>120)
{
volt=120;
}
delay_ms(100);
show_volt(volt);
}
OCR1B=1.7*volt;
Enable=1;
}
/*------------------------------------------------------
电压设置2,输出不关闭的情况调节电压
-----------------------------------------------------*/
void user_set2()
{
while(1)
{
while(ok) /*当确定键没有被按下时使用up/down按键实时调节输出电压
并且可以查看电流*/
{ SREG.0=0;
if(up==0)
{ volt++; }
else if(down==0)
{ volt--; }
else if(right==0)
{volt=volt-10;}
else if(left==0)
{ volt=volt+10; }
if(SREG.0==1)
{
volt=0;
//OCR1B=1.7*volt;
}
if(volt>120)
{
volt=120;
//OCR1B=1.7*volt;
}
delay_ms(100);
//show_volt(volt);
Enable=1;
cheak();
};
//delay_ms(20);
while(~ok);
user_set1();
user_1();
}
}
/*------------------------------------------------------
主函数
-----------------------------------------------------*/
void main()
{
DDRD=0xB0;
PORTD=0X4F;
TCCR1A=0Xa1; //8位快速PWM,OC1A为普通用途,OC1B为PWM
TCCR1B=0X09; //无预分频位,fpwm=8000000/256=31.5k
delay_ms(100);
intosys();
//Enable=1;
user_set1();
user_1();
user_set2();
}
展开阅读全文