>1);
CCPR1L=FULLDUTY;
asm("CLRWDT");
}while(voltage>=1;
curek=gcur-currenth;//计算本次偏差
curuk=curuk+curek*CURA-curep;//按闭环PI运算方式得到本次输出结果,下
//面对结果进行处理
if(curuk<0x00) {//如果输出小于零,则认为输出为零
curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0;
}
else if(curuk-THL>=0){//如果输出大于限幅值,则输出最大电压
curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;
}
else{//否则,按比例输出相应的高电平时间到CCPR1寄存器
b.pwm=THL-curuk;
b.pwm<<=1;
CCPR1L=b.a[1]; //CCPR1L=(b.pwm>>8)&0x0ff;将PWM寄存器的高半字节
if(b.pwm&0x80!=0) CCP1X=1;
else CCP1X=0;
if(b.pwm&0x40!=0) CCP1Y=1;
else CCP1Y=0;
}
}
//---------------转速环运算子程序-----------------------
void SPEPI()
{static int speep=0x00,speek=0x00,speuk=0x00;
int tsh1,speed1;//转速寄存器定义
spepid=0;//清转速运算标志
if(spe==1)speed1=0x00;//若转速太低,则认为转速为零
else speed1=0x7f-speed;//否则计算实际转速
if(speed1<0) speed1=0;
speep=speek*SPEB;
tsh1=tsh-0x38;//得到计算用的手柄值
speek=tsh1-speed1;
if(tsh1<0) {speuk=0;gcur=0;}//当手柄值低于1.1 V时,则认为手柄给定为零
else {//否则,计算相应的转速环输出
if(tsh1>=GSPEH)//限制最大转速
tsh1=GSPEH;
speuk=speuk+speek*SPEA-speep;//计算得转速环输出
if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//转速环输出处理
else if(speuk>GCURHILO){//转速环输出限制,即限制最大电流约12 A
speuk=GCURHILO;gcur=GCURH;}
else{//调速状态时的输出
gcur=(speuk>>4)&0x0ff;
}
}
}
//-----------主程序-------------------------
main()
{
for(;;){
INIT877();//单片机复位后,先对其进行初始化
off=0;//清复位标志
for(;off==0;){//复位标志为零,则执行下面程序,否则复位
if(curpid==1) CURPI();//电流PI运算
else if(spepid==1)SPEPI();//转速PI运算
else if(lowpower==1)POWER();
else if(shutdown==1)BREAKON();
asm("CLRWDT");
}
}
}
//---------中断服务子程序---------------------
#pragma interrupt_level 1
void interrupt INTS(void)
{
if(RBIF==1){RBIF=0;sample();}
else if(ADIF==1)AD();
else if(INTF==1){shutdown=1;INTF=0;}//刹车中断来,置刹车标志
}