⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cas_inv.c

📁 DSP TMS320LF2407A 转速闭环控制系统
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	*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 + -