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

📄 main.c

📁 这是dsp2407编程测试例子,需要CCS2开发平台,对学习电机控制很有帮助.用c开发.
💻 C
字号:
/*Main.c*/ 
#include "global.c" 
#include "math.h"
void SystemInit();
void enbleint(); 
void KickDog(); 
void AddSpeet1();//
void AddSpeet2();
void PWMT_Init(); 
void T4PWM_Init();
//void T2PWM_Init();
void  QEPINT();
void IOPC3_G();
void IOPC3_D();

void IOPC1_Int();
void IOPC1_D();
void IOPC1_G();
void Closed_LoopT4(int cw,unsigned p);  //cw=1为顺时

void IOPF3_P(); //用IO口作步进电机的脉冲输出.
void IOPF3_PG(); //IOPF3作输出高.
void IOPF3_PD(); //IOPF3作输出低.


void delay(unsigned int i);
void delay_nms(unsigned   int i);
void delay_1ms(void);

unsigned int j;
volatile unsigned int pnum=200;
unsigned int base=30000;
int flag=0,temp=40,temp1;
//volatile unsigned int temp;
main()
{  
      int t;
      SystemInit(); 
      QEPINT();        
     //IOPC3_G();    //LED                 
      PWMT_Init();                
     //AddSpeet1();  //加速    
      AddSpeet2(); 
           
     //enbleint();   //开总INT     
     //T4PWM_Init();     
     //T3CON|=0x0040;       //开T3
    
   //----------------用IO输出脉冲驱动电机测试(原来的T4PWM)---------
        IOPC1_Int();
        IOPC1_D(); //方向
        
        IOPF3_P();   
          for(t=1;t<=100;t++) 
          {
           Closed_LoopT4(1,100);
            delay_nms(5);
           Closed_LoopT4(2,100);
             delay_nms(5);
           }  
      
  //----------------用IO输出脉冲驱动电机测试(原来的T4PWM)---     
 
           while(1)
          {                               
          }                                           
       
           	   	  	   		   	  			
   } 


void SystemInit() 
{  
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
	SCSR1=0x83FE;         	/* 系统时钟CLKOUT=20*2=40M */
							/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
	WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
	KickDog();    			/* 初始化看门狗 */  
    IFR=0xFFFF;				/* 清除中断标志 */
    IMR=0x0000;			    // 禁止中断2*/   
    WSGR=0x00;              // 禁止所有的等待状态 
}  
//利用比较单元产生PWM(T1,T3)
void PWMT_Init()           
{ 
//**************************
   // IFR=0x0FFFF;			
   // IMR = 0x02;      //开INT2
   // EVBIFRA = EVBIFRA|0x0002; //清除比较单元4中断标志
   // EVBIMRA = EVBIMRA|0x0002; //比较单元4使能   
//**************************
     MCRC=MCRC|0x000A; //PE1,PE3为PWM口
     ACTRB=0x0032;    //逆转(对电机而言)
    // ACTRB=0x0002;     //顺转(对电机而言)
     DBTCONB=0x0;      //不使能死区控制
   //T3PR=2000;		   //定时器1周期值,定时0.4us*2500=1ms   
   //CMPR4=1000;       //比较值
     CMPR5=0x0D350;    //比较值>T1PR PWM9为强制高或 强制底
 	 COMCONB=0x8200;   //比较控制寄存器,使能比较操作
	 T3CNT=0x0; 	
	 T3CON=0x1440;     //增模式, TPS系数40M/16=2.5M, 
	 	 	 	 	 
 //**************************	
	  MCRA=MCRA|0x0098;	      //PWM2,QEP1,QEP2	 
      ACTRA=0x0C04;           //逆转(转向已取消)
     // ACTRA=0x0004;         //顺转 (转向已取消)
      DBTCONA=0x0;		      // 不使能死区控制
     //T1PR=2000;		      //定时器1周期值,定时0.4us*2500=1ms   
     //CMPR1=1000;            //比较值
     //CMPR3=0xD350;          //比较值>T1PR PWM9为强制高或 强制底
 	  COMCONA=0x8200;         //比较控制寄存器
	  T1CNT=0x0; 	
	  T1CON=0x1440;           //增模式, TPS系数40M/16=2.5M,
//--------------------- 	
      MCRB=MCRB&0x0FFCF;   //利用IOPC4口做方向信号
      PCDATDIR=PCDATDIR|0x3000;   
	//PCDATDIR|=0x0030;   //gao顺	  
	  PCDATDIR&=PCDATDIR&0xFFCF;   //di逆	  
//************************ 	  			
} 

