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

📄 main0523b.c

📁 是用于开关磁阻电机的位置伺服控制的C语言源代码,基于CCS的开发环境.希望可以对你有所帮助.
💻 C
字号:
#include "C240.h" 
#define TRUE   1
#define FALSE  0
#define VELOCITY_CONST 3125000  
/* 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 input_state;
int run_state;
int dot_state;  
int inputdata_num;
unsigned long input_value;
unsigned int input_dotbit;
/* 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; 
 /* No period interrupt start A/D */ 
 /* Initialize PWM */
 /* Period is 100us */          
 ACTR=0x0fff;
 COMCON=0x4a57; 
 /*ACTR=0x0aaa;
 CMPR1=0x01f4;
 CMPR2=0x01f4;
 CMPR3=0x01f4;
 DBTCON=0x0000;
 COMCON=0x4a57;
 COMCON=0xca57;*/
 T1PER=0x07d0;   
 T1CON=0x0000; 
 T1CON=0x910e; 
 T1CON=0x914e; 
 /* Setup shared pins */
 OCRA = 0xf800;     	             /* pins IOPB0–IOPB3 & IOPA0–IOPA2 to I/O pins */
 OCRB = 0x00f0;      	             /* pins are: ADSOC, XF, /BIO, CAP1–CAP4 */ 
 PCDATDIR=0x0701;
 PBDATDIR = 0x0700;
 /* outputs IOPB0–IOPB2, set low */
 PADATDIR = 0x0707; 	             /* outputs IOPA0–IOPA2, set high */
 } 

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

/************************************************************************/
void enable_interrupts() 
{
 IFR  = 0xffff;                      /* Clear pending interrupts */
 IMR  = 0x0020;                      /* Enable CPU Interrupts:INT 2,3,6 */
 IMRA = 0x0;                      /* Enable timer 1 period  interrupts */
 IMRB = 0x0;                         /* Enable timer 3 period */
 IMRC = 0x0;
 /* start ADC */
 ADCTRL1=0xcb04;
 ADCTRL2=0x0005;
 ADCTRL1=0xeb05;
 ADC_channel=2;
 asm(" CLRC INTM");                  /* Global interrupt enable */
}

/* initiating parameter and register */
void init_SRM()
{
 input_value=0;
 input_dotbit=4;
 input_state=FALSE; 
 dot_state=FALSE;
 inputdata_num=0;
 run_state=0;       /* 0,idle;1 while accelerate;3 while disaccelerate  */
 /*IA_max=IB_max=IC_max=0x8c00; /* 3.3A,  Voltage from LEM is 2.738V */ 
 /*IA_max=IB_max=IC_max=0x8800; /* 2.25A,  Voltage from LEM is 2.659V */ 
 /*IA_min=IB_min=IC_min=0x8700; /* 2A,Voltage from LEM is 2.642V */ 
 IA_max=IB_max=IC_max=0x83c0; /* 1.024A,  Voltage from LEM is 2.577V */ 
 /*IA_min=IB_min=IC_min=0x82b0; /* 0.774A,Voltage from LEM is 2.558V */ 
 IA_min=IB_min=IC_min=0x82c0; /* 0.774A,Voltage from LEM is 2.558V */ 
 }


