/*****************T1周期中断***********************************/
EvaRegs.T1CON.bit.TMODE=2; //计数模式为连续增计数
EvaRegs.T1CON.bit.TPS=1; //T1CLK=HSPCLK/2=37.5MHz
EvaRegs.T1CON.bit.TENABLE=0; //暂时禁止T1计数
EvaRegs.T1CON.bit.TCLKS10=0; //使用内部时钟
EvaRegs.GPTCONA.bit.T1TOADC=2; //周期中断启动ADC
EvaRegs.EVAIMRA.bit.T1PINT=1; //使能定时器T1的周期中断
EvaRegs.EVAIFRA.bit.T1PINT=1; //清除定时器T1的周期中断标志位
EvaRegs.T1PR=0x0EA6; //周期为0.1ms
EvaRegs.T1CNT=0; //初始化计数器寄存器
/***************************定时器4测速**************************************/
EvbRegs.T4CON.bit.TMODE=2;//连续增
EvbRegs.T4CON.bit.TPS=0;//预定标寄存器为1,TCLK=75/2=37.5,
// 0,TCLK=75
EvbRegs.T4CON.bit.TENABLE=0;//暂时禁止T4计数
EvbRegs.T4CON.bit.TCLKS10=0;//使用内部时钟
EvbRegs.T4CON.bit.TECMPR=1;//使能定时器比较操作
EvbRegs.GPTCONB.all=0;
EvbRegs.T4PR=0xffff;
EvbRegs.T4CNT=0;
EvbRegs.EVBIFRB.bit.T4PINT=1;
EvbRegs.EVBIMRB.bit.T4PINT=1;//T4周期中断
/***** CAP6 **********/
EvbRegs.CAPCONB.bit.CAPRES=0;
EvbRegs.CAPCONB.bit.CAP6EN=0;//CAP6//主程序打开
EvbRegs.CAPCONB.bit.CAP6TSEL=0;//CAP6选择T4
EvbRegs.CAPCONB.bit.CAP6TOADC=0;//不动ADC
EvbRegs.CAPCONB.bit.CAP6EDGE=1;//上升沿
EvbRegs.CAPFIFOB.bit.CAP6FIFO=0;//状态值里预存一个值,每次捕获都进入中断
EvbRegs.EVBIMRC.bit.CAP6INT=1;//CAP6中断使能
EvbRegs.EVBIFRC.bit.CAP6INT=1;//CAP6中断标志复位
main()
{
// int i ,j;
//int xianshi[4]={0,0,0,0}; /*显示初值*/
InitSysCtrl(); //系统初始化
Init_Port();
DINT;
IER=0X0000;
IFR=0X0000;
InitPieCtrl();
InitPieVectTable();
ADinitial();
InitEv();
huanxiang();
delay1();
delay1();
EALLOW;
PieVectTable.ADCINT=&adc_isr;
PieVectTable.CAPINT6=&CAPINT_ISR;
PieVectTable.T4OFINT=&T4PINT_ISR;
EDIS;
IER|=M_INT1;
IER|=M_INT5;
PieCtrlRegs.PIEIER1.bit.INTx6=1;
PieCtrlRegs.PIEIER5.bit.INTx5=1;
PieCtrlRegs.PIEIER5.bit.INTx4=1;
EINT;
ERTM;
EvaRegs.T1CON.all=0x0040;//使能定时器 T1,T3,T4
EvbRegs.T3CON.all=0x0040;
EvbRegs.T4CON.all=0x0040;
EvbRegs.CAPCONB.bit.CAP6EN=1;
interrupt void T4PINT_ISR(void)
{
count++;//count1++
T4count++;
if (T4count==1)
{
cap6count=0;
EvbRegs.T4CNT=0;
}
if(T4count>=1001)
{
t=((float)(T4count-1)*65535+EvbRegs.T4CNT)/75000000;
SPEED=(float(cap6count))/t;
SPEED+=0.5;
SRM.wEst_10xrpm=SPEED;
T4count=0;
cap6count=0;
if(SRM.wEst_10xrpm>400)//Ilimit值待定 电流限幅值
{
Ilimit=305;
}
else
{
Ilimit=365;
}
}
EvbRegs.EVBIFRB.bit.T4OFINT=1;
EvbRegs.EVBIMRB.bit.T4OFINT=1;
PieCtrlRegs.PIEACK.bit.ACK5=1;
EINT;
}
/*************************CAP6捕获计数***********************************/
interrupt void CAPINT_ISR(void)
{
cap6count++;
EvbRegs.EVBIFRC.bit.CAP6INT=1;//中断标志复位
EvbRegs.EVBIMRC.bit.CAP6INT=1;//中断使能
PieCtrlRegs.PIEACK.bit.ACK5=1;//相应第五组中断CAP6
EINT;
}
Adc_Result[0]=(long)AdcRegs.ADCRESULT0;
Adc_Result[1]=(long)AdcRegs.ADCRESULT1;
Adc_Result[2]=(long)AdcRegs.ADCRESULT2;
Adc_Result[3]=(long)AdcRegs.ADCRESULT7;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位SEQ1
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除INT SEQ1 位
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//响应中断
EINT;
|