void AddSpeet1()
{
 for( j=1200;j>=60;j--)
   {	
        
      T1PR=40*j;			 
      CMPR1=20*j;        	 
      T3PR=40*j;			 
      CMPR4=20*j;    
      delay(100);
    }              
}

void AddSpeet2()
{
     
     T1PR=10000;				//定时器1周期值,定时0.4us*2500=1ms   
     CMPR1=5000;              //比较值
//-----------------
     T3PR=10000;				//定时器3周期值,定时0.4us*2500=1ms   
     CMPR4=5000;              //比较值    
}

//-------------IOPC1初始化及设置例子----------------------------//
void IOPC1_Int()
{
MCRB&=0x0FFFD;   //IOPC1 为输出IO
PCDATDIR|=0x0200; 
}

void IOPC1_G()
{

PCDATDIR|=0x0002; //IOPC1致高
}

void IOPC1_D()
{
PCDATDIR&=0xFFFD; //IOPC1致底
}
//-------------IOPC1初始化及设置例子----------------------------//


//编码器初始化
void  QEPINT()
{
	T2PR=0X0FFFF;     // 通用定时器2的周期寄存器为0XFFFF
	T2CON=0X1870;     // 通用定时器2为定向增减计数模式, 并且以正交编码脉冲电路作为时钟源
	T2CNT=30000;      // 即<3000为反转,>3000为正转 
   // WSGR=0x0000;    // 不使能所有的等待状态    
	CAPCONA=0XE000;   // 使能EVB的QEP电路
} 

void enbleint()
{
	asm(" CLRC INTM "); 
}

//利用定时器4比较中断产生PWM(T4)
void T4PWM_Init()
{ 
    //IFR=0x0FFFF;			
    //IMR = 0x04;      //开INT3
     EVBIFRB = EVBIFRB|0x0002; //清除比较单元4中断标志
     EVBIMRB = EVBIMRB|0x0002; //定时器4比较单元使能
    
	 MCRC=MCRC|0x0800;    //选T4PWM	  
     GPTCONB=0x0044;
     T4PR=10000;				//定时器2周期值,定时0.4us*2500=1ms   
     T4CMPR=5000;
     T4CNT=0x0;		
   	 T4CON=0x144A;

}

void IOPF3_P() //用IO口作步进电机的脉冲输出.
{
MCRC&=0xF7FF; //IOPF3为IO口.
PFDATDIR|=0x0808; //IOPF3作输出.
}

void IOPF3_PG() //IOPF3作输出高.
{
PFDATDIR|=0x0008; 
}

void IOPF3_PD()
{
PFDATDIR&=0xFFF7; //IOPF3作输出低.
}

void Closed_LoopT4(int cw,unsigned p)  //cw=1为顺时
{

if(cw==1)
{
IOPC1_D();  //顺时钟
while(abs(T2CNT-base)<p*5)
{
IOPF3_PG();
delay(114);  //456=1ms
IOPF3_PD();
delay(114);
}
T2CNT=30000;

}

if(cw==2)
{
IOPC1_G();  //逆时钟
while(abs(T2CNT-base)<p*5)
 {
  IOPF3_PG();
  delay(114);  //456=1ms
  IOPF3_PD();
  delay(114);
  } 

T2CNT=30000;

}

}


void IOPC3_G()//LED
{
 MCRB=MCRB&0xFFF7;  //PC3=IO
 PCDATDIR|=0x0808; //高
}
void IOPC3_D()//LED
{
 MCRB=MCRB&0xFFF7;  //PC3=IO
 PCDATDIR|=0x0800; //底

}


void interrupt PHANTOM()
{ 
return; // 中断直接返回
}

