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

📄 motor.c

📁 Demo HZ256 Cluster LCD2 CW31 SH v1 ICD
💻 C
📖 第 1 页 / 共 2 页
字号:
      {
        PORTS|=0x40;
        delayMS(1);
        word33993=word33993<<1;
        if((PTIS&0x20)==0x20)
          {
              word33993|=0x01; 
          }
          
          PORTS&=0xbf;
          delayMS(1);
        
      }
      PORTB|=0x40;
    return  word33993;
    
  }











void motorMove(unsigned char channle,unsigned int position)
  {
     while(MotorCurStep[channle]!=position)   //?????????
      {
          MotorFinalStep[channle]=position;  //??????????
          	if((speed0++)>=36)
          	  {
          	    motor_micro_update(channle,MTRDR[0]);   //?????????/
          	    speed0=0;
          	  }
      }
  }
void  motorHome(void)
  {
      MotorCurStep[0]=17280;    //0
    while(MotorCurStep[0]!=0)    //   17280
      {
          MotorFinalStep[0]=0;        //   17280
          	if((speed0++)>=6)
          	  {
          	    motor_micro_update(0,MTRDR[0]);
          	    speed0=0;
          	  }
          
          
      }
    
    
  }

/****************************************************************************
* check_motor_demo() -
* 
* Description : Check motor demo enable/disable 
*			  : 
* Example     : N/A  
* Input 	  : N/A
* Output	  : N/A
* Modify      : N/A
* Return      : N/A
****************************************************************************/
void check_motor_demo()
{
 	byte i,channel;

	DisableInterrupts; 
	
	if((speed0++)>=2)
	{
     speed0=0;
     channel=0;
	   if(MotorCurStep[channel]==2000) {
	     for(i=0;i<1;i++)
	       MotorFinalStep[channel+i]=17280;
	     DemoIndex[0]++;
	   }
	   else if(MotorCurStep[channel]>=17280){
	     for(i=0;i<1;i++)
	       MotorFinalStep[channel+i]=2000;
			 DemoIndex[0]++;	   
	   }	       
	   for(i=0;i<1;i++)
	     motor_micro_update(channel+i,MTRDR[channel+i]);//motor_update?????	             
  }
/*	
	if(speed1++>=200)
	{
     speed1=0;
     //channel=2;   //?????????????????????
	   if(MotorCurStep[channel]==0) {
	     for(i=0;i<1;i++)
	       MotorFinalStep[channel+i]=472;
	   }
	   else if(MotorCurStep[channel]>=472){
	     for(i=0;i<1;i++)
	       MotorFinalStep[channel+i]=0;
	   }	    
	   for(i=0;i<1;i++)
	     motor_update(channel+i,MTRDR[channel+i])		;
	}
	      */
  EnableInterrupts;
}

/****************************************************************************
* motor_info() -
*
* Description : Display all Motors position and time 
*			  : 
* Example     : N/A  
* Input 	  : N/A
* Output	  : N/A
* Modify      : N/A
* Return      : N/A
****************************************************************************/
void motor_info()
{
	
}

/****************************************************************************
* motor_update(char channel, char dir) -
*
* Description : Control motor drivers and polarity
*			  :  
* Example     : N/A  
* Input 	  : motor channel
* Output	  : MotorCurStyep[?]
* Modify      : Motor driver and polarity
* Return      : N/A
****************************************************************************/
void motor_update(char channel, char dir)
{
 	volatile unsigned char	ctemp,*motor_channel;
	int		temp,itemp;
	
	itemp=MotorFinalStep[channel]-MotorCurStep[channel];
	
	if (itemp!=0)
	{
	  if (itemp<0)  MotorCurStep[channel]--;
	  else if (itemp>0)  MotorCurStep[channel]++;
	
	  motor_channel=&MCDC0H+channel*4;
	
	  temp = MotorCurStep[channel];
    asm	{
		ldd		temp;
		ldx		#6
		idiv
		stab	ctemp
	  }		
	  if(dir == CLOCKWISE)
	  {
	    if(ctemp==0)
	    {
	      *motor_channel&=S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if(ctemp==1)
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)&=S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }
	    else if(ctemp==2)
	    {  
	      *motor_channel|=~S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }
	    else if(ctemp==3)	
	    {
	      *motor_channel|=~S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)|=~S1_DTC;		//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if(ctemp==4)	
	    {
	      *motor_channel|=~S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)|=~S1_DTC;		//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if(ctemp==5)	
	    {
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)|=~S1_DTC;		//;Duty cycle channel 1 (B PWM /B low)
	    }
	  }
	  else
	  {
	    if(ctemp==0)
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }
	    else if(ctemp==1)
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if(ctemp==2)
	    {  
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if(ctemp==3)
	    {
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }						  
	  }	   			  			
  }
  else		 
  {
	  MotorStatus[channel]=OFF;		
  }
}

