基于Amega16单片机的数控直流稳压电源设计论文.docx
《基于Amega16单片机的数控直流稳压电源设计论文.docx》由会员分享,可在线阅读,更多相关《基于Amega16单片机的数控直流稳压电源设计论文.docx(16页珍藏版)》请在冰豆网上搜索。
基于Amega16单片机的数控直流稳压电源设计论文
基于Amega16单片机的数控直流稳压电源设计论文
智能控制设计大赛
数控直流稳压电源
摘要
本系统以Amega16单片机为核心,由D/A数字模拟转换模块、按键、LED串口显示模块等模块组成一个数控电源。
该系统实现了,输出电压3-13V可调,步进值为0.05mv,纹波不大于10mv,额定输出电流0.5A,由单片机自身提供的矩阵键盘作为输入,每按一次实现+0.05mv或-0.05mv。
还有一些按键用以实现电平快速切换,使能够在常用电平之间实现快速跳跃。
输入模块的按键按下之后,对单片机就有了一个输入,单片机将输入的数字一方面给显示模块,让它们在数码管中显示出来;另一部分输给DAC0832,让它转化为模拟量电流输出,通过运算放大器将这模拟量转化为相应的电压,这电压经过放大后控制LM317的控制端,从而实现输出电压的控制。
关键字:
Amega16单片机、数控电源、LM317、AD7226、三端稳压管
数控直流稳压电源论文
设计任务与要求
一、设计任务
设计并制作一个直流可调稳压电源。
二、设计要求
1、基本要求:
1)当输入交流电压为220v±10%时,输出电压在3-13v可调;
2)额定电流为0.5A,且纹波不大于10mV;
3)使用按键设定电压,同时具有常用电平快速切换功能(3v、5v、6v、9v、12v),设定后按键可锁定,防止误触;
4)显示设定电压和测量电压,显示精度为0.01v。
2、扩展要求:
1)输出电压在0-13v连续可调;
2)额定电流为1A,且纹波不大于1mV;
3)掉电后可记忆上次的设定值;
4)两级过流保护功能,当电流超过额定值的20%达5秒时,电路作断开操作;当电流超过额定值的50%时,电路立即断开。
具有光提示(如LED);
5)其他创新。
三、说明
禁止直接使用220v直接电阻分压的作法,注意用电安全。
引言
数字化智能电源模块是针对传统智能电源模块的不足提出的,数字化能够减少生产过程中的不确定因素和人为参与的环节数,有效地解决电源模块中诸如可靠性、智能化和产品一致性等工程问题,极大地提高生产效率和产品的可维护性。
电源采用数字控制,具有以下明显优点:
1)易于采用先进的控制方法和智能控制策略,使电源模块的智能化程度更高,性能更完美。
2)控制灵活,系统升级方便,甚至可以在线修改控制算法,而不必改动硬件线路。
3)控制系统的可靠性提高,易于标准化,可以针对不同的系统(或不同型号的产品),采用统一的控制板,而只是对控制软件做一些调整即可。
4)系统维护方便,一旦出现故障,可以很方便地通过RS232接口或RS485接口或USB接口进行调试,故障查询,历史记录查询,故障诊断,软件修复,甚至控制参数的在线修改、调试;也可以通过MODEM远程操作。
5)系统的一致性好,成本低,生产制造方便。
由于控制软件不像模拟器件那样存在差异,所以,其一致性很好。
由于采用软件控制,控制板的体积将大大减小,生产成本下降。
6)易组成高可靠性的多模块逆变电源并联运行系统。
为了得到高性能的并联运行逆变电源系统,每个并联运行的逆变电源单元模块都采用全数字化控制,易于在模块之间更好地进行均流控制和通讯或者在模块中实现复杂的均流控制算法(不需要通讯),从而实现高可靠性、高冗余度的逆变电源并联运行系统。
一、方案论证与比较
分析题意,根据设计要求,画出基本原理图如图一
图一
1、控制器部分:
方案一:
采用AT89S52单片机作为主控芯片。
优点:
AT89S52作为一种比较成熟的单片机型号,广范应用于各领域技术比较熟练,价格相对便宜。
缺点:
其内部集成资源偏少,功能不够强大,中断源和定时器较少,且没有PWM可调占空比波形输出。
方案二:
采用Amega16单片机作为主控芯片。
优点:
AVR是51的升级版。
Amega16单片机功能强、高速度是其主要的优点,内部集成了较多的中断源和定时器资源及EEPROM的优点,多种模式的PWM波形输出,很好地满足了本系统设计的要求。
缺点:
价格较AT89S52单片机高。
考虑到以上两种方案的优缺点,因本系统对单片机内部硬件资源的要求比较高,而且我们有现成的Amega16开发板,所以不存在成本的问题。
2、显示部分:
方案一:
采用普通数码管显示,优点:
价格便宜,而且可以用单片机内部的数码管显示,政绩电路比较清晰
方案二:
采用LCD1602液晶显示,优点:
显示清楚、且管脚不多,容易控制,缺点:
价格较贵
由于我们只需显示3—13V,精度为0.01mv,单片机自带的数码管就已经够用,所以我们采取方案一
3、按键部分
方案一、采用一般的电平按钮,优点是控制比较简单,编程不用考虑按键部分
方案二、采用4*4矩阵键盘,优点:
利用8个IO口得到16个按键,可使操作界面变得简单,操作也方便;缺点:
软件处理比独立按键复杂。
通过比较,由于这也是我们熟悉单片机的一次过程,所以我们选择方案二。
4、可调稳压芯片
三端可调稳压芯片有多种,其中最常见的有LM317、LM337、LM318、LM196等几种,LM317用于正电压调整,LM337用于负电压调整。
本系统的输出电压范围2~+15.0V为正电压输出,固排除LM337,对于LM317又有如下各种型号,它们的输出电流与电压的对照表如表1:
表1常见稳压输出电流和电压范围
芯片型号
输出电流(A)
输出电压(V)
LM317L
0.1
1.25~37
LM317T
0.5
1.25~37
LM317
1.5
1.25~37
LM318
5
1.25~37
LM196
10
1.25~15
根据设计要求输出电压范围2~+15.0V,输出电流500mA,以上有多种型都可以满足要求,再根据成本和现有材料,我选择了LM317T三端可调稳压芯片。
5、D/A数字模拟转换模块
方案一:
采用MX7541是高速高精度12位数字/模拟转换器芯片,功耗低,而且其线性失真可低达0.012%,特别适合于精密模拟数据的获得和控制。
方案二:
采用AD7226,AD7226是一种常用的8位的数字/模拟转换芯片。
出于价格及实用性方面的考虑,决定选择方案二.
二、系统具体设计及实现
1、系统总框图
图一所示的即为系统总体结构
本数控电源以Amega16为核心,辅以AD7226,LM317等芯片,较好的实现电压信号的数字化输出、
2、键盘模块(4*4键盘)
在本系统中,针对用户调整各项参数时的需要,我们采用了4*4键盘,只占用8个IO口(P1口)就实现了16个按键,使操作界面更加人性化,操作过程更加简单、方便。
键盘原理如图二所示。
图二
3、D/A转换部分
由于我们要实现的是3—13V可调,步进值为0.05mv,所以一般的8位的D/A转化模块已经够用,根据我们自己手头已有的材料,我们就选用了AD7226作为。
它的管脚排列图及功能表如下图三、图四分别所示:
图三图四
三、软件设计部分
软件实现的主要功能是,键盘对单片机输入数据,单片机按照事先设置好的程序对数据进行处理后,将数据发送给D/A转换模块进行处理后的信号通过稳压直流源部分输出,还有取样进行显示。
源程序见附录一
整机电路图见附录二
附录一:
源程序
//必须包含这2个必要的头文件
#include
#include
/*****************数码管接口定义*********************/
//定义接口
#defineSCKPC7
#defineRCKPC6
#defineOEPC5
#defineSERPC4
#defineSMG3PC3
#defineSMG2PC2
#defineSMG1PC1
#defineSMG0PC0
#defineIO_DDRDDRC
#defineIO_PORTPORTC
//定义接口的高、低电平
#defineSCK_HIO_PORT|=1<#defineSCK_LIO_PORT&=~(1<#defineRCK_HIO_PORT|=1<#defineRCK_LIO_PORT&=~(1<#defineOE_HIO_PORT|=1<#defineOE_LIO_PORT&=~(1<#defineSER_HIO_PORT|=1<#defineSER_LIO_PORT&=~(1<#defineSMG3_HIO_PORT|=1<#defineSMG3_LIO_PORT&=~(1<#defineSMG2_HIO_PORT|=1<#defineSMG2_LIO_PORT&=~(1<#defineSMG1_HIO_PORT|=1<#defineSMG1_LIO_PORT&=~(1<#defineSMG0_HIO_PORT|=1<#defineSMG0_LIO_PORT&=~(1</*************端口说明及宏定义**************/
//PB为键盘所在端口
#definekey_DDRDDRB
#definekey_PORTPORTB
#definekey_PINPINB
//*****************************************//
//**将两个pragma中间的数据放到程序寄存器中即放到flash中**//
//**以免占用内存即sram的空间**//
#pragmadata:
code
constunsignedchartable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,//数字字模
0x01};//小数点位
#pragmadata:
data
//************************************************************************//
voiddelay_ms(unsignedintt)//毫秒级延时函数
{
while(t--)
{
delay_us(1000);//执行时间大约1ms
}
}
voiddelay_us(unsignedintt)//微秒级延时函数
{
while(t--)
{//执行一周大约1us
asm("nop");//嵌入汇编,表示"空操作",
asm("nop");//不执行任何指令,消耗时间,
asm("nop");//起到延时的作用
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
//系统初始化
voidSystem_Init()
{
IO_DDR=0xff;
}
//显示函数
voidshow(unsignedintdata)
{
unsignedchartemp;
unsignedcharnum;
unsignedchari=0;
for(i=0;i<4;i++)
{
SMG0_L;SMG1_L;SMG2_L;SMG3_L;//关闭所有位选
switch(i)
{
case0:
//取出data的千位的数字,并位选
{
num=data/1000;
SMG0_H;
}break;
case1:
//取出百位
{
num=data/100%10;
SMG1_H;
}break;
case2:
//取出十位
{
num=data/10%10;
SMG2_H;
}break;
case3:
//取出个位
{
num=data%10;
SMG3_H;
}break;
default:
break;
}
for(temp=0;temp<8;temp++)//共移入8位数据,恰好驱动数码管
{
if(table[num]&(1<SER_H;//根据字模的1置位数据端
else
SER_L;//字模的0置零数据端
SCK_H;
SCK_L;//高电平脉冲,上升沿数据移入
}
RCK_H;
RCK_L;//高电平脉冲,数据输出
OE_L;//使能输出端口
delay_ms
(1);//显示时间2ms
OE_H;//关闭显示,如果不关闭,显示数码间有"重影"
}
}
//扫描键盘,获取键值
charkey=0;//全局变量key,保存键值,无按键为0,方便不同函数进行访问
voidget_key()
{
key_PORT=0x0f;//高四位输出低电平,低四位为带上拉输入
key_DDR=0xf0;//高四位为输出,低四位为输入,重要!
增强拉电流能力
if(!
key&&key_PIN!
=0x0f)//如果key=0,即按键已经响应,判断是否有键按下
{
delay_ms(10);//延时后再次判断,消除按键抖动的影响
if(key_PIN!
=0x0f)//确实有键按下
{
switch(key_PIN)
{
case0x0e:
key=1;break;//第一位被拉低
case0x0d:
key=2;break;//第二位被拉低
case0x0b:
key=3;break;//第三位被拉低
case0x07:
key=4;break;//第四位被拉低
}
key_PORT=0xf0;//令低四位输出低电平高四位为带上拉输入
key_DDR=0x0f;//令低四位为输出高四位为输入
asm("nop");//延时一个机器周期,重要!
这个时间为key_PIN的建立时间,如省略,程序出错!
switch(key_PIN)
{
case0xe0:
key+=0;break;//第一位被拉低
case0xd0:
key+=4;break;//第二位被拉低
case0xb0:
key+=8;break;//第三位被拉低
case0x70:
key+=12;break;//第四位被拉低
default:
key=0;//该情况属于偶然错误,返回0
}
while(key_PIN!
=0xf0);//等待松开按键时才退出,这里根据要求适当选择,也可以在此进行长按判断
}
}
}
//主函数
unsignedintad=100;
voidmain()
{
unsignedinti=0;
System_Init();//系统初始化函数
while
(1)
{
get_key();
switch(key)
{
case1:
ad=255;break;
case2:
ad=128;break;
case3:
ad=64;break;
case4:
ad=0;break;
default:
ad=ad;break;
}
key=0;
DDRA=0xff;
PORTA=ad;
DDRD=0xff;
PORTD&=0xfe;
PORTD|=0x01;
delay_ms
(1);
PORTD&=0xfe;
/*if(key)//如果key不为0,说明有按键,进行响应
{
i=100;
while(i--)
show(key);//显示键值,扫描显示100次,时间约1s
key=0;//按键响应结束,键值归零
}*/
show(ad);
}
}
附录二整机电路图