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

📄 main0601.c

📁 是用于开关磁阻电机的位置伺服控制的C语言源代码,基于CCS的开发环境.希望可以对你有所帮助.
💻 C
📖 第 1 页 / 共 2 页
字号:
 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;
               if (sign_state)                         /* deal with sign keyboard */
               	    sign_state=FALSE;
               else 
                 {
                 sign_state=TRUE;
                 position=0;
                 CAP_A=CAP_B=CAP_C=0;
                 CAP2_flag=FALSE;
                 CAP3_flag=FALSE;
                 run_state=1;
                 PBDATDIR=0x0702;
                 }
               break;                
     case 13 : init_SRM();
               /*input_value=360;*/
               PBDATDIR = 0x0701; 	  /* outputs IOPA0–IOPA2, IOPA0 set high */
               input_state=TRUE;
               break;
     case 14 : display_order++;
               if (display_order==4)
                   display_order=1;
     		   break;
     case 15 : 
               run_state=1;
               drive_SRM();
               break;
     case 16 :                    
               run_state=0;
               PBDATDIR = 0x0703; 	  /* outputs IOPA0–IOPA2, IOPA0 set high */
               break;
 	 default : break;               
 	}
 }	
}  
/*************************************/
/* ISR for A/D and keyboard interrupt */
void c_int6() 
{
 
 unsigned int ADCfifo_data,adc1data,channel;
 int ADCfifo_status;
 /*PCDATDIR=0x0700; */  
 IFR=0x0020;
 /*do {
 /*	ADCfifo_data= ADCFIFO1;                /* read value */
 /*	ADCfifo_status = ADCTRL2 & 0x0c0;   /* read status register, mask bits */
 /*	} 
 while (ADCfifo_status != 0);   */
 ADCfifo_data= ADCFIFO1;
 adc1data= ADCFIFO1;
 if (adc1data!=0)
 	ADCfifo_data=adc1data;	
 channel=ADCTRL1 & 0x0e;
 switch(channel)
 {
 	
    case 6: if (ADCfifo_data>=IB_max)
		   		PADATDIR=PADATDIR & 0x070d;
		    else if (ADCfifo_data<=IB_min)
			    PADATDIR=PADATDIR | 0x02;
			ADCTRL1=0xc908;
            ADCTRL1=0xca09;
            break;
    case 8: 
            if (ADCfifo_data>=IC_max)
	            PADATDIR=PADATDIR & 0x070b;
	        else if (ADCfifo_data<=IC_min)
			    PADATDIR=PADATDIR | 0x04;
			ADCTRL1=0xc904;
            ADCTRL1=0xca05;
            break;
    default:
    case 4: if (ADCfifo_data>=IA_max)
		   		PADATDIR=PADATDIR & 0x070e;
		 	else if (ADCfifo_data<=IA_min)
			    PADATDIR=PADATDIR | 0x01;
			ADCTRL1=0xc906;
            ADCTRL1=0xca07;
            break;
 }
 /*ADC_channel++;
 if (ADC_channel>4)
 	ADC_channel=2;
 ADCTRL1=0xca00 + (ADC_channel<<1);
 ADCTRL1=ADCTRL1 | 1;  */
 /*PCDATDIR=0x0701; */ 
 }
void SCI_init() 
{SCICCR=0x0017;                 /* 1 stop bit,no odd check,8 data bits,
                                   asynchronism mode,idle line */
 SCICTL1=0x0013;                /* inner clock,enable recive and transmit,disable 
                                   receive erro int ,sleep and woke */
 SCICTL2=0x0002;                /* enable recive int and disable transmit int */
 SCIHBAUD=0x0000; 
 SCILBAUD=0x002a;               /* Baud rate=28800 kbps */
 SCIPC2=0x0022;                 /* enable recive port and transmit port */
 SCICTL1=0x0033;                /* let SCI return from reset state */ 
 /*SCIPRI=0x0020;                 /* RX int is low-priority int */ 
 SCIPRI=0x0000; 
 } 

/* transmit data */
void mit()        
{int x3,TXRDY; 
 x3=SCICTL2; 
 for (;x3&0x0080==0;);
 if (x3&0x0080)
     {TXRDY=1;                  /* ready to receive next data to be transmited */
      SCITXBUF=TX_data;            /* transmit next data */ 
      }
 }
/* receive int and ISR */  
void receive_ISR()
{ unsigned int i,h ;
  switch (RX_data )           /* recive data is call code */  
       { case 'H' : 
	           for(;(SCICTL2 & 0x80)==0;);
	           TX_data ='A';       /* send back answer code */ 
	           mit() ;  	                                
	           break;  	             
         case 'Q':              /* receive start_command code  */	          
	           run_state=1;
               drive_SRM();  	             
	           break ;                                         
          case 'T':             /* recive stop_command code */ 
               /* stop SRM */                
                 run_state=0;
	            /*IMRC = 0x0;        disable CAP_int */          
                PBDATDIR = 0x0703; 	  /* outputs IOPA0–IOPA2, IOPA0 set high */
                break; 	               
          case 'F': 
               if (input_state==FALSE)                 /* deal with data keyboard */
                	break;
               if (sign_state)                         /* deal with sign keyboard */
               	    sign_state=FALSE;
               else 
                 {
                 sign_state=TRUE;
                 position=0;
                 CAP_A=CAP_B=CAP_C=0;
                 CAP2_flag=FALSE;
                 CAP3_flag=FALSE;
                 run_state=1;
                 PBDATDIR=0x0702;
                 }
               break;  
          case 'G':
                init_SRM();
               /*input_value=360;*/
               PBDATDIR = 0x0701; 	  /* outputs IOPA0–IOPA2, IOPA0 set high */
               input_state=TRUE;
                break;   	                         
          case 'R':                            /* recive require_resend code */ 
                TX_data ='N';          
                mit() ; 
                TX_data ='';          
                mit() ; 
                break;
          default:
                TX_data ='N';          
                mit() ; 
                TX_data ='';          
                mit() ;  
                break;
       } 
 }   