/****************************************************************************
*  motor_micro_update(char channel, char dir) -
*
* Description : Control motor drivers PWM value and polarity
*			  :  
* Example     : N/A  
* Input 	  : motor channel, direction
* Output	  : MotorCurStyep[?]
* Modify      : Motor driver PWM value and polarity
* Return      : N/A
****************************************************************************/
void motor_micro_update(char channel, char dir)
{
 	volatile unsigned char	ctemp,*motor_channel;
	int		temp,itemp;
	
	itemp=MotorFinalStep[channel]-MotorCurStep[channel];
	
	if (itemp!=0)
	{
    if(abs(itemp)==MotorSpeedIndex[channel]+1)
      MotorMoveStatus[channel]=RAMPDN;
    	  
	  if (itemp<0)  MotorCurStep[channel]--;
	  else if (itemp>0)  MotorCurStep[channel]++;
	
	  motor_channel=&MCDC0H+channel*4;
	
	  temp = MotorCurStep[channel];
	  asm
	  {
		ldd		temp;
		ldx		#STEP4
		idiv
		stab	ctemp
	  }		
	  if(dir == CLOCKWISE)
	  {
	    if((ctemp<STEP1))
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if((ctemp>=STEP1)&&(ctemp<STEP2))
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }
	    else if((ctemp>=STEP2)&&(ctemp<STEP3))
	    {  
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }
	    else if((ctemp>=STEP3)&&(ctemp<STEP4))
	    {
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }					  
	  }
	  else
	  {  
	    if((ctemp<STEP1))
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }
	    else if((ctemp>=STEP1)&&(ctemp<STEP2))
	    {
	      *motor_channel&=~S0_DTC;		//;Duty cycle channel 0 (A low /A PWM)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if((ctemp>=STEP2)&&(ctemp<STEP3))
	    {  
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)|=S1_DTC;	//;Duty cycle channel 1 (B PWM /B low)
	    }
	    else if((ctemp>=STEP3)&&(ctemp<STEP4))
	    {
	      *motor_channel|=S1_DTC;		//;Duty cycle channel 0 (A PWM /A low)
	      *(motor_channel+2)&=~S0_DTC;	//;Duty cycle channel 1 (B low /B PWM)
	    }					
	  } 
	  if(ctemp>=STEP2)
	    ctemp-=STEP2;	  	
	  *(motor_channel+1)=SinTbl4[ctemp];
	  *(motor_channel+3)=CosTbl4[ctemp];
  }
  else		 
  {
	  MotorStatus[channel]=OFF;		
  }
}

