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

📄 main.c

📁 是用于开关磁阻电机的位置伺服控制的C语言源代码,基于CCS的开发环境.希望可以对你有所帮助.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 ADC_channel;            /* Channel for A/D convert */
int display_times;                   /* accumulation for display */
int input_state;                     
int sign_state ;
int dot_state;                       
int inputdata_num;                   /* number of input data */
int start_state;
int revert_state;
int start_mode;                      
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;                 /* 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 */  
struct CAP_INT
	{
	 unsigned int PB_value;          /* the value of I/O port B */
	 unsigned int CAP_value;         /* the capture value of CAP unit */
	 unsigned long delta_count;      /* the delta value of 2 times ajacent capture value */
	 int          phase_A;           
	 struct  CAP_INT * next;
	};
struct CAP_INT * CAP_p,* angle_p; 

/*********************************************/
/* Creat circle linkage table for CAP */
struct CAP_INT * creat_link()
{
 int i;
 struct CAP_INT * h,* p;             /* pointer h point to virtual value  */
 h=(struct CAP_INT *)malloc(sizeof(struct CAP_INT));
 h->next=h;
 for(i=1;i<=5;i++)
 	{
  	p=(struct CAP_INT *)malloc(sizeof(struct CAP_INT));
  	p->PB_value=0;
  	p->CAP_value=0;
  	p->delta_count=0;
  	p->phase_A=FALSE;
  	p->next=h->next;
  	h->next=p;
 	}
 return (h);                         /* return head pointer */
}  
                                               
/*********************************************/                  

/*********************************************/                  
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=0x0007;
}
 

/* Initiate the event management register */
void eventmgr_init()
{
 
 GPTCON=0x0442;  
 /* Initialize PWM */
 /* Period is 200us */          
 ACTR=0x09aa;
 CMPR1=0x07d0;
 CMPR2=0x07d0;
 CMPR3=0x07d0;
 DBTCON=0x0000;
 COMCON=0x4a57;
 COMCON=0xca57;
 T1PER=0xfa0;   
 T1CON=0x0000; 
 T1CON=0x910e; 
 /* Initial timer  2 */
 T2CNT=0x00;
 T2PER=0xffff;
 T2CON=0x8000;
 /* 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 low */
 PBDATDIR = 0x0704; 	             /* outputs IOPB0–IOPB2, set high */
 /* 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 = 0xa6c0;                    /* enable #1, use Timer3, both edges */    
 /* enable PWM output */
 T1CON=0x914e; 
} 

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

