📄 motor.c
字号:
{
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 + -