A题程控电压变换器 实验报告.docx
《A题程控电压变换器 实验报告.docx》由会员分享,可在线阅读,更多相关《A题程控电压变换器 实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
A题程控电压变换器实验报告
程控电压变换器
实验报告
一、系统方案选择和论证
1、课题任务及要求
1.1、任务
设计并制作一个升压型DC/DC电压变换器,输出电压可程控。
1.2、要求
基本要求
1)输入电压:
6V±0.2V;输出电压:
8V~10.0V;最大负载电流:
1A;
2)输出电压可设置、可步进,步长0.2V;
3)输出电压误差≤50mV;输出电压纹波:
≤50mV;
4)显示输出电压值。
发挥部分
1)电源效率≥75%(含控制电路);
2)具有过流保护功能,当输出电流≥1.2A时,自动切断电压输出;
3)具有输出记忆功能,当切断电源供电重新开启后,输出电压保持不变;
4)其它创新功能
2、系统方案选择与描述
2.1、.DC-DC主回路拓扑
适合本系统的DC-DC拓扑结构为隔离型升压式DC-DC变换器LM2577,LM2577是NationalSemicnductor公司生产的一种典型的升压式集成开关电源调整器,广泛应用在许多电子产品的电源电路中。
它具有外接元器件少、输入直流电源电压范围宽(3.5~40V)、输出开关电流达到3A、内部有固定频率(52kHz)振荡器、电流反馈型工作方式、有软启动、电流限制、欠压锁定和热关闭保护等功能。
可以接成简单升压、隔离和多输出电压的开关电源电路。
它的封装有5引脚的TO-220形式与4引脚的TO-3P形式等,输出直流电压有12V、15V和可调(ADJ)。
图1 LM2577-ADJ典型电路
TO-220封装形式的LM2577-ADJ典型DC/DC升压形式的直流开关稳压电源电路图如图1所示。
它的内部有1.23V和2.5V能隙基准电压单元、52kHz固定频率锯齿波振荡器、RS触发器、晶体管驱动电路和峰值电流可以达到3A的晶体管,还包括峰值电流采样电阻、采样电流放大器、采样电压放大器,共同组成电压、电流误差反馈系统,以达到脉冲宽度调制(PWM)工作方式。
另外,还有软启动、欠压锁定、过流限制及热关断等单元。
如图1所示的直流开关稳压电源只需要外接八个元器件就可以组成一个Uo>Ui的直接升压电源。
其中反馈取样电阻R1、R2的阻值可以确定直流输出端的电压值。
例如当输出直流电压为+10V时,R1的阻值为11kΩ,R2为2kΩ。
2.2、x9c102数字电位器
要实现对输出电压的控制,只需要改变DC/DC变换器LM2577-ADJ电路中R1电阻的阻值即可实现,这里我们采用x9c102数字电位器,可通过MCU对它的输出电阻阻值进行控制。
X9C102/103/104/503是一个包含有99个电阻单元的电阻阵列.在每个单元之间和二个端点都有可以被滑动单元访问的抽头点.滑动单元的位置由CS,D/U和INC三个输入端控制.滑动端的位置可以被储存在一个非易失性存储器中,因而在下一次上电工作时可以被重新调用.X9C102/103/104/503的分辨率等于最大的电阻值被99除.例如X9C100(1kΩ)的每个抽头间的阻值为10.1Ω.所有的Xicor非易失性存储器都设计成并经过测试能够用于持久地保存数据的应用场合.特点:
低功耗CMOS、VCC=3V至5.5V、工作电流最大3mA、等待电流最大500μA、99个电阻单元、有温度补偿、±20%端点到端点阻值范围100个滑动抽头点、滑动端的位置取决于三线接口、类似于TTL升/降计数器、滑动端位置储存于非易失性存储器之中,可在上电时重新调用。
2.3、控制模块msp430单片机
MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(MixedSignalProcessor)。
称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供“单片”解决方案。
2.3.1、MSP430单片机的特点:
(1)、处理能力强
MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。
这些特点保证了可编制出高效率的源程序。
运算速度快
(2)、超低功耗
MSP430单片机之所以有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。
MSP430系列单片机的电源电压采用的是1.8-3.6V电压。
因而可使其在1MHz的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM保持模式下的最低功耗只有0.1μA。
独特的时钟系统设计。
在MSP430系列中有两个不同的时钟系统:
基本时钟系统、锁频环(FLL和FLL+)时钟系统和DCO数字振荡器时钟系统。
可以只使用一个晶体振荡器(32768Hz),也可以使用两个晶体振荡器。
由系统时钟系统产生CPU和各功能所需的时钟。
并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。
(3)、片内资源丰富
MSP430系列单片机的各系列都集成了较丰富的片内外设。
它们分别是看门狗(WDT)、模拟比较器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-ΔADC、DMA、I/O端口、基本定时器(BasicTimer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。
其中,看门狗可以使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出A/D转换器;16位定时器(Timer_A和Timer_B)具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、PWM等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;具有较多的I/O端口,P0、P1、P2端口能够接收外部上升沿或下降沿的中断输入;10/12位硬件A/D转换器有较高的转换速率,最高可达200kbps,能够满足大多数数据采集应用;能直接驱动液晶多达160段;实现两路的12位D/A转换;硬件I2C串行总线接口实现存储器串行扩展;以及为了增加数据传输速度,而采用的DMA模块。
MSP430系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。
(4)、方便高效的开发环境
MSP430系列有OPT型、FLASH型和ROM型三种类型的器件,这些器件的开发手段不同。
对于OPT型和ROM型的器件是使用仿真器开发成功之后烧写或掩膜芯片;对于FLASH型则有十分方便的开发调试环境,因为器件片内有JTAG调试接口,还有可电擦写的FLASH存储器,因此采用先下载程序到FLASH内,再在器件内通过软件控制程序的运行,由JTAG接口读取片内信息供设计者调试使用的方法进行开发。
这种方式只需要一台PC机和一个JTAG调试器,而不需要仿真器和编程器。
开发语言有汇编语言和C语言。
2.4、显示及按键模块
2.4.1、1602液晶显示屏
1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
管脚功能:
LCD1602引脚图 1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
2.4.2、4x4按键
本系统中只是使用了K1、K2、K3、K4四个按键,每按一次K1键,数字电位器的电阻阻值上升100欧姆;每按一次K2键,DC/DC输出电压则上升0.2V;每按一次K3键,数字电位器的电阻阻值下降100欧姆;每按一次K4键,DC/DC输出电压则下降0.2V。
3、系统总体方案框图
二、电路设计与参数计算
1、DC/DC转化器的设计与参数计算
1.1、电路图
1.2、参数计算
输出电压为8—10V之间,参考为1.23V,又数字电位器的阻值范围为0—1K,
取R2=510欧,根据R1=(Uo/1.23-1)R2计算R1的取值范围为:
2.81—3.64,
取R2'为固定电阻2.7k,0.11—0.96k的变化阻值由数字电位器提供。
2、数字电位器的设计
2.1、电路图
3、总的系统图(不含控制部分)
4、总结
经过几天的辛勤努力,我们实现了题目的基本要求,由于时间紧,系统还存在许多可以改进的地方,比如发挥部分、和散热方面还有很大的提升空间,经过改进,相信性能还会有进一步的提升。
3、参考资料
4、附件
1、程序清单
main.c文件
#include
#include"BoardConfig.h"
#include"Cry1602.h"
#include"f2str.h"
#include
#definekeyin(P1IN&0x0f)
#defineNum_of_Results32
ucharkeyval=0;
uchar*s1="Voltage:
";
uchar*s2="key:
";
ucharp[1];
ucharshuzi[]={"0123456789."};
staticuintresults[Num_of_Results];
staticlongvlot[11],ltest;
staticunsignedintistate,adcok;
uinticount,adccount;
/**************函数声明****************/
voiddelay(void);
voiddelay1(void);
voiddelay2(void);
voidres100(void);
voidres10(void);
voiden_updown();
voidkey_select();
voidTrans_val(uintHex_Val);
/********************主函数********************/
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
BoardConfig(0xb8);//打开数码管,关闭流水灯和电平转换
LcdReset();
P1DIR=BIT7;//设置P1.0~P.3为输入状态,P.7为输出
P1OUT=0;
P2DIR=BIT5+BIT6+BIT7;
P6SEL|=0x01;
ADC12CTL0=ADC12ON+SHT0_12+MSC;//打开ADC,设置采样时间
ADC12CTL1=SHP+CONSEQ_2;//使用采样定时器
ADC12IE=0x01;//使能ADC中断
ADC12MCTL0=0x01;
P3DIR|=BIT4;
istate=0;
adcok=0;
icount=0;
adccount=0;
uinti;
floatfs;
fs=9674/7.8;
for(i=0;i<11;i++)
{
vlot[i]=fs*(8+0.2*i);
}
ADC12CTL0|=ENC;//使能转换
ADC12CTL0|=ADC12SC;//开始转换
_EINT();
DispNChar(13,0,3,"");
while
(1)
{
key_select();
DispStr(0,0,s1);
DispStr(0,1,s2);
F2S(keyval,p);
DispStr(5,1,p);
F2S(istate,p);
DispStr(8,1,p);
if(adcok==1&&(ltest-vlot[istate]>40))
{
P2OUT&=~BIT6;
res10();
adcok=0;
P3OUT&=~BIT4;
}
if(adcok==1&&(ltest-vlot[istate]<-40))
{
P2OUT|=BIT6;
res10();
adcok=0;
P3OUT&=~BIT4;
icount++;
}}
LPM0;
}
voiddelay(void)
{
uinttmp;
for(tmp=12000;tmp>0;tmp--);
}
voiddelay1(void)
{
uinttmp;
for(tmp=1200;tmp>0;tmp--);
}
voiddelay2(void)
{
longtmp;
for(tmp=120;tmp>0;tmp--);
}
voidres100(void)
{
inti;
for(i=0;i<10;i++)
{
P2OUT|=BIT7;
delay1();
P2OUT&=~BIT7;
delay1();
}
}
voidres10(void)
{
inti;
for(i=0;i<1;i++)
{
P2OUT|=BIT7;
delay1();
P2OUT&=~BIT7;
delay1();
}
}
voiden_updown()
{
if(keyval==1)
{
P2OUT|=BIT6;
res100();
}
elseif(keyval==2)
{
//P2OUT|=BIT6;
//res10();
if(istate<11)
{
istate++;
}
}
elseif(keyval==3)
{
P2OUT&=~BIT6;
res100();
}
elseif(keyval==4)
{
//P2OUT&=~BIT6;
//res10();
if(istate>0)
{
istate--;
}
}
}
voidkey_select()
{
uchartemp;
if(keyin!
=0x0f)//如果有键被按下
{
delay();//延时消抖
if(keyin!
=0x0f)//再次检测按键状态
{
temp=keyin;
while(keyin!
=0x0f);//等待按键被放开
switch(temp)//转换键值
{
case0x0e:
keyval=1;break;
case0x0d:
keyval=2;break;
case0x0b:
keyval=3;break;
case0x07:
keyval=4;break;
default:
keyval=0;break;
}
en_updown();
}
}
}
voidTrans_val(uintHex_Val)
{
unsignedlongcaltmp;
uintCurr_Volt;
uchart1,i;
ucharptr[4];
caltmp=Hex_Val;
caltmp=(caltmp<<5)+Hex_Val;//caltmp=Hex_Val*33
caltmp=(caltmp<<3)+(caltmp<<1);//caltmp=caltmp*10
Curr_Volt=caltmp>>12;//Curr_Volt=caltmp/2^n
ptr[0]=Curr_Volt/100;//Hex->Dec变换
t1=Curr_Volt-(ptr[0]*100);
ptr[2]=t1/10;
ptr[3]=t1-(ptr[2]*10);
ptr[1]=10;//shuzi表中第10位对应符号".
//在液晶上显示变换后的结果
for(i=0;i<4;i++)
Disp1Char((9+i),0,shuzi[ptr[i]]);
DispNChar(13,0,3,"");
}
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticuintindex=0;
results[index++]=ADC12MEM0;//Moveresults
if(index==Num_of_Results)
{
uchari;
unsignedlongsum=0,la;
floatfa;
index=0;
for(i=0;i{
sum+=results[i];
}
sum>>=5;//除以32
fa=4.485*sum;
la=fa;
ltest=la;//test
Trans_val(la);
adcok=1;
}
}
f2str.h文件
#include
#defineucharunsignedchar
uchar*F2S(doubled,uchar*str)
{
ucharstr1[20];
intj=0,k,i;
i=(int)d;//浮点数的整数部分
while(i>0)
{
str1[j++]=i%10+'0';
i/=10;
}
for(k=0;kstr[k]=str1[j-1-k];//
str[j++]='.';//加小数点
d-=(int)d;//取小数部分
for(i=0;i<3;i++)//小数点后面保留3位
{
d*=10;
str[j++]=(int)d+'0';
d-=(int)d;
}
while(str[--j]=='0');
str[++j]='\0';
returnstr;
}
cry1602.h文件
voidDispStr(unsignedcharx,unsignedchary,unsignedchar*ptr);
voidDispNChar(unsignedcharx,unsignedchary,unsignedcharn,unsignedchar*ptr);
voidLocateXY(unsignedcharx,unsignedchary);
voidDisp1Char(unsignedcharx,unsignedchary,unsignedchardata);
voidLcdReset(void);
voidLcdWriteCommand(unsignedcharcmd,unsignedcharchk);
voidLcdWriteData(unsignedchardata);
voidWaitForEnable(void);
voidDelay5ms(void);
cry1602.c文件
#include
#include"cry1602.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
/**************宏定义***************/
#defineDataDirP4DIR
#defineDataPortP4OUT
#defineBusy0x80
#defineCtrlDirP3DIR
#defineCLR_RSP3OUT&=~BIT0;//RS=P3.0
#defineSET_RSP3OUT|=BIT0;
#defineCLR_RWP3OUT&=~BIT1;//RW=P3.1
#defineSET_RWP3OUT|=BIT1;
#defineCLR_ENP3OUT&=~BIT2;//EN=P3.2
#defineSET_ENP3OUT|=BIT2;
voidDispStr(ucharx,uchary,uchar*ptr)
{
uchar*temp;
uchari,n=0;
temp=ptr;
while(*ptr++!
='\0')n++;//计算字符串有效字符的个数
for(i=0;i{
Disp1Char(x++,y,temp[i]);
if(x==0x0f)
{
x=0;
y^=1;
}
}
}
voidDispNChar(ucharx,uchary,ucharn,uchar*ptr)
{
uchari;
for(i=0;i{
Disp1Char(x++,y,ptr[i]);
if(x==0x0f)
{
x=0;
y^=1;
}
}
}
voidLocateXY(ucharx,uchary)
{
uchartemp;
temp=x&0x0f;
y&=0x01;
if(y)temp|=0x40;//如果在第2行
temp|=0x80;
LcdWriteCommand(temp,1);
}
voidDisp1Char(ucharx,uchary,uchardata)
{
LocateXY(x,y);
LcdWriteData(data);
}
voidLcdReset(void)
{
CtrlDir