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

📄 motor.c

📁 这里面包括所有的DSP程序例程
💻 C
字号:
#include "DSP28_Device.h"
#include "comm.h"
#include "mcbsp.h"
#include "gui_string.h"
#include "motor.h"

#define DATATYPE 0 /* 0代表edit菜单;1代表选项菜单*/

unsigned int i,j;
unsigned int send_flag;
/***************************************************/
interrupt void mrinta_isr(void);

interrupt void  t1pint_isr(void);
interrupt void  cap_isr(void);
interrupt void  t2pint_isr(void);
interrupt void  EXint2_isr(void);
void Capinit(void);
void InitEvA(void);
void xnitgpio();
void pidcontrol(int u,int y);
void delay(unsigned int m);
///2008.4.3
Uint16 Speed,OldSpeed=0;
///end 
Uint16 test[2000],test1[2000];
Uint16 count=0,CountAverage;
Uint16 nn=0; 
Uint16 tt=0;
Uint16 ll=0;
Uint16 Sum=0;


unsigned int dir=1;//电机转动方向
unsigned int start=0;//电机启动停止标志
unsigned int setflag=0;//表示是否进行速度设定
unsigned int sudusendflag=0,xssdbz=0;//速度上传标志和速度显示的计数
unsigned int sdxsjs=0;
//速度到pwm的初始值
unsigned int pwm;//pwm的占空比
float kp=0.003,ki=0.01,kd=0.0;
Uint16 Speedset=3500;
int ek=0,ek1=0,ek2=0;
int du;
float duk;
/***************************************************/

/*******************************************************/