/*********************************************/                  
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<5000;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  :  /* Stop at 0 */
                /*****************/
		    	 PBDATDIR=0x0701;
		         break;
     case 2  :   /* Stop at 2.5 */
		         /*****************/
		         IA_max=0x8ec0;   /* 4A,  Voltage from LEM is 2.792V */
		         IA_min=0x8e40;   /* 3.75A,Voltage from LEM is 2.781V */
		         IC_max=0x83C0; /* 1.024A,  Voltage from LEM is 2.577V */ 
		         IC_min=0x82c0; /* 0.774A,Voltage from LEM is 2.558V */ 
		         PBDATDIR=0x0705;
		         break;
     case 3  :   /* Stop at 5 */
		         /*****************/
		         IA_max=0x8ec0;   /* 4A,  Voltage from LEM is 2.792V */
		         IA_min=0x8e40;   /* 3.75A,Voltage from LEM is 2.781V */
		         IC_max=0x8800; /* 2.25A,  Voltage from LEM is 2.659V */ 
		         IC_min=0x8700; /* 2A,Voltage from LEM is 2.642V */ 
		         PBDATDIR=0x0705;
		         break;
     case 4  :   /* Stop at 7.5 */
                /*****************/
		    	 IA_max=0x8ec0;   /* 4A,  Voltage from LEM is 2.792V */
		         IA_min=0x8e40;   /* 3.75A,Voltage from LEM is 2.781V */
		         IC_max=0x8ec0;   /* 4A,  Voltage from LEM is 2.792V */
		         IC_min=0x8e40;   /* 3.75A,Voltage from LEM is 2.781V */
		         PBDATDIR=0x0705;
		         break;
     case 5  :   /* Stop at 10 */
                /*****************/
		    	 IA_max=0x8800; /* 2.25A,  Voltage from LEM is 2.659V */ 
		         IA_min=0x8700; /* 2A,Voltage from LEM is 2.642V */ 
		         IC_max=0x8ec0;   /* 4A,  Voltage from LEM is 2.792V */
		         IC_min=0x8e40;   /* 3.75A,Voltage from LEM is 2.781V */
		         PBDATDIR=0x0705;
		         break;
     case 6  :   /* Stop at 12.5 */
		         /*****************/
		         IA_max=0x83C0; /* 1.024A,  Voltage from LEM is 2.577V */ 
		         IA_min=0x82c0; /* 0.774A,Voltage from LEM is 2.558V */ 
		         IC_max=0x8ec0;   /* 4A,  Voltage from LEM is 2.792V */
		         IC_min=0x8e40;   /* 3.75A,Voltage from LEM is 2.781V */
		         PBDATDIR=0x0705;
		         break;
     case 7  :   /* Stop at 15 */
                /*****************/
		    	 PBDATDIR=0x0704;
		         break;
     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 : break;  
               
               /***********************/
               /* code for denote the reverse state */
               /***********************/                 
                                
     case 13 : disable_interrupts();
               eventmgr_init();
               init_SRM();
               enable_interrupts();     /* location SRM, fire phase A */
               PBDATDIR = 0x0707; 	  /* outputs IOPA0–IOPA2, IOPA0 set high */
               input_state=TRUE;
               break;
     case 14 : break;
     case 15 : run_state=1;
               break;
     case 16 :                    
               break;
 	 default : break;               
 	}
 }	
}  
/*************************************/

/*********************************************/ 
/* ISR for A/D and keyboard interrupt */
void c_int6() 
{
 
 unsigned int ADCfifo_data;
 int ADCfifo_status;
 IFR=0x0020;
 do {
	ADCfifo_data= ADCFIFO1;                /* read value */
	ADCfifo_status = ADCTRL2 & 0x0c0;   /* read status register, mask bits */
	} 
 while (ADCfifo_status != 0);
 switch(ADC_channel)
 {
 	case 2: if (ADCfifo_data>=IA_max)
		   		PADATDIR=PADATDIR & 0x070e;
		 	else if (ADCfifo_data<=IA_min)
			    PADATDIR=PADATDIR | 0x01;
		 	break;
    case 3: if (ADCfifo_data>=IB_max)
		   		PADATDIR=PADATDIR & 0x070d;
		    else if (ADCfifo_data<=IB_min)
			    PADATDIR=PADATDIR | 0x02;
            break;
    case 4: if (ADCfifo_data>=IC_max)
		   		PADATDIR=PADATDIR & 0x070b;
		    else if (ADCfifo_data<=IC_min)
			    PADATDIR=PADATDIR | 0x04; 
            break;
    default:break;
 }
 if (PCDATDIR & 0x01)
 	PCDATDIR=0x0700;
 else
 	PCDATDIR=0x0701;
 ADC_channel++;
 if (ADC_channel>4)
 	ADC_channel=2;
 ADCTRL1=0xca00 + (ADC_channel<<1);
 ADCTRL1=ADCTRL1 | 1;
 
 }
 
/* ***************************************************************** */
/* The main program  
/* ***************************************************************** */

main()
{
 unsigned int INT1_status;
 disable_interrupts();
 dsp_setup();
 eventmgr_init();
 enable_interrupts();
 for(;;)
	{	
	port0=0x00;
 	INT1_status=XINT1CR; 
 	if (INT1_status & 0x8000)
 		{   
 		keyboard_ISR();
 		XINT1CR=0x0006;
 		}
    
    }
}

⌨️ 快捷键说明

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