void KickDog()			
	/*踢除看门狗 */
{
	WDKEY=0x5555;
	WDKEY=0xAAAA;
}

//为全比较单元中断程序(用T3)
void interrupt c_int2()  
            
{

	int flag; // 定义一个局部变量
	flag=EVBIFRA&0x0002;
	if(flag!=0x0002)
	{
    	asm(" CLRC	INTM "); // 允许总中断
		return; // 如果不是定时器1周期中断,则直接返回
	}	
	temp--;
	if(temp==0)
	{
	T3CON&=0xFFBF; 
	temp=40;
	asm(" SETC	INTM "); 
	return;
	}
							
     /* temp = T2CNT/4;
         if(temp>=8500&&temp<=8525||temp>=6500&&temp<=6525)
	     {	
         T3CON&=0xFFBF; 
         T1CON&=0xFFBF;	
         }*/        		
        //T3CNT=0;
         	
		EVBIFRA|=0x02; 
	   asm(" CLRC	INTM "); 	
		return;	
}
/*---------------------------------------延时函数-------------*/ 
void delay(unsigned int i)    //第一次6US,以后就是2US一次
{
     unsigned int j;
    for(j=1;j<i;j++)
    { asm(" nop"); }
}

void delay_nms(unsigned   int i)  //每一次1MS
{
     unsigned  int j;
     for(j=1;j<=i;j++)
    {  delay(456); }
}

void delay_1ms(void)
{
    delay_nms(1);
}

/*---------------------------------------延时函数-------------*/

/*//利用定时器比较单元产生PWM(T4)
void T4PWM_Init()
{   
	 MCRC=MCRC|0x0800;    	  
     GPTCONB=0x0044;
     T4PR=1500;				//定时器2周期值,定时0.4us*2500=1ms   
     T4CMPR=750;
     T4CNT=0x0;		
   	 T4CON=0x144A;

}*/

/*void T2PWM_Init()//T2已用于QEP
{
    // IFR=0x0FF;			
    // IMR = 0x04;
   // EVAIFRB = EVAIFRB|0x0001;
  //  EVAIMRB =EVAIMRB|0x0001; 
	 MCRA=MCRA|0x2000;   	  
     GPTCONA=0x0048;
     T2PR=4000;				//定时器2周期值,定时0.4us*2500=1ms   
     T2CMPR=2000;
     T2CNT=0x0;		
   	 T2CON=0x144A;

}*/

//定时器4比较中断
/*void interrupt c_int3()              
{
  if(PIVR!=0x3A)
		{  	asm(" CLRC INTM ");
			return;
		}
			
		numled--;
	if(numled==0)
	{
		numled=500;
		if((PCDATDIR&0x0004)==0x0004) 
		    PCDATDIR&=0xFFFB;    //IOPC2致底		     			
		else
			PCDATDIR|=0x0004;     //IOPC2致高
	    //  T3CON&=0xFFBF; 
        // T1CON&=0xFFBF;			
		
        	
	}
	
//T3CNT=0; 	
		EVBIFRB|=0x02; 

	asm(" CLRC	INTM "); 
	
		return;	
}
*/

//定时器4比较中断
/*void interrupt c_int3()              
{
   //  int  temp;
      if(PIVR!=0x3A)
		{  	
		   asm(" CLRC INTM ");
		   return;
		}
					
      /*  temp = T2CNT/4;
        // if(temp>=8500&&temp<=8525||temp>=6500&&temp<=6525)
        if(temp==6500)  //基准点为7500--- 逆减 顺大
	     {	
         T3CON&=0xFFBF; 
         T1CON&=0xFFBF;
         T4CON&=0xFFBF;	        
         }
     //	temp = T2CNT; 
       //qeudata=qeudata-20;               	
       	
     //	if(temp==qeudata-20)
     //	    {
     	//	  pnum--; 
     	//	  if( pnum==0)
     	//	    flag=1;
     	//	}
     		        		
        T4CNT=0; 	
		EVBIFRB|=0x02; 
    	asm(" CLRC	INTM "); 	
		return;	
}*/

⌨️ 快捷键说明

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