一、硬件电路
PC6为左前电机的PWM输入,为电机提供动力。
PG7、PG8控制左前电机的方向。
二、MOTOR初始化
给电机提供周期为1000000ns的PWM波形
static int MotorInit(struct Motor *ptdev){
if(NULL == ptdev){
LogDebug("MotorStart EINVAL\r\n");
return -EINVAL;
}
Pwm_s MotorPwm;
switch(ptdev->channel){
case 1:
MotorPwm = LFMotorPwm;
break;
case 2:
MotorPwm = RFMotorPwm;
break;
case 3:
MotorPwm = LBMotorPwm;
break;
case 4:
MotorPwm = RBMotorPwm;
break;
default:
return -EINVAL;
}
int ret = MotorPwm.Config(&MotorPwm,SET_PERIOD_VALUE,1000000);
if(ret != ESUCCESS){
LogDebug("MotorPwm.Config failed\r\n");
return -EIO;
}
ret = MotorPwm.Start(&MotorPwm);
if(ret != ESUCCESS){
LogDebug("MotorPwm.Start failed\r\n");
return -EIO;
}
ret = MotorStop(ptdev);
if(ret != ESUCCESS){
LogDebug("MotorStop failed\r\n");
return -EIO;
}
ret = MotorSetDir(ptdev,Motor_CR);
if(ret != ESUCCESS){
LogDebug("MotorSetDir failed\r\n");
return -EIO;
}
return ESUCCESS;
}
三、MOTOR的开始与停止
通过方向控制来开始和停止电机
static int MotorStart(struct Motor *ptdev){
if(NULL == ptdev){
LogDebug("MotorStart EINVAL\r\n");
return -EINVAL;
}
Gpio_s MotorCR,MotorCCR;
switch(ptdev->channel){
case 1:
MotorCR = LFMotorCR;
MotorCCR = LFMotorCCR;
break;
case 2:
MotorCR = RFMotorCR;
MotorCCR = RFMotorCCR;
break;
case 3:
MotorCR = LBMotorCR;
MotorCCR = LBMotorCCR;
break;
case 4:
MotorCR = RBMotorCR;
MotorCCR = RBMotorCCR;
break;
}
MotorCR.Write(&MotorCR,ptdev->dir);
MotorCCR.Write(&MotorCCR,!ptdev->dir);
ptdev->status = Motor_Start;
return ESUCCESS;
}
static int MotorStop(struct Motor *ptdev){
if(NULL == ptdev){
LogDebug("MotorStart EINVAL\r\n");
return -EINVAL;
}
Gpio_s MotorCR,MotorCCR;
switch(ptdev->channel){
case 1:
MotorCR = LFMotorCR;
MotorCCR = LFMotorCCR;
break;
case 2:
MotorCR = RFMotorCR;
MotorCCR = RFMotorCCR;
break;
case 3:
MotorCR = LBMotorCR;
MotorCCR = LBMotorCCR;
break;
case 4:
MotorCR = RBMotorCR;
MotorCCR = RBMotorCCR;
break;
}
MotorCR.Write(&MotorCR,ptdev->dir);
MotorCCR.Write(&MotorCCR,ptdev->dir);
ptdev->status = Motor_Stop;
return ESUCCESS;
}
四、MOTOR设置速度
static int MotorSetSpeed(struct Motor *ptdev,uint8_t speed){
if(NULL == ptdev){
LogDebug("MotorStart EINVAL\r\n");
return -EINVAL;
}
if(0 == speed){
return MotorStop(ptdev);
}
int pulse = speed * 1000000 / 100;
Pwm_s MotorPwm;
switch(ptdev->channel){
case 1:
MotorPwm = LFMotorPwm;
break;
case 2:
MotorPwm = RFMotorPwm;
break;
case 3:
MotorPwm = LBMotorPwm;
break;
case 4:
MotorPwm = RBMotorPwm;
break;
default:
return -EINVAL;
}
int ret = MotorPwm.Config(&MotorPwm,SET_COMPARE_VALUE,pulse);
if(ret != ESUCCESS){
LogDebug("MotorPwm.Config failed\r\n");
return -EIO;
}
if(ptdev->status != Motor_Start){
return MotorStart(ptdev);
}
return ESUCCESS;
}