/************************************************************************/
void enable_interrupts() 
{
 IFR  = 0xffff;                      /* Clear pending interrupts */
 IFRA = 0xffff;
 IFRB = 0xffff;
 IFRC = 0xffff;
 IMR  = 0x002e;                      /* Enable CPU Interrupts:INT 2,3,4 */
 IMRA = 0x0080;                      /* Enable timer 1 period  interrupts */
 IMRB = 0x0010;                      /* Enable timer 3 period and compare interrupts */
 IMRC = 0x0001;                      /* Enable CAP1 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; 
 sign_state=FALSE; 
 dot_state=FALSE;
 display_order=3;
 inputdata_num=0;
 start_mode=TRUE;
 start_state=FALSE;
 revert_state=FALSE;    
}


/********************************************************** */
/* 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
/********************************************************* */
unsigned int read_fifo(int capture)
{
 unsigned int fifo_data;
 int fifo_status;
 if (capture == 1) 
	{
	 do {
		fifo_data = FIFO1;                /* read value */
		fifo_status = CAPFIFO & 0x0300;   /* read status register, mask bits */
		} 
	 while (fifo_status != 0);
	}
 else 
		fifo_data = 0xffff;    	   /* error, not a valid capture */
 return fifo_data;
}
/* ISR for GPT1 interrupt */
void c_int2()
{
 IFR=0x0002;                       /* clear CPU interrupt flag */
 IFRA=0x7ff;
 display_times++;
}
 
/* ISR for GPT3 interrupt */
void c_int3()
{ 
 int groupb_flags;
 IFR=0x0004;                       /* clear CPU interrupt flag */
 groupb_flags=IFRB;
 if (groupb_flags & 0x20)     /* if GPT3 compare interrupt */
    {
     IFRB=0x0ef;                       /* clear interrupt flag */
     CAP_p=CAP_p->next;
     PBDATDIR=CAP_p->PB_value;
 	if (angle==1)
 		{
 		 angle=2;
 		 T3CMP= angle_off;
    	 T3CON=0x944a;
 		 CAP_p->delta_count=0;
 		}
 	else
 		{
 		 IMRB = 0x0010;
 	 	 T3CON=0x9440;       /* Disable timer 3  */	    	
  		 angle=3;
  		}
  	}	
 else if (groupb_flags & 0x10)     /* if GPT3 period interrupt */
 	{
 	 IFRB=0x0df;                  /* clear interrupt flag */
 	 T3overflow_counter++;
 	} 
 else
 	 IFRB=0x0ff;                   /* not a valid interrupt */ 	
}  


/* ISR for CAP unit interrupt */
void c_int4()
{
 int groupc_flags;
 int capture;
 struct CAP_INT * p,* p1;
 unsigned int PB_x;  
 IFR=0x0008;                         /* clear CPU interrupt flag */
 groupc_flags = IFRC;              
 if (groupc_flags & 0x1)              /* read event manger interrupt */ 
 	{ 
 	 /* capture #1 */
   	 IFRC = 0xff;                    /* clear flag register */
	 capture = 1;
	 if (start_mode)
		{
		 p=CAP_p; 
         CAP_p=CAP_p->next;
		 CAP_p->CAP_value = read_fifo(capture); /* read FIFO */
		 CAP_p->delta_count = CAP_p->CAP_value+T3overflow_counter*65536 - p->CAP_value;   
		 PBDATDIR=CAP_p->PB_value;
	     position=position+75;        /* accumulate position */   
		 if ((CAP_p->delta_count>1000)&&(CAP_p->delta_count<=3750)&&(CAP_p->phase_A)&&(start_mode)&&0)        /* if speed > 200rad/s  */         
    	 	{start_mode=FALSE;
    	 	 p1=(CAP_p->next)->next; 
             angle_on=CAP_p->CAP_value+CAP_p->delta_count+p->delta_count-(p1->delta_count+(p1->next)->delta_count)>>1;
             /* Setup capture units */
             IFRB=0x0ef;
   	 	     T3CMP= angle_on;
             T3CON=0x944a;
             IMRB = 0x0030;
             CAPCON = 0x0;    	      /* reset capture control register */
             CAPFIFO= 0x0ff;
             if (sign_state)
   	 	     	CAPCON = 0xa680;         /* enable #1, use Timer3, low edges */    
   	 	     else
   	 	     	CAPCON = 0xa640;         /* enable #1, use Timer3, high edges */    
   	 	     angle_off=angle_on+(((CAP_p->delta_count+p->delta_count)<<1)-p1->delta_count+(p1->next)->delta_count)/5;
   	 	     angle=1;
   	 	     angle_p=CAP_p;
   	 	     angle_p->delta_count=CAP_p->delta_count+p->delta_count;
   	 	    }
	    }
     else
     	{
 	     if (angle==2)
     	 	{ 
     	 	 IMRB = 0x0010;
     	 	 IFRB=0x0ef;
     	 	 T3CON=0x9440;
     	 	 CAP_p=CAP_p->next; 
     	 	} 
     	 if (angle==1)
     	 	{ 
     	 	 IMRB = 0x0010;
     	 	 IFRB=0x0ef;
     	 	 T3CON=0x9440;
     	 	 CAP_p=(CAP_p->next)->next;       
     	 	}
     	 CAP_p->CAP_value = read_fifo(capture); /* read FIFO */
         CAP_p->delta_count = CAP_p->CAP_value +T3overflow_counter*65536-angle_p->CAP_value;   
		 angle_on=CAP_p->CAP_value+ (CAP_p->delta_count-(angle_p->delta_count>>1));
		 IFRB=0x0ef;
   	 	 T3CMP= angle_on;
         T3CON=0x944a;
         IMRB = 0x0030;
		 angle=1; 
   	 	 position=position+150;        /* accumulate position */
     	 angle_off=angle_on+((CAP_p->delta_count<<1)-angle_p->delta_count)/5;
   	     angle_p=CAP_p;   
     	}
     
     if ((CAP_p->delta_count>=0x3fff)&&(revert_state))
     	{
     	 p=CAP_p->next;
     	 p=p->next; 
     	 p=p->next;
     	 p=p->next;
     	 p1=CAP_p->next;
     	 p1=p1->next;
     	 PB_x=p->PB_value;
     	 p->PB_value=p1->PB_value;

⌨️ 快捷键说明

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