首页 数字式开关电源的PID控制

数字式开关电源的PID控制

举报
开通vip

数字式开关电源的PID控制/********开关电源的数字化控制******//********所用拓扑为Buck,单片机msp430**********//*****PID算法实现开关电源的恒流、恒压、恒功率功能******//*********糖coffee@uestc************//**********************************************Part1Main.C**********************************************/#include#include"L...

数字式开关电源的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_delay1voidWrite_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*输入变量:unsignedcharbyteunsignedcharbyte****************************************************************/voidWrite_Data(unsignedcharbyte,unsignedcharreffer){unsignedchartemp,stemp;temp=byte;LCD_CS_Set_high;LCD_CLK_Set_low;if(reffer==1)Send_Byte(0xFA);elseSend_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)//sendthehighestLCD_SID_Set_high;elseLCD_SID_Set_low;temp=(temp<<1);LCD_CLK_Set_low;LCD_CLK_Set_high;Delay(LCD_delay);}}/************************************************************************************函数名称:Put_Array(unsignedchardata,unsignedcharlength,unsignedcharaddress)*函数功能:在LCD上显示一个数组*输入变量:unsignedchardataunsignedcharlengthunsignedcharaddress***********************************************************************************/voidPut_Array(unsignedchar*data,unsignedcharlength,unsignedcharaddress){if(address!=0){Write_Data(address,0);}for(unsignedchari=0;ia[j])min=a[j];}for(unsignedinti=0;i<6;i++){dat=dat+a[i];}dat=(dat-max-min)>>2;returndat;}/***************显示输出电压****************/voiddisplayU(){unsignedchariU,fU;iU=Uout/100;fU=Uout%100;Set_cursor(1,3);PutcLCD('0');PutDig(iU/10);PutcLCD('.');PutDig(iU%10);PutDig(fU/10);//PutDig(fU%10);}/***************显示输出电流****************/voiddisplayI(){unsignedchariI,fI;iI=Iout/100;fI=Iout%100;Set_cursor(2,3);PutcLCD('0');PutDig(iI/10);PutcLCD('.');PutDig(iI%10);PutDig(fI/10);//PutDig(fI%10);}/***************显示输出功率****************/voiddisplayP(){unsignedchariP,fP;iP=Pout/100;fP=Pout%100;Set_cursor(3,3);PutDig(iP/10);PutDig(iP%10);PutcLCD('.');PutDig(fP/10);PutDig(fP%10);}/***************处理电压PWM****************/voiddeal_U(){if((Uout>Us*100+25)||(Uout+25<100*Us))//精度25mV{iError=Us*100-Uout;//当前误差iIncpid=(signedint)(Kp*iError+Ki*lastError);PWM=PWM+iIncpid;if(PWM<20)PWM=20;elseif(PWM>380)PWM=380;TBCCR2=PWM;}}/***************处理电流PWM****************/voiddeal_I(){if((Iout>Is*100+5)||(Iout380)PWM=380;TBCCR2=PWM;}}/***************处理功率PWM****************/voiddeal_P(){if((Pout>Ps*10+3)||(10*Ps>Pout+2))//输出功率大于设定功率{iError=Ps*10-Pout;iIncpid=(signedint)(Kp*iError+Ki*lastError);PWM=PWM+iIncpid;if(PWM<20)PWM=20;if(PWM>380)PWM=380;TBCCR2=PWM;}}/***************计算输出电压电流功率****************/voidADC(){staticunsignedintindex=0;Uo[index]=ADC12MEM0;Io[index]=ADC12MEM1;index++;if(index==6){Umem=mean(Uo);Imem=mean(Io);Uout=(unsignedint)(2500*4.1*Umem/4096);//放大1000倍显示Iout=(unsignedint)(2500*Imem/(4096*1.3));//放大1000倍显示Pout=(unsignedint)((Uout/100.0)*(Iout/100.0));//放大100倍显示displayU();displayI();displayP();if(Mode==0)deal_U();elseif(Mode==1)deal_I();elsedeal_P();index=0;}}#endif/**********************************************Part2.5独立键盘Headfile**********************************************/#ifndef__IndependentKey#define__IndependentKey#defineKeyDIRP1DIR#defineKeyIN(P1IN&0x1f)#defineIncBIT0#defineDecBIT1#defineMODBIT2#defineADDBIT3#definePLUBIT4/**********显示设置电压************/voidDisplaySetU(){unsignedchariUs,fUs;iUs=Us/10;fUs=Us%10;Set_cursor(0,3);PutDig(iUs/10);PutDig(iUs%10);PutcLCD('.');PutDig(fUs);}/**********显示设置电流************/voidDisplaySetI(){unsignedchariIs,fIs;iIs=Is/10;fIs=Is%10;Set_cursor(0,3);PutcLCD('0');PutDig(iIs);PutcLCD('.');PutDig(fIs);}/**********显示设置功率************/voidDisplaySetP(){unsignedchariPs,fPs;iPs=Ps/10;fPs=Ps%10;Set_cursor(0,3);PutDig(iPs/10);PutDig(iPs%10);PutcLCD('.');PutDig(fPs);}/***********键盘初始化*************/voidinitKey(){KeyDIR&=~(Inc+Dec+MOD+ADD+PLU);}/************键盘检测**************/voidKeyScan(){if(KeyIN!=0x1f){Delay(100);if(KeyIN!=0x1f){unsignedcharKeyTemp=KeyIN;while(KeyIN!=0x1f);//等待按键松开switch(KeyTemp){case0x1e:{if(Mode==0){Us+=1;}elseif(Mode==1){Is+=1;}else{Ps+=5;}}break;//+case0x1d:{if(Mode==0){Us-=1;}elseif(Mode==1){Is-=1;}else{Ps-=5;}}break;//-case0x1b:{Mode++;if(Mode>2)Mode=0;if(Mode==0){Us=10;GUI_CU();}elseif(Mode==1){Is=10;GUI_CC();}else{Ps=10;GUI_CP();}}break;//modcase0x17:{if(Mode==0){Us+=5;}elseif(Mode==1){Is+=2;}else{Ps+=10;}}break;//++case0x0f:{if(Mode==0){Us-=5;}elseif(Mode==1){Is-=2;}else{Ps-=10;}}break;//--}}}}#endif/**********************************************Part2.6initHeadfile**********************************************/#ifndef__init#define__init/**********初始化时钟**********/voidinit_clk(){FLL_CTL0|=XCAP18PF;//SetloadcapacitanceFLL_CTL1&=~XT2OFF;//TurnonXT2do{IFG1&=~OFIFG;//Clearoscillatorfaultflagfor(unsignedinti=1000;i;i--);}while(IFG1&OFIFG);//TestoscfaultflagFLL_CTL1=SELS;//SelectSMCLKsourceasXT2CLK}/**********初始化AD,计算输出**********/voidinit_ADC12(){P6SEL=0x03;//EnableA/DchannelinputsADC12CTL0=ADC12ON+MSC+SHT0_8+REFON+REF2_5V;//TurnonADC12,setsamplingtimeADC12CTL1=SHP+ADC12SSEL_1+CONSEQ_1;//Usesamplingtimer序列单次ADC12MCTL0=INCH_0+SREF_1;ADC12MCTL1=INCH_1+SREF_1+EOS;ADC12CTL0|=ENC;}/**********初始化TA,采样周期**********/voidinit_TA(){TACTL=TASSEL_2+TACLR;//sMCLK,clearTARCCTL0=CCIE;//CCR0interruptenabledCCR0=800;TACTL|=MC_1;//StartTimer_AinUPmode}/**********初始化TB,驱动信号**********/voidinit_TB(){TBCTL|=TBSSEL_2+TBCLR+MC_1+ID_0;//SCLK,ClearTarTBCCR0=400;//PWM=20KTBCCTL2=OUTMOD_7;TBCCR2=200;//CCR2PWMdutycycleP2DIR|=BIT3;//P2.3outputP2SEL|=BIT3;//P2.3TA1otion}#pragmavector=TIMERA0_VECTOR__interruptvoidTimer_A(void){ADC12CTL0|=ADC12SC;}#endif
本文档为【数字式开关电源的PID控制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
楼上的小胖子
暂无简介~
格式:doc
大小:17KB
软件:Word
页数:20
分类:
上传时间:2023-03-04
浏览量:1