📄 cas_inv.c
字号:
{
*EVAIMRC&=0xfffe;//屏蔽子中断
*EVAIFRC|=0x0001;//复位子中断标志位
CW2_TAL=Toff1_al;//将上次算好的数据发送给第2个载波单元
CW2_TAR=Toff1_ar;
CW2_TBL=Toff1_bl;
CW2_TBR=Toff1_br;
CW2_TCL=Toff1_cl;
CW2_TCR=Toff1_cr;
phase+=step;
cal_Toff1();
*EVAIMRC|=0x0001;//复位CAP1中断使能位
}
/*--------------------------------CAP2INT中断服务子程序-------------------------------*/
void cap2int_isr(void)
{
*EVAIMRC&=0xfffd;
*EVAIFRC|=0x0002;
CW3_TAL=Toff1_al;//将上次算好的数据发送给第3个载波单元
CW3_TAR=Toff1_ar;
CW3_TBL=Toff1_bl;
CW3_TBR=Toff1_br;
CW3_TCL=Toff1_cl;
CW3_TCR=Toff1_cr;
phase+=step;
cal_Toff1();
*EVAIMRC|=0x0002;//复位CAP2中断使能位
}
/*--------------------------------CAP3INT中断服务子程序-------------------------------*/
void cap3int_isr(void)
{
*EVAIMRC&=0xfffb;
*EVAIFRC|=0x0004;
CW1_TAL=Toff1_al;//将上次算好的数据发送给第1个载波单元
CW1_TAR=Toff1_ar;
CW1_TBL=Toff1_bl;
CW1_TBR=Toff1_br;
CW1_TCL=Toff1_cl;
CW1_TCR=Toff1_cr;
phase+=step;
cal_Toff1();
*EVAIMRC|=0x0004;//复位CAP3中断使能位
}
/*---------------------------------T1PINT中断服务子程序-------------------------------*/
void t1pint_isr(void)
{
*EVAIMRA&=0xff7f;//屏蔽T1周期子中断
*EVAIFRA|=0x0080;//清T1周期子中断标志位
encoder_new=*T4CNT;
encoder_inc=cnt_ep*EP+encoder_new-encoder_old;
cnt_ep=0;
encoder_old=encoder_new;
n_actual=(long)encoder_inc*(long)K_NE>>13;//计算实际转速,Q3格式
if(flag_sendn&&++cnt_sendn>=flag_sendn)
{
cnt_sendn=0;
flag_send='n';
*SCITXBUF='n';
}
if(flag_run&&(n_appoint!=n_anow)&&(++cnt_t1p>=5))
{
cnt_t1p=0;
n_modulation();
}
*EVAIMRA|=0x0080;//复位T1周期中断使能位
}
/*---------------------------------T4PINT中断服务子程序-------------------------------*/
void t4pint_isr(void)
{
*EVBIMRB&=0xfffe;//屏蔽T4周期子中断
*EVBIFRB|=0x0001;//清T4周期子中断标志位
cnt_ep=*GPTCONB&0x4000?cnt_ep+1:cnt_ep-1;
*EVBIMRB|=0x0001;//复位T4周期中断使能位
}
/*---------------------------------RXINT中断服务子程序--------------------------------*/
void rxint_isr(void)
{
switch(cnt_rx)//SCI接收字节次数
{
case 0:command=*SCIRXBUF;//第一个字节为命令
switch(command)
{
case 'N':cnt_rx=1;break;//发送实际转速
case 'O':flag_sendn=0;break;//停止发送转速给上位机
case 'n':cnt_rx=1;break;//上位机准备发送指令转速
case 'r':if(flag_run==0)//run
{
flag_run=1;
n_anow=0;//设置初始给定转速为0
}
break;
case 's':flag_run=0;//stop
STOP;
break;
default:break;
}
break;
case 1:switch(command)
{
case 'N':temp_sendn=*SCIRXBUF;//接收发送转速时间的高8位
temp_sendn*=256;
cnt_rx=2;
break;
case 'n':cnt_rx=2;//若命令为'n',则第二个字节为指令转速的高8位
temp_n=*SCIRXBUF;
temp_n*=256;
break;
default:cnt_rx=0;//若为其它,则认为是传输错误或干扰,cnt_rx复位
}
break;
case 2:switch(command)
{
case 'N':temp_sendn|=*SCIRXBUF&0x00ff;//接收发送转速时间的低8位
if(temp_sendn<=10)flag_sendn=1;
else flag_sendn=temp_sendn/10;//计算采样几次转速须发送一次给上位机
cnt_rx=0;
break;
case 'n':cnt_rx=0;//若命令为'n',则第三个字节为指令转速的低8位
temp_n|=*SCIRXBUF&0x00ff;
if(temp_n<NMIN&&temp_n>-NMIN)temp_n=NMIN;//转速范围限定
else if(temp_n>NMAX)temp_n=NMAX;
else if(temp_n<-NMAX)temp_n=-NMAX;
n_appoint=temp_n*8;//设置新的给定转速,Q3格式
break;
default:cnt_rx=0;//若为其它,则认为是传输错误或干扰,cnt_rx复位
}
break;
default:cnt_rx=0;//若cnt_rx>2,则有误,cnt_rx复位
break;
}
}
/*---------------------------------TXINT中断服务子程序--------------------------------*/
void txint_isr(void)
{
int temp;
switch(cnt_tx)
{
case 0:switch(flag_send)
{
case 'n':temp=n_actual>>11;
if(n_actual<0)temp|=0xffe0;
*SCITXBUF=temp;
cnt_tx=1;
break;
default:break;
}
break;
case 1:switch(flag_send)
{
case 'n':*SCITXBUF=n_actual>>3;cnt_tx=2;break;
default:cnt_tx=0;break;
}
break;
case 2:cnt_tx=0;break;
default:cnt_tx=0;break;
}
}
/*---------------------------------INT2中断服务子程序---------------------------------*/
void interrupt int2_isr(void)
{
DINT;//为避免误操作,暂时屏蔽中断
switch(*PIVR)
{
case 0x0027:t1pint_isr();break;
default:*IFR|=0xffff;*EVAIFRA|=0xffff;break;
//若出现干扰,进入此处,则只将中断标志位复位,不做其它事情
}
EINT;//enable interruptbreak;
}
/*---------------------------------INT3中断服务子程序---------------------------------*/
void interrupt int3_isr(void)
{
DINT;//为避免误操作,暂时屏蔽中断
switch(*PIVR)
{
case 0x0039:t4pint_isr();break;
default:*IFR|=0xffff;*EVBIFRB|=0xffff;break;
//若出现干扰,进入此处,则只将中断标志位复位,不做其它事情
}
EINT;//enable interruptbreak;
}
/*---------------------------------INT4中断服务子程序---------------------------------*/
void interrupt int4_isr(void)
{
DINT;//为避免误操作,暂时屏蔽中断
switch(*PIVR)
{
case 0x0033:cap1int_isr();break;
case 0x0034:cap2int_isr();break;
case 0x0035:cap3int_isr();break;
default:*IFR|=0xffff;*EVAIFRC|=0xffff;break;
//若出现干扰,进入此处,则只将中断标志位复位,不做其它事情
}
EINT;//enable interruptbreak;
}
/*---------------------------------INT5中断服务子程序---------------------------------*/
void interrupt int5_isr(void)
{
DINT;
switch(*PIVR)
{
case 0x0006:rxint_isr();break;
case 0x0007:txint_isr();break;
default:*IFR|=0xffff;break;
//若出现干扰,进入此处,则只将中断标志位复位,不做其它事情
}
EINT;
}
/*-------------------------------------其它中断子程序----------------------------------*/
void interrupt nothing(void)//当由于干扰而引起其他中断时,进入此程序
{
*IFR|=0xffff;
*EVAIFRC|=0xffff;
}
/*-----------------------------------软件陷阱中断子程序--------------------------------*/
void interrupt trap(void)
{
asm(" B _c_int0");
}
/*------------------------------------非屏蔽中断子程序---------------------------------*/
void interrupt nmi(void)
{
asm(" B _c_int0");//若发生非屏蔽中断,则将程序reset
}
/*-----------------------------------------主程序--------------------------------------*/
void main(void)
{
Init();//初始化
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -