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

📄 1phase.c

📁 是用于开关磁阻电机的位置伺服控制的C语言源代码,基于CCS的开发环境.这个程序主要是用来测试你的硬件连接问题的,希望可以对你有所帮助
💻 C
字号:
#include "C240.h" 
/* define constant value */         
#define FALSE 0
#define TRUE  1
#define VELOCITY_CONST 1562500       /* Velocity contant */
/* define variable */
unsigned int IA_max,IB_max,IC_max;   /* MAX limit for current */
unsigned int IA_min,IB_min,IC_min;   /* MIN limit for current */
unsigned int I_MIN,I_MAX;
unsigned int ADC_channel;            /* Channel for A/D convert */
static unsigned int  PBvalue[2][3]=
  {{0x0701,0x0701,0x0701},{0x0701,0x0701,0x0701} };   
int display_times;                   /* accumulation for display */
int capture1,capture2,capture3 ; 
int A_capflag;
int input_state;                     
int sign_state ;                     /* 1 is clockwise,0 is anticlockwise  */
int dot_state;                       
int inputdata_num;                   /* number of input data */
int start_mode; 
int run_state;                     
int T3overflow_counter;              /* T3 overflow times */     
unsigned int angle_on;               /* fire angle */
unsigned int angle_off;              /* cut off angle */
unsigned int angle;
unsigned int input_value;            /* input data value */
unsigned int input_dotbit;           /* the radix bit of input data value */
unsigned int position_value;         /* the display value of position */
unsigned int position_dotbit;        /* the radix bit of position's display value */
unsigned int position;               /* the value of position */
unsigned int velocity_value;         /* the display value of velocity */
unsigned int velocity_dotbit;        /* the radix bit of velocity's display value */
int display_order=1,int_count=0;                 /* 1 while display velocity ,2 while display current ,3 while display input data */
/* define Input/Output variable value */
ioport unsigned int port0,port1,port2,port3,port4,port5; 
/* define structure type and variable value */  

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

/*********************************************/                  
void dsp_setup() 
{
 unsigned int temp;
 /*********************************************/
 /* Disable watchdog timer */
 /*********************************************/
 temp = WDCR;
 temp = temp|0x68;
 WDCR = temp;
 /*********************************************/
 /* initialize PLL module (20 MHz XTAL1) */
 /*********************************************/
 CKCR1 = 0x60;      	             /* crystal=20MHz CPUCLK = 20MHz */
                    	             /* and 1x PLL mult ratio */
 CKCR0 = 0xc3;      	             /* low–power mode 0, */
                    	             /* ACLK enabled, */
                                 	 /* PLL enabled, */
                    	             /* SYSCLK=CPUCLK/2 */
 SYSCR = 0x40c0;  
 
 XINT1CR=0x0006;
}
 

/* Initiate the event management register */
void eventmgr_init()
{
 
 GPTCON=0x0042;  
 /* Initialize PWM */
 /* Period is 200us */          
  ACTR=0x09aa;
 CMPR1=0x01f4;
 CMPR2=0x01f4;
 CMPR3=0x01f4;
 DBTCON=0x0000;
 COMCON=0x4a57;
 COMCON=0xca57; /*pwm enable*/
 T1PER=0xfa0;   
 T1CON=0x0000; 
 T1CON=0x910e; 
 /* Initial timer  2 */
 /*T2CNT=0x00;
 T2PER=0x0190;                        T2PER=200 ,ADC period is 40us  
 T2CON=0x9100; 
 T2CON=0x9140;*/ 
 /* Setup shared pins */
 OCRA = 0xf800;     	             /* pins IOPB0–IOPB3 & IOPA0–IOPA2 to I/O pins */
 OCRB = 0x00f1;      	             /* pins are: ADSOC, XF, /BIO, CAP1–CAP4 */ 
 PADATDIR = 0x0707;                  /* outputs IOPA0–IOPA2, set high */ 
 PBDATDIR = 0x0700; 	             /* outputs IOPB0–IOPB2, set low */
 /* Initialize T3 */
 T3CNT=0x0;
 T3PER=0xffff;
 T3CON=0x9440;                       /* Prescaler=/16 */
 /* Setup capture units */
 CAPCON = 0x0;    	                 /* reset capture control register */   
 
 CAPFIFO= 0x0ff;                     /* Clear FIFO’s */
 CAPCON = 0xb6fc;                  /* enable #123, use Timer3, both edges */ 
 /*CAPCON = 0xb654;*/                    /* cap high edge */
 /* Setup ADC units */  
 ADCTRL1=0xc904;                     /* enable ADC1,use channel 2,and enable ADCINT */
 ADCTRL2=0x0005; 
 ADCTRL1=0xca05;    
 T1CON=0x914e;                       /* enable PWM output */
} 

/*******************************************************************/
void disable_interrupts()
{
 asm(" SETC INTM");
}

/************************************************************************/
void enable_interrupts() 
{
 IFR  = 0xffff;                      /* Clear pending interrupts */
 IFRA = 0xffff;
 IFRB = 0xffff;
 IFRC = 0xffff;
 IMR  = 0x000a;                      /* Enable CPU Interrupts:INT 2,3,4 */
 IMRA = 0x0080;                      /* Enable timer 1 period  interrupts */
 IMRB = 0x0010;                      /* Enable timer 3 period and compare interrupts */
 IMRC = 0x0007;                      /* Enable CAP123 interrupts*/
 asm(" CLRC INTM");                  /* Global interrupt enable */
}

/* initiating parameter and register */
void init_SRM()
{
 velocity_value=0;
 velocity_dotbit=4;
 position_value=position=0;
 T3overflow_counter=0;
 position_dotbit=4;
 input_value=0; 
 input_dotbit=4;
 display_times=0;
 input_state=FALSE; 
 dot_state=FALSE;
 display_order=3;
 inputdata_num=0;
 start_mode=TRUE; 

 ADC_channel=2; 
 /* 0x8000 is 2.5v,0A ;1A is corresponding to the delta of 0x3d6 or 982*/  
 I_MAX=0x8f58;  /* 4A,  Voltage from LEM is 2.78v */
 I_MIN=0x8d6d;  /* 3.5A,  Voltage from LEM is 2.659V */
   
}


/********************************************************** */
/* READ CAPTURE FIFO REGISTERS 
/* This routine is used to read the data from the capture FIFO
/* registers.
/*
/* inputs: capture = which FIFO to read?
/* range = 1–3
/* outputs fifo_data =
/* range = 0–65535
/********************************************************* */
/* ISR for GPT1 interrupt */
void c_int2()
{int watch_IRR;
  watch_IRR=IFR;
 IFR=0x0002;
  watch_IRR=IFR;                      /* clear CPU interrupt flag */
 if (watch_IRR=36)
    IFR=0x0004;
    watch_IRR=IFR;  
 IFRA=0x7ff;
 watch_IRR=IFRA;
 display_times++;

}
  
/* ISR for CAP unit interrupt */
void c_int4()
{
 int groupc_flags;
 int capture; 
 struct CAP_INT * p,* p1;
 IFR=0x0008;                         /* clear CPU interrupt flag */
 groupc_flags = IFRC;
 int_count++; 
 if (1)             
	{ if (groupc_flags & 0x1)             /* read event manger interrupt */ 
	 	{ 
	 	 /* capture #1 */
	   	 IFRC = 0xf9;                    /* clear flag register */
		 capture = 1;
		 if (A_capflag)  
			 PBDATDIR=0x0701  ;  
		 }
	 else if (groupc_flags & 0x2)        /* read event manger interrupt */ 
	 	{ 
	 	 /* capture #1 */
	   	 IFRC = 0xfa;                    /* clear flag register */
		 capture = 2; 	  
		 A_capflag=1;	  
		 PBDATDIR= 0x0702 ; 	  
		 } 
	 else if (groupc_flags & 0x4)              /* read event manger interrupt */ 
	 	{ 
	 	 /* capture #1 */
	   	 IFRC = 0xfc;                    /* clear flag register */
		 capture = 3; 
		 A_capflag=1;
	     PBDATDIR= 0x0704 ; 
		 }
	 else
		{
		/* not a valid capture */
		IFRC = 0xff;
		capture = 0;
		 } 	 		  
	 T3overflow_counter=0;
	}
 else 
    IFRC = 0xff;  	
}
  
/*************************************/     
void keyboard_ISR() 
{int i; 
 unsigned int scan_in,scan_out,x2;
 int row,column=0,key_NO;   /* row=0,1,2;  column=1,2,3,4 */
 row=4;
 for(i=0;i<7500;i++);
 scan_in=port5;
 x2=scan_in & 0x0f;
 if (x2!=0x0f)
 {              
 switch(x2)
 	{
 	 case 0x0e: column=4; 
 	            break;
 	 case 0x0d: column=3;
 	 			break;
 	 case 0x0b: column=2;
 	 			break;
     case 0x07: column=1;
     			break;
     default  : column=17;
    }
 scan_out=0x0f7;
 port0=scan_out;            /* scan keyboard */
 for(i=0;i<1000;i++);
 scan_in=port5; 
 while ((scan_in & 0x0f)==0x0f)
 	{
 	 scan_out=scan_out>>1;
 	 port0=scan_out;
 	 for(i=0;i<1000;i++);  
 	 scan_in=port5;
 	 row--;
 	 if (row==0)
 	 	{
 	 	 row=17;
 	 	 break;
 	 	}
 	}
 key_NO=4*(row-1)+column; 
 port0=0x00;
 x2=port5;
 while ((x2&0x0f)!=0x0f)
 	{
 	x2=port5;
 	port0=0x00;
 	}
 for(i=0;i<7500;i++);
 x2=port5;
 while ((x2&0x0f)!=0x0f)
 	{
 	x2=port5;
 	port0=0x00;
 	} 
 switch(key_NO)
 	{  
     case 1  :
     case 2  :
     case 3  :
     case 4  :
     case 5  : 
     case 6  :
     case 7  : 
     case 8  :
     case 9  :
     case 10 :  if (input_state==FALSE)                 /* deal with data keyboard */
                	break;
                if (dot_state)       
                	input_dotbit--;
                input_value=input_value*10+key_NO-1;
                inputdata_num++;             
                break;
     
     case 11 : if (input_state==FALSE)                  /* deal with radix point keyboard */
     			   break;
     		   if (dot_state)
     		   	   break;
     		   if (inputdata_num!=0)
     		      {
     		       input_dotbit=3; 
     		       dot_state=TRUE;
     		       break;
     		       }    		      
     		       
     case 12 : if (input_state==FALSE)                 /* deal with data keyboard */
                	break;
               sign_state++;           
               if (sign_state==2)
                  { sign_state=0; 
                    /*PBDATDIR = 0x0704; */ 
                    A_capflag=0; 
                    CAPCON = 0xb6a8;              /* cap rising edage */
                    } 
               else 
                  { 
                    /*PBDATDIR = 0x0702;*/  
                    A_capflag=0;                 
                    CAPCON = 0xb654;              /* cap falling edage */
                     }
               break;  
     case 13 : disable_interrupts(); 
               run_state=0;             
               A_capflag=0; 
               sign_state=1; 
               CAPCON = 0xb654;                    /* cap falling edge */               
               input_state=TRUE;
               capture1=capture2=capture3=1;  
               PBDATDIR = 0x0701; 	  /* outputs IOPB0–IOPB2, IOPB0 set high */ 
               enable_interrupts();                                                      
               break;
     case 14 : display_order++;
               if (display_order==4)
                   display_order=1;
     		   break;
     case 15 : 
               run_state=1;                     
               if (sign_state) 			 
                  PBDATDIR = 0x0702;
               else 
                  PBDATDIR = 0x0704;                                       
     		   break;
     case 16 : run_state=0; 
               PBDATDIR = 0x0703; 	  /* outputs IOPA0–IOPA2, IOPA0 set high */
               break;
 	 default : break;               
 	}
 }	
}  
/***************************/
void c_int6()   
{
  IFR=0x0020;}
 

/* ***************************************************************** */
/* The main program  
/* ***************************************************************** */
main()
{
 unsigned int x1;
 disable_interrupts();
 dsp_setup();
 eventmgr_init(); 
 init_SRM(); 
 enable_interrupts(); 
 PADATDIR = 0x0701;             
 /*PBDATDIR = 0x0702;
 PBDATDIR = 0x0704;             
 PBDATDIR = 0x0701; 
 PBDATDIR = 0x0702;
 PBDATDIR = 0x0704;  */  
 for(;;)
    {/*PADATDIR = 0x0701;
     PBDATDIR = 0x0701; 
     PADATDIR = 0x0702;
     PBDATDIR = 0x0702;
     PADATDIR = 0x0704;
     PBDATDIR = 0x0700;
	port0=0x00;*/}
 	
    }

⌨️ 快捷键说明

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