#define menu_num 5 /*通过num来控制输出文字的个数,通过gui_string.sam控制内容。*/
unsigned int Test;
/////////////////////////////////////////////////////////////////////////
unsigned int Edit_result;
unsigned int i,k;
/////////////////////////////////////////////////////////////////////////
unsigned int mcbspx[FRAMLENGTH];
unsigned int mcbspr[FRAMLENGTH];
unsigned int mcbsp_s;
PmcbspForDec psend;
PmcbspForDec preceive;
/************************************************/
void main(void)
{

#if DATATYPE==0
	Test =FRAME_DATASEND; //0x1  数据传送帧
#endif
#if DATATYPE==1
	Test =FRAME_DATAEND; // 0x3  数据传送结束帧
#endif 
		/*初始化系统*/
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;

	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE矢量表*/
	InitPieVectTable();		
	
	/*初始化PWM*/
	 InitEvA();
    /*GPIO*/
     xnitgpio(); 
    
    /*初始化CAP*/
     Capinit();
	
	/*初始化MCBSP外设*/
	InitMcbsp();
	
	EALLOW;  // This is needed to write to EALLOW protected register
	PieVectTable.XINT2=&EXint2_isr;
    PieVectTable.CAPINT1=&cap_isr;
    //PieVectTable.CAPINT2=&cap_isr;
    //PieVectTable.CAPINT3=&cap_isr;
    PieVectTable.T1PINT=&t1pint_isr;
    //PieVectTable.T2PINT=&t2pint_isr;
    //PieVectTable.PDPINTA=&pdpinta_isr;
    PieVectTable.MRINTA= &mrinta_isr;
    EDIS;    // This is needed to disable write to EALL
	
	PieCtrl.PIEIER1.bit.INTx5=1;//XINT2
	
	PieCtrl.PIEIER2.bit.INTx4=1;//T1pint中断
    //PieCtrl.PIEIER3.bit.INTx1=1;//T2pint中断
    PieCtrl.PIEIER3.bit.INTx5=1;//Cap1中断
    //PieCtrl.PIEIER3.bit.INTx6=1;//Cap2中断
    //PieCtrl.PIEIER3.bit.INTx7=1;//Cap3中断
    //PieCtrl.PIEIER1.bit.INTx1=1;//pdpinta中断 
    PieCtrl.PIEIER6.bit.INTx5 = 1;//McBSP接受中断	
	/* 设置IER寄存器 */

	IER |= M_INT1;
    IER |= M_INT2; // t1pint enable
    IER |= M_INT3; // capture enable
    IER |= M_INT6;
    
    
    // Enable global Interrupts and higher priority real-time debug events:
	//startmotor();
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	
    psend=(PmcbspForDec)(&mcbspx[0]);  
    
    
// Step 6. IDLE loop. Just sit and loop forever (optional):	
   while(1)
    {    
           switch(Test)       
           {
            case FRAME_DATASEND:
 				psend->Length=FRAMLENGTH; 		
 	   			psend->Type=FRAME_DATASEND;  //0x1  数据传送
	   		 	psend->Mutul=FRAME_SING;			
	 		    psend->Data[0]=MOTOR_START;  //0xAA30	电机实验开始
		    	mcbsp_tx((unsigned int *)psend);
                Test=0;
            break;
            case FRAME_DATAEND:
                psend->Length=FRAMLENGTH; 		
 	   			psend->Type=FRAME_DATAEND;  //0x3  数据传送
	   		 	psend->Mutul=FRAME_SING;			
	 		    psend->Data[0]=MOTOR_OVER;  //0xAA32	电机实验结束
	  		    mcbsp_tx((unsigned int *)psend);
	  		    Test=0;
            break;
            default:
		    break;  
		}	
		mcbsp_rx(&mcbspr[0]);
   	    mcbsp_s=mcbsp_status();
    	if((mcbsp_s == 0xffff)||(mcbsp_s == 3)){        
		     /*通知主机程序通讯出错,准备重发*/
		   	psend->Length = FRAMLENGTH;
		   	psend->Type = FRAME_CMD;
			psend->Data[0] = CHECK_ERR;
		   	psend->Mutul = FRAME_SING;
			mcbsp_tx((unsigned int *) psend);
		}
		if(mcbsp_s == 0)
		{
			 preceive=(PmcbspForDec)(&mcbspr[0]);
			 if(mcbspr[3]==0xaa38)
			 {
			 	switch(mcbspr[4])
			 	{
			 		case 0xaa35:
			 		{
			 			start=1;
			 			xssdbz=1;
			 			startmotor();break;//启动电机
			 		}
			 		case 0xaa34:
			 		{
			 			start=0;
			 			xssdbz=1;
			 			stopmotor();//停止电机
			 			setflag=0;
			 			break;
			 		}
			 		case 0xaa36:
			 		{
			 			if(start==1)
			 			{
			 				dir=!dir;//换向
			 				stopmotor();
			 				delay(1000);
			 				startmotor();
			 				xssdbz=1;
			 			}
			 			break;
			 		}	
			 		default:break;		 		
			 	}
			 }
			 if(mcbspr[3]==0xaa37)//pid参数设定
			 {
			    xssdbz=1;
			    Speedset=mcbspr[4];
			 	kp=(float)mcbspr[5]/1000;
			 	ki=(float)mcbspr[6]/1000;
			 	kd=(float)mcbspr[7]/1000;
			 	if(start==1)
			 	setflag=1;//表示开始设定速度,pid 
			 	else
			 	setflag=0;
			 }
		}
			 
		if((sudusendflag==1)&&(xssdbz==1))//每隔2s上传一次速度
		{
			sudusendflag=0;
			psend->Length = FRAMLENGTH;
		   	psend->Type = FRAME_DATASEND;
			psend->Data[0] = 0xaa20;
			if(start==0)//电机停止状态下速度为0
			Speed=0x0;
			psend->Data[1] =Speed;
		   	psend->Mutul = FRAME_SING;
			mcbsp_tx((unsigned int *) psend);
		}		
	}
} 	