/*******************************************************************
* Motor home subroutine
* Description : Control motor move DOWN for reverse direction
*			  :  
* Example     : N/A  
* Input 	  : N/A
* Output	  : N/A
* Modify      : N/A
* Return      : N/A
********************************************************************/ 
void home()
{
	char	i;
	int		count;
		
	MCCTL0=0x0;			// fbus(Eclock)=0, FAST=0 (slow mode)
	MCCTL1=0x80;   		// RECIRC =1 (low side), disable interrupt for PWM motor
	MCPERW=0x0080;		// 0x80=128 resoultion frequency = fbus(Eclock)/resoulation 						//                          = 62.5K(8M/128)
		
	MCCC0=0x90;			// Dual Full H-bridge mode,left aligned
	MCCC1=0x90;			// Dual Full H-bridge mode,left aligned									
	MCDC0W=0x040;		// Duty cycle channel 0 since no initial value in motor 0
	MCDC1W=0x040;		// Duty cycle channel 1 since no initial value in motor 0

	MCCC2=0x90;			// Dual Full H-bridge mode,left aligned
	MCCC3=0x90;			// Dual Full H-bridge mode,left aligned									
	MCDC2W=0x040;		// Duty cycle channel 0 since no initial value in motor 0
	MCDC3W=0x040;		// Duty cycle channel 1 since no initial value in motor 0

	MCCC4=0x90;			// Dual Full H-bridge mode,left aligned
	MCCC5=0x90;			// Dual Full H-bridge mode,left aligned									
	MCDC4W=0x040;		// Duty cycle channel 0 since no initial value in motor 0
	MCDC5W=0x040;		// Duty cycle channel 1 since no initial value in motor 0

	MCCC6=0x90;			// Dual Full H-bridge mode,left aligned
	MCCC7=0x90;			// Dual Full H-bridge mode,left aligned									
	MCDC6W=0x040;		// Duty cycle channel 0 since no initial value in motor 0
	MCDC7W=0x040;		// Duty cycle channel 1 since no initial value in motor 0

  MotorFinalStep[SPEEDOMETER]=0;	// maximum move distance for motor 0 full step
  MotorCurStep[SPEEDOMETER]=40;
  MotorFinalStep[TACHOMETER]=0;	// maximum move distance for motor 1 full step
  MotorCurStep[TACHOMETER]=40;
  MotorFinalStep[FUEL]=0;			// maximum move distance for motor 2 full step
  MotorCurStep[FUEL]=20;
  MotorFinalStep[TEMP]=0;			// maximum move distance for motor 3 full step
  MotorCurStep[TEMP]=20;
  
  for (i=0;i<4;i++)
	{
	  MotorMode[i]=HOME;				//set home flag for motor 0
      MotorStatus[i]=ON;
  }

	EnableInterrupts;					
	while((MotorStatus[0]!=OFF)||(MotorStatus[1]!=OFF)||(MotorStatus[2]!=OFF)||(MotorStatus[3]!=OFF))
  {
    if((count++)>20)
	  {
	      count=0;
	  }
	}

  MotorFinalStep[SPEEDOMETER]=40;	//go to speedometer 0 Km position
  MotorCurStep[SPEEDOMETER]=0;
  MotorStatus[SPEEDOMETER] = ON;
  MotorFinalStep[TACHOMETER]=40;		//go to tachometer 0 rpm position 
  MotorCurStep[TACHOMETER]=0;
  MotorStatus[TACHOMETER] = ON;

  MotorFinalStep[FUEL]=20;	//192;			//go to fuel meter empty position
  MotorCurStep[FUEL]=0;
  MotorStatus[FUEL] = ON;
  MotorFinalStep[TEMP]=20;	//192;			//go to temperature meter 0 degree position
  MotorCurStep[TEMP]=0;
  MotorStatus[TEMP] = ON;
	
	for (i=0;i<4;i++)
   	  MotorStatus[i] = ON;				// release the motors status are on

	for (i=0;i<4;i++)
   	  while(MotorStatus[i] == ON);		// check the motors status are on
	
    DisableInterrupts;
	  
	for (i=0;i<4;i++)
	{
      MotorFinalStep[i]=0;
      MotorCurStep[i]=0;
  }
	MotorMode[SPEEDOMETER]=NORMAL;		//Motors mode are normal
	MotorMode[TACHOMETER]=NORMAL;
	MotorMode[FUEL]=NORMAL;
	MotorMode[TEMP]=NORMAL;	
	
}

/****************************************************************************
* motor_test_option(struct menu_ret *c_data)
* 
* Description : Select test option 
*			  :
* Example     : N/A  
* Input 	  : *c_data
* Output	  : N/A
* Modify      : N/A
* Return      : N/A
****************************************************************************/
void motor_test_option(struct menu_ret *c_data)
{ 	  	
	c_data->redraw=ENABLE;
	c_data->page=MOTOR_PAGE;
	MenuPage=MOTOR_PAGE;
	
	  switch(c_data->option)
	  { 
		case  '0':	c_data->page=ROOT_PAGE;	// root_test_menu(); 
					break;
	  }
}



⌨️ 快捷键说明

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