基于PIC16F877A控制boostbuckDCDC变换器Word格式文档下载.docx
《基于PIC16F877A控制boostbuckDCDC变换器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于PIC16F877A控制boostbuckDCDC变换器Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
D为占空比。
用单片机输出PWM方波(经过驱动电路放大后)控制MOS管的开关,来调节输出电压。
将输出电压送回PIC单片机模数转换模块,通过反馈调节PWM占空比调节电压,使输出稳定。
利用差分运放电路,检测出输出电压与输出电流的关系。
键盘输入设置电压。
外接液晶屏显示输出电压和输出电流和输出电流。
主电路:
驱动电路:
控制电路:
液晶外围电路:
键盘电路模块:
用multisim仿真如下结果:
设计小结:
输出电流与输出电压的关系U=RI。
在程序设计中,通过电压的输出在液晶屏上显示电流的输出。
〈二〉程序部分:
输出pwm:
#include<
pic.h>
unsignedintDRE;
__CONFIG(0x2001);
voidPWM()
{
PR2=39;
//频率25KHz
TRISC|=0x04;
//RC2置为输入
CCP1CON=0X0c;
//PWM输出
CCPR1L=0X01;
//占空比25%
T2CON=0X04;
//开定时器TMR2,预分频1:
TMR2IF=0;
//清除TMR2中断标志位
}
voidmain()
while
(1)
{
PWM();
DRE=40;
//高电平寄存器的值
CCPR1L=DRE/4;
//装入高8位
CCP1CON<
5>
=(DRE/2)%2;
//装入次低位
4>
=DRE%2;
//装入最低位
while(TMR2IF==0);
TRISC=0x00;
}
}
AD转换:
__CONFIG(FOSC_XT&
WDTE_OFF&
LVP_OFF);
voidAD()
TRISA0=1;
//RA1设置为模拟输入
ADCON1=0x00;
//参考电压电源电压VDDAD转换周期Fosc/4
ADCON0=0x40;
//
voiddelayms(intxms)
inti,j;
for(i=0;
i<
xms;
i++)
for(j=0;
j<
150;
j++);
}
voidmain()
unsignedintx,y,z,A,B,C;
unsignedintResult,Result1,ADRES;
while
(1);
{delayms(5);
//采样采样电压充电延时
GO=1;
while(GO==1);
{
Result=ADRES;
x=(Result*5)/256;
//取个位十分位百分位
y=((Result*50)/256)%10;
z=((Result*500)/256)%10;
Result1=Result/1.2-1.5;
A=(Result*5)/256;
B=((Result*50)/256)%10;
C=((Result*500)/256)%10;
液晶屏与键盘:
#defineLCD_ENRC7
#defineLCD_RWRC6
#defineLCD_RSRC5
unsignedintx,y,z,A,B,C;
unsignedchardis0[]="
voltage:
"
;
unsignedchardis1[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
.'
};
unsignedchardis2[]="
current:
unsignedchardis3[]={'
unsignedchardis4[3],dis5[3];
__CONFIG(FOSC_XT&
voiddelay(intxms)
inti,j;
j++);
voidwrite_com()
{
unsignedcharcom;
//声明写指令
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
PORTD=com;
delay(5);
LCD_EN=1;
voidwrite_date()
unsignedchardate;
LCD_RS=1;
PORTD=date;
voidinit()
{TRISD=0x00;
TRISC&
=0x1f;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
voiddisplay()
unsignedcharj;
dis4[0]=dis1[x];
dis4[1]=dis1[10];
dis4[2]=dis1[y];
dis4[3]=dis1[z];
write_com(0xc8);
=3;
j++)
write_date(dis5[j]);
delay
(1);
unsignedchark;
dis5[0]=dis3[A];
dis5[1]=dis3[10];
dis5[2]=dis3[B];
dis5[3]=dis3[C];
for(k=0;
k<
k++)
write_date(dis4[k]);
unsignedchari;
init();
write_com(0x80);
//显示第1行
=8;
write_date(dis0[i]);
write_com(0x80+0x40);
//显示第2行
write_date(dis2[i]);
}#defineKEYBOARD_PORT_DIRTRISB//键盘扫描方向端口
#defineKEYBOARD_PORTPORTB//键盘扫描端口
#defineNO_KEY0xFF//无按键
__CONFIG(0x3FFF);
unsignedcharL,O;
charscankeypad();
//获取4×
4键盘值
chargetkeyvalue();
//获取某按键的值
voiddelay(intxms)
constcharccode[16][2]=
{0xEE,1},{0xED,2},{0xEB,3},{0xE7,'
L'
},
{0xDE,4},{0xDD,5},{0xDB,6},{0xD7,'
+'
{0xBE,7},{0xBD,8},{0xBB,9},{0xB7,'
-'
{0x7E,'
},{0x7D,0},{0x7B,'
*'
},{0x77,'
O'
};
charscankeypad()//获取4*4键盘扫描码
charkey4H=0,key4L=0,scancode=0;
TRISD=0xF0;
//低四位输出,高四位输入
PORTD=0x00;
//低四位输出0
asm("
nop"
);
//待输出信号稳定
key4H=PORTD;
//读取高四位
key4H=key4H&
0xF0;
//将低四位屏蔽
if(key4H!
=0xF0)//有按键按下
delay(20);
key4H=PORTD;
//重读
if(key4H!
=0xF0)
{
TRISD=0x0F;
PORTD=0x00;
asm("
key4L=PORTD;
key4L=key4H&
0x0F;
//将高四位屏蔽
if(key4L!
=0x0F)//有按键按下
{
scancode=key4H|key4L;
//高四位与低四位组成键盘扫描码
while(PORTD!
=0x0F);
//按键未松开等待
return(scancode);
}
}
returnNO_KEY;
charGetkeyvalue()//获取扫描码
{charkeyvalue=0,c=0;
keyvalue=scankeypad();
if(keyvalue!
=NO_KEY)
while(keyvalue!
=ccode[c][0])
{//比较描码与当前数组元素是否相等
c++;
return(ccode[c][1]);
//返回序号对应值
return(NO_KEY);
inti=0,Num[2]={0,0},Numindex=0;
while
(1)
i=Getkeyvalue();
//获得键值
if(i!
=NO_KEY)//有按键
if(i>
=0&
&
=9)
Num[2]=Numindex*10+i;
//新数值
else
switch(i)
case'
:
Num[0]=0;
Num[1]=0;
Numindex=0;
break;
default:
电源输出效率:
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)