interrupt void  EXint2_isr(void)
{
    
    Sum+=count;

    /*test[nn]=count;//测试用,存储速度值      
    nn++;     
    if(nn==1000)
    {      	 
      	nn=0; 
      	  
   	}*/

    Speed=(10000/count)*30;//计算转速 

	/////////////2008.4.3
	if(Speed>6500)
	Speed=OldSpeed;

    OldSpeed=Speed;
	///////////END 2008.4.3
   // Speed=(10000/(count*2))*60;//计算转速  
    /*ll++;
	if(ll==10)
	{
		CountAverage=Sum/10;
		Speed=(10000/(CountAverage*2))*60;//计算转速  
		Sum=0;
		ll=0;*/
		test[nn]=Speed;//测试用,存储速度值 
		test1[nn]=count;//测试用,存储速度值     
    	nn++;     
    	if(nn==1000)
    	{      	 
      	  nn=0;       	  
   		}

	//}
    
    count=0;   
    PieCtrl.PIEACK.bit.ACK1=1;//向cpu申请中断 
}

interrupt void  cap_isr(void)
{  
  
   	
	//Speed=(20000/(count*2))*60;//计算转速     
    test[nn]= count;//测试用,存储速度值      
    nn++;      
    if(nn==2000)
    {      	 
      	  nn=0; 
      	  
    }
    count=0; 

    
    EALLOW;
    EvaRegs.CAPFIFO.all= 0x01500; // 清空捕捉堆栈 
    EvaRegs.EVAIFRC.all = 7 ; // 清捕捉中断
	EvaRegs.CAPFIFO.all= 0x01500; // 清空捕捉堆栈 
   // EvaRegs.CAPFIFO.all = 0x01500; // 清空捕捉堆栈   
    PieCtrl.PIEACK.bit.ACK3=1;//cap1中断向cpu申请中断
	EDIS;
}

interrupt void  t1pint_isr(void)
{    
    
    sdxsjs++;
   
    if(sdxsjs==20000)
    {
    	sudusendflag=1;//速度上传标志置位
    	sdxsjs=0;
    	//GpioDataRegs.GPADAT.bit.GPIOA13 =!GpioDataRegs.GPADAT.bit.GPIOA13;//程序运行显示	
    }//速度上传得计时
    
    tt++;
	if(tt==1000)
    {
    	//GpioDataRegs.GPADAT.bit.GPIOA0=!GpioDataRegs.GPADAT.bit.GPIOA0;
		if(setflag==1)
  		{
   			pidcontrol(Speedset,Speed);//100ms
   		}  		
		tt=0;
	}
    count++; 
	//if(count>=30)
//	asm(" nop");
  	EvaRegs.EVAIFRA.bit.T1PINT=1;//清除中断标志
  	EvaRegs.EVAIMRA.bit.T1PINT=1;//中断允许 
   
  	PieCtrl.PIEACK.bit.ACK2=1;//向cpu申请中断

}

interrupt void  t2pint_isr(void)
{
  count++; 
  EvaRegs.EVAIFRB.bit.T2PINT=1;//清除中断标志
  EvaRegs.EVAIMRB.bit.T2PINT=1;//中断允许    
  PieCtrl.PIEACK.bit.ACK3=1;//向cpu申请中断 
}


//pid控制
void pidcontrol(int u,int y)
{
    EALLOW;
	ek=u-y;
	duk=kp*(ek-ek1)+ki*ek+kd*(ek+ek2-ek1*2);
	du=(int)duk;
	if(duk>1)  duk=1;
	if(duk<-1) duk=-1;	
	pwm-=du;    
	if(pwm<0x20)
	{
	  pwm=0x20;		
	}
	if(pwm>0x800)
	{
	  pwm=0x800;	
	}
	EvaRegs.T1CMPR = pwm;     // 比较	
	ek2=ek1;
	ek1=ek;	
	EDIS;
}


/**************************************/
interrupt void mrinta_isr(void)     // McBSP-A
{
	PieCtrl.PIEACK.bit.ACK6 = 1;
	if(Mcbsp_RxRdy() == 1)
	{
		RevBuffer[datarevlength] = McbspRegs.DRR1.all;
		datarevlength++;

	}
	EINT;
}



void delay(unsigned int m)
{
    unsigned int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<1500;j++)
		{}
	}
}


/***********************************************************************/
//	No	more
/***********************************************************************/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -