UPS不间断电源的研究与设计 软件程序.doc_ups不间断电源设计
UPS不间断电源的研究与设计 软件程序.doc由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“ups不间断电源设计”。
流程图
清中断标志位清定时器1读取A/D转换值计算输出电压偏差表指针到最大返回表头表指针加1正半波?正负半波信号置1正负半波信号置0查正弦表计算PWM占空比更新PWM占空比中断返回
图1 CCP1中断服务子程序
算法实现程序
//-----------------------------//
SPWM信号调制
//-----------------------------#include
#include
//系统配置
__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTEN);//打开看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护 //------------------1 //-----------AD1通道转换--------------------void ad_0(){ AN0;
//选择通道0 //延时,采样电容充电 //开启AD //等待AD结束
//结果转存到变量AD_RES_0 DELAY();ADGO=1;
while(ADGO);
ad_res_0=ADRES;} //-----------AD1通道转换--------------------void ad_1(){ AN1;DELAY();ADGO=1;while(ADGO);ad_res_1=ADRES;if(ad_res_1>132){sin_am-=0.005;if((ad_res_1-132)>10)sin_am-=0.04;} else
if((ad_res_1=130))sin_am+=0;else
if(ad_res_110)sin_am+=0.04;} if(sin_am>1.6)sin_am=1.6;} //------------AD2通道转换-------------------void ad_2(){ AN2;DELAY();ADGO=1;while(ADGO);ad_res_2=ADRES;2 } const unsigned char
sin_[]={40,50,73,85,100,113,127,141,157,170,180,189,196,200,203,204, //正半周 204,203,200,195,188,179,169,157,144,129,113,96,78,59,39,15 //负半周};unsigned char sin_num;
//sin函数表查表变量
//------------------void CCP_start(){ CCPR2L=0X0;//设置CCP2,0%的脉宽输出 CCPR1L=0X0;//设置CCP1,0%的脉宽输出 TRISC=0X00;PR2=0Xff;//PORTC are outputs //设置PWM的工作周期,16MHz,PWM周期15.562kHz CCP1M3=1;CCP1M2=1;//CCP1模块PWM模式 CCP2M3=1;CCP2M2=1;//CCP2模块PWM模式 sin_up=1;sin_num=0;sin_am=0;//正负半周SIN函数 //脉宽周期调整计数器 //sin函数的幅值
sin_am=0.3000;//sin函数的幅值 crut_ie=1;} //-------------中断服务程序---------------------void interrupt key_ccp_timer(){ if(TMR2IF&TMR2IE){ TMR2IF=0;//定时器2中断服务函数
if(sin_num==31){sin_num=0;sin_up=!sin_up;} sin_d=sin_[sin_num];
//定时器1中断服务函数 //电流慢保护允许
sin_l=sin_am*sin_d;if(sin_l>=255)sin_l=255;
//限幅
//换向 if(sin_up){CCPR2L=(unsigned char)sin_l;CCPR1L=0;} else {CCPR1L=(unsigned char)sin_l;CCPR2L=0;}
//换向
sin_num++;} CLRWDT();//清除看门狗
if(RBIF&&RBIE){RBIF=0;if((!RB6)&&power_ie)k=1;}
if(TMR1IF&TMR1IE){ TMR1IF=0;tm_sum++;if(tm_sum==31){ tm_sum=0;tmr_s=!tmr_s;tmr_d=1;} } } //-------------------//主程序 main(){ CLRWDT();//清除看门狗
port_init();//端口初始化 init_start();//开机状态 adc_init();//ad通道初始化
//--------------------RC4=0;//继电器关闭 RC3=1;//关闭脉冲封锁
//--------------------TMR1CS=0;//同步模式
//端口b中断服务函数 T1SYNC=0;TMR1H=0XFD;//内部指令周期
TMR1L=0X10;TMR1IE=1;//定时器1初值 //定时器1中断使能
//--------------------------TRISC=0X00;
//端口C输出
TRISC1=TRISC2=1;//RC1,RC2输入模式 PEIE=1;
//外围模块中断使能 //打开定时器2中断使能 //开全局中断
//打开定时器2 TMR2IE=1;GIE=1;
TMR2ON=1;TOUTPS3=0;TOUTPS2=1;TOUTPS1=0;TOUTPS0=0;//定时器2后分频器5分频 TMR1ON=1;power_ie=1;while(1)
{
CLRWDT();if(k){
DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();if(k&&RB6){k=0;power=!power;} if(power){
} power_ie=0;//开关间隔开始计时 RC3=0;RC4=1;
//打开脉冲封锁 //打开继电器
//开机
//开关机标志
//延时 //延时 //清除看门狗
//打开定时器1 //允许开机
CCP_start();//开始SPWM 5
} if(!power){
}
//关机
power_ie=0;//开关间隔开开始计时 crut_if=0;//电流保护标志清零 volue_if=0;//电池电压保护标志清零 RC3=1;
//关闭脉冲封锁
//复位CCP模块 CCP2CON=0;CCP1CON=0;RC2=RC1=0;RC4=0;
//置端口固定电平
//关闭继电器
//------输出电流检测------
if(power_up){
if(ad_res_0>=204){ crut_if=1;crut_tmr=0;crut_ie=0;
}
//高于2v电流慢保护
//电流高于4v,快保护
if((ad_res_0>=102)&&(ad_res_0
if(tmr_s&&tmr_d&&crut_ie){
} tmr_d=0;crut_tmr++;if(crut_tmr==10){ }
//时基,时基变化标志,保护允许
crut_tmr=0;crut_ie=0;crut_if=1;//保护 } if(ad_res_0
if(ad_res_2>=102){L1_OFF;if(volue_if);} //电池电压大于2v,if((ad_res_2=91))//电池低于2v大于1.8v if(ad_res_2
} //-----模拟采集
}
} if(power)ad_1();//在开机状态下检测反馈电压 ad_2();ad_0();//采集电池电压 //采集电流
if(power_ie==0)//开关机时间间隔 {
} if(power_up==0)//上电延时1秒检测电池电压 {
} if(tmr_s&&tmr_d){tmr_d=0;power_up_s++;} if(power_up_s==1){power_up_s=0;power_up=1;} if(tmr_s&&tmr_d){tmr_d=0;power_s++;} if(power_s==10){power_s=0;power_ie=1;} 7