/**************************************/ 
 
/* display data on LCD */
void display(display_value,dot_bit)
unsigned long display_value;       	   /* the value want to be displayed */
int dot_bit;                      	   /* dot bit */
{
 unsigned long bit_value[4];
 unsigned int x,port1_value; 
 port1_value=0; 
 if (display_value>=2000)
 	port1_value=port1_value|0x40; 
 bit_value[3]=display_value%10;        /* the lowest bit data */
 bit_value[2]=(display_value/10)%10;
 bit_value[1]=(display_value/100)%10; 
 bit_value[0]=display_value/1000;      /* the highest bit data */
 if (bit_value[0]==1)
 	port1_value=port1_value|0x02; 
 if (sign_state)
 	port1_value=port1_value|0x01;  
 x=dot_bit;
 if ((x>=1)&&(x<=3)) 
 	port1_value=port1_value|(1<<(x+1));     /* show radix point */
 port1=port1_value; 
 if ((dot_bit!=1)&&(dot_bit!=2)&&(bit_value[0]==0)&&(bit_value[1]==0))
 	port2=0x0f; 
 else
    port2=bit_value[1];
 if (((dot_bit==3)&&(bit_value[1]==0)&&(bit_value[0]==0))||((dot_bit==4)&&(bit_value[0]==0)&&(bit_value[1]==0)&&(bit_value[2]==0)))
 	port3=0x0f; 
 else
    port3=bit_value[2];
 port4=bit_value[3];
                  
}
 
/* refresh LCD */
void LCD_refresh()
{
 unsigned long velocity;
 int i;
 struct CAP_INT * p1; 
 unsigned long delta_count; 
 if  (display_times>=1000)   
	{
	display_times=0;
	switch (display_order)
 	 	{
 	 	case 1: /* read velocity */
 	    	delta_count=0;
 	    	p1=CAP_p; 
 	    	for(i=1;i<=6;i++)
 	   			{
 	    		delta_count=delta_count+p1->delta_count;
 	    		p1=p1->next;
 	 			}
 	    	if (delta_count==0)
 	    		velocity=0;   
 	    	else
				velocity=VELOCITY_CONST*60/delta_count;
 	 		velocity_value=(unsigned int)velocity;
 	    	velocity_dotbit=4;
			display(velocity_value,velocity_dotbit);     
	    	break;
 	 	case 2: /* read position */
 	 		position=800; 
		    position_value=position;
 			if (position_value%10)
				{
				position_value=position;
			    position_dotbit=3;
				if (position_value>2000)
					{
					position_value=position/10;
					position_dotbit=4;
					}
				}
			else
				{
				position_value=position;
				position_dotbit=4;
				}                  
	 		display(position_value,position_dotbit); break; 
		case 3: display(input_value,input_dotbit); break;
		default: break; 
 		}
    }
}
/* ***************************************************************** */
/* The main program  
/* ***************************************************************** */

main()
{int i,x1;  
 int speed_now; 
 unsigned long velocity;
 unsigned int INT1_status;
 disable_interrupts();
 dsp_setup();
 eventmgr_init();
 init_SRM();
 enable_interrupts();
 for(;;)
	{	
	port0=0x00;
 	INT1_status=XINT1CR; 
 	if (INT1_status & 0x8000)
 		{   
 		keyboard_ISR();
 		XINT1CR=0x0006;
 		}   
 	/* deal with the RX event */
	
	/* deal with the TX event */    
	if (T1overflow_counter>=5)          /* sample time about speed is about 1ms */
 	   { T1overflow_counter=0; 	     
         if (CAP_p->delta_count==0)
         	velocity=0;   
         else
         	velocity=VELOCITY_CONST/CAP_p->delta_count;
 		 speed_now=(unsigned int)velocity; 
 		 if (run_state==0)
 		    endtime=endtime+1;
 		 if (endtime>=100 )
 		    {speed_now=0;	     		    
 		     run_state=10;} 
 		 if (speed_now>5)
	 	   { data=speed_now; 	 	 
	 	 	 LSB =data & 0x3f;
	 	 	 MSB =data>>6;
	 	 	 for(;(SCICTL2 & 0x80)==0;);
	         TX_data=MSB;                  /* transmit speed MSB */
	         SCITXBUF=TX_data; 	 			
		  	 for(;(SCICTL2 & 0x80)==0;);
	         TX_data=LSB ;                 /* transmit speed LSB */
	         for (i=0;i<2000;i++)
	          {}
	         SCITXBUF=TX_data; 
	        }
 	    }  
    LCD_refresh();
    if (run_state)
    	{
    	  if (input_value)
    	 	{
    	 	 if (input_value<=15)
	    	 	 {
	    	 	  run_state=0;
	              PBDATDIR=0x0701;
	              /*PBDATDIR=align_PBvalue; */
	    	 	 }
    	 	 else
	    	 	 {
	    	 	 if (sign_state)
	    	 	 	{if ((input_value*8.5)<=position)
	    	 			run_state=3;
	    	 		 }	
	    	 	 else if ((input_value*8)<=position)
	    	 		 run_state=3;
	    	 	 if ((input_value*10-75)<=position)
		    	 	 {
		    	 	   run_state=0;
		               PBDATDIR=0x0701;
		               /*PBDATDIR=align_PBvalue;*/
		    	 	  }
	    	 	  }
    	 	}
        }
    }
}

⌨️ 快捷键说明

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