void IcStart()
{
T3CONbits.TON = 1;
_IC1IE = 1;
_IC2IE = 1;
_IC7IE = 1;
}
unsigned int HallIcStart()
{
HallIntFlagBits.HallErrSpFlag = 0;
HallIntFlagBits.HallErrFlag = 0;
HallIntFlagBits.PwmDisableFlag = 1;
HallIntFlagBits.RevOpReqFlag = 0;
HallIntFlagBits.SpeedFstCal = 1; //捕获使能后放弃第一次捕获的定时器值
HallIntFlagBits.HallOfen = 0;
HallState_Main = ((PORTB&0x0010)>>2)+(PORTD&0x0003);
// HallState_Main = ((PORTB&0x0020)>>3)+(PORTD&0x0003); //调试
if(HallState_Main>7)
return 0;
LastHallState_Main = HallState_Main;
if(HallState_Main == HallErrCode[0] || HallState_Main == HallErrCode[1])
return(0);
else
{
SpeedOverFlow = 0;
SpeedCapValue_Main = 0;
SpeedCapTime_Main = 0;
IcStart();
_T3IE = 1;
return(1);
}
}
void HallIcStop()
{
T3CONbits.TON = 0;
TMR3 = 0;
_IC1IF = 0;
_IC2IF = 0;
_IC7IF = 0;
_IC1IE = 0;
_IC2IE = 0;
_IC7IE = 0;
_T3IE = 0;
}
void MCPWMStart()
{
WIDTH = 0;
PWMCON2bits.UDIS = 1;
PDC1 = 0;
PDC2 = 0;
PDC3 = 0;
PWMCON2bits.UDIS = 0; //占空比为0
PTCONbits.PTEN = 1;
}
void MCPWMStop()
{
PTCONbits.PTEN = 0;
PTMR = 0;
PWMCON2bits.UDIS = 1;
PDC1 = 0;
PDC2 = 0;
PDC3 = 0;
PWMCON2bits.UDIS = 0; //占空比为0
WIDTH = 0;
OVDCON = 0;
}
//三个捕获中断都用一个中断处理函数
void __attribute__((interrupt,no_auto_psv)) _IC1Interrupt()
{
//清中断标志,暂时没有分具体是哪个中断
_IC1IF = 0; //c
_IC2IF = 0; //b
_IC7IF = 0; //a
}
void __attribute__((interrupt,no_auto_psv)) _T3Interrupt()
{
_T3IF = 0;
if(SpeedOverFlow<0xFFFF)
SpeedOverFlow ++;
else
SpeedOverFlow = 0xFFFF;
TMR3 = 0;
}
|