数字式开关电源的PID控制.docx
《数字式开关电源的PID控制.docx》由会员分享,可在线阅读,更多相关《数字式开关电源的PID控制.docx(25页珍藏版)》请在冰豆网上搜索。
数字式开关电源的PID控制
/********开关电源的数字化控制******/
/********所用拓扑为Buck,单片机msp430**********/
/*****PID算法实现开关电源的恒流、恒压、恒功率功能******/
/*********糖coffee@uestc************/
/**********************************************
Part1Main.C
**********************************************/
#include
#include"LCD12864.h"
#include"table.h"
#include"GUI.h"
#include"deal.h"
#include"IndependentKey.h"
#include"init.h"
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
init_clk();
init_lcd();
GUI_CU();
init_ADC12();
init_TA();
init_TB();
initKey();
_EINT();
while
(1)
{
KeyScan();
if(Mode==0)//恒压模式
{
DisplaySetU();
Delay(100);
ADC();
Delay(100);
}
elseif(Mode==1)//恒流模式
{
DisplaySetI();
Delay(100);
ADC();
Delay(100);
}
else//恒功率模式
{
DisplaySetP();
Delay(100);
ADC();
Delay(100);
}
}
}
/**********************************************
Part2Headfile
**********************************************/
/**********************************************
Part2.1LCD12864Headfile
**********************************************/
#ifndef__LCD12864
#define__LCD12864
#defineLCD_CSBIT0
#defineLCD_SIDBIT2
#defineLCD_CLKBIT4
#defineLCD_ENP3DIR
#defineLCD_CTRLP3OUT
#defineLCD_CS_Set_highLCD_CTRL|=LCD_CS
#defineLCD_CS_Set_lowLCD_CTRL&=~LCD_CS
#defineLCD_SID_Set_highLCD_CTRL|=LCD_SID
#defineLCD_SID_Set_lowLCD_CTRL&=~LCD_SID
#defineLCD_CLK_Set_highLCD_CTRL|=LCD_CLK
#defineLCD_CLK_Set_lowLCD_CTRL&=~LCD_CLK
#defineLCD_delay1
voidWrite_Data(unsignedcharbyte,unsignedcharreffer);
voidSend_Byte(unsignedcharbyte);
voidClearLCD(void);
voidPut_Array(unsignedchar*data,unsignedcharlength,unsignedcharaddress);
/*************延时**********************/
voidDelay(unsignedchartime)//主时钟1微秒延时
{
unsignedinti;
i=0x08*time;
for(;i;i--);
}
/************************************************
//函数名称:
Initial_LCD(void)
//函数功能:
启动初始化
************************************************/
voidInitial_LCD(void)
{
LCD_EN|=LCD_CS+LCD_SID+LCD_CLK;
Write_Data(0x30,0);//基本指令集
Delay(LCD_delay);
Write_Data(0x30,0);
Write_Data(0x0C,0);
Delay(LCD_delay);
Write_Data(0x01,0);//清屏
Delay(LCD_delay);
Write_Data(0x06,0);
Delay(LCD_delay);
}
/****************************************************************
*函数名称:
Write_Data(unsignedcharbyte,unsignedcharreffer)
*函数功能:
发送指令或数据
reffer数据1
指令0
*输入变量:
unsignedcharbyte
unsignedcharbyte
****************************************************************/
voidWrite_Data(unsignedcharbyte,unsignedcharreffer)
{
unsignedchartemp,stemp;
temp=byte;
LCD_CS_Set_high;
LCD_CLK_Set_low;
if(reffer==1)
Send_Byte(0xFA);
else
Send_Byte(0xF8);//发送第一个字节
stemp=(temp&0xF0);
Send_Byte(stemp);
stemp=temp<<4;
Send_Byte(stemp);
LCD_CS_Set_low;
}
/*********************************************************
*函数名称:
Send_Byte(unsignedcharbyte)
*函数功能:
发送一字节数据
*输入变量:
unsignedcharbyte
*********************************************************/
voidSend_Byte(unsignedcharbyte)
{
unsignedchartemp,i;
temp=byte;
for(i=0;i<8;i++)//send8times
{
if(temp&0x80)//sendthehighest
LCD_SID_Set_high;
else
LCD_SID_Set_low;
temp=(temp<<1);
LCD_CLK_Set_low;
LCD_CLK_Set_high;
Delay(LCD_delay);
}
}
/***********************************************************************************
*函数名称:
Put_Array(unsignedchardata,unsignedcharlength,unsignedcharaddress)
*函数功能:
在LCD上显示一个数组
*输入变量:
unsignedchardata
unsignedcharlength
unsignedcharaddress
***********************************************************************************/
voidPut_Array(unsignedchar*data,unsignedcharlength,unsignedcharaddress)
{
if(address!
=0)
{
Write_Data(address,0);
}
for(unsignedchari=0;i{
Write_Data(data[i],1);
}
}
/************************************************
*函数名称:
ClearLCD(void)
*函数功能:
清屏
***************************************************/
voidClearLCD(void)
{
Write_Data(0x01,0);
}
/***********************************************************************
*函数名称:
Set_cursor
*功能描述:
设置光标的位置为CurY行,CurX列
*输 入:
CurX=position(0:
7)CurY=line(0:
3)
***********************************************************************/
voidSet_cursor(unsignedcharCurY,unsignedcharCurX)
{
switch(CurY)
{
case0:
Write_Data(0x80+CurX,0);
break;//写入第一行CurX列的地址
case1:
Write_Data(0x90+CurX,0);
break;//写入第二行CurX列的地址
case2:
Write_Data(0x88+CurX,0);
break;//写入第三行CurX列的地址
case3:
Write_Data(0x98+CurX,0);
break;//写入第四行CurX列的地址
default:
break;
}
}
/************************************************
*函数名称:
PutInt(unsignedintnum)
*函数功能:
显示十进制数
************************************************/
voidPutInt(unsignedintnum)
{
unsignedintsnum;
unsignedchartemp[12]={0},temp1[12]={0};
unsignedchari=0,n=0;
snum=num;
if(snum==0)
{
temp[0]='0';
i++;
}
while(num!
=0)
{
temp[i]=num%10+0x30;
num=num/10;
i++;
}
n=i;
for(i=0;itemp1[i]=temp[n-1-i];
Put_Array(temp1,n,0);
}
voidPutDig(unsignedcharnum)
{
unsignedcharsnum;
snum=num+0x30;
Write_Data(snum,1);;
}
/***********************************************
**函数名称:
PutcLCD()
**功能描述:
LCD写char
**输 入:
LCD_Char
***********************************************/
voidPutcLCD(unsignedcharLCD_Char)
{
Write_Data(LCD_Char,1);
}
/***********************************************
**函数名称:
PutsLCD()
**功能描述:
LCD写入RAM字符串
**输 入:
字符指针 Str
***********************************************/
voidPutsLCD(constchar*Str)
{
intStr_Temp;
Str_Temp=*Str;//Str_Temp所赋的值是Str所指向的字符
while(Str_Temp!
=0x00)//字符串还没有结束
{
Write_Data(Str_Temp,1);
Str++;
Str_Temp=*Str;
}
}
/*************************************
函数名:
ClrRam(void)
函数功能:
清整个GDRAM空间
*************************************/
voidClrRam()
{
unsignedcharx,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
Write_Data(0x34,0);
Write_Data(y+0x80,0);
//行地址
Write_Data(x+0x80,0);
//列地址
Write_Data(0x30,0);
Write_Data(0x00,1);
Write_Data(0x00,1);
}
}
/***************************************************
函数名:
ShowAll
函数说明:
显示一幅128*64的图画
传入参数:
图形指针*img
****************************************************/
voidShowAll(unsignedchar*pPicture)
{
unsignedchari,j,k;
Write_Data(0x36,0);
for(i=0;i<2;i++)//分上下两屏写
{
for(j=0;j<32;j++)//行
{
Write_Data(0x80+j,0);//写X坐标(第几行上写)
if(i==0)//写Y坐标,判断哪一屏
Write_Data(0x80,0);
else
Write_Data(0x88,0);
for(k=0;k<16;k++)//写一整行数据(16个字节,合八个字符)
Write_Data(*pPicture++,1);
}
}
//Write_Data(0x36,0);
}
#endif
/**********************************************
Part2.2TableHeadfile
**********************************************/
externunsignedcharimg[]={
0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xFE,0x7F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xFF,0x7F,0xFE,0xDF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0xFF,0x7F,0xFF,0xBF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3F,0xFB,0xFF,0xF9,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0xFB,0xFF,0xFF,0x3F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0xFF,0xFE,0x00,0x00,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xFF,0xF0,0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0x7F,0xC0,0x00,0x00,0x03,0xFE,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0xF7,0x80,0x00,0x00,0x01,0xF5,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1F,0xFB,0x00,0x00,0x00,0x00,0xE3,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1F,0xFF,0x03,0xF8,0x07,0xF8,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0xFE,0x0F,0xFE,0x1F,0xFC,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0xFC,0x1C,0x0F,0x7C,0x0C,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0xFC,0x1C,0x03,0xF0,0x06,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0xF8,0x08,0x01,0xE0,0x0E,0x1F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0xF8,0x08,0x07,0xF0,0x0E,0x1F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0xF0,0x08,0x0F,0x38,0x0C,0x0F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0xF0,0x0C,0x1E,0x1E,0x0C,0x0F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xF0,0x04,0x7C,0x0E,0x1C,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xF0,0x05,0xF8,0x00,0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE3,0xBF,0x9C,0xFF,0xEF,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE3,0xBB,0x6D,0xFF,0xFF,0x87,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xEF,0xE3,0xBE,0x6F,0xF3,0xBB,0x87,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF0,0xE3,0xBE,0xFF,0xFB,0xB8,0x07,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFE,0xE3,0xFB,0xFC,0x7B,0x9F,0x87,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE1,0xF3,0x1D,0xF3,0x9F,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE0,0x07,0xF8,0x07,0x0C,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xF0,0x06,0xF8,0x0F,0x18,0x0F,0xFF,0x00,0x00,0x00,0x00,0x0