这是一个电机寻零的逻辑代码实现
void axle_zero_handle(void)
{
switch(pro.axle_zero_flag)
{
case 0://初始状态
{
pro.axle_zero_flag = 1;
pro.pwm_out =MIN_SPEED;
if(SENSORM == 1)//初始位置在零位
{
// pro.motor_dir = DIR_LEFT;
// pro.axle_zero_flag = 2;
pro.motor_dir = 0;
pro.pwm_out = 0;
motor_pwm_out(TIM3,pro.pwm_out);
pro.pulseNum =RST_ANGLE*AVR_PULSE_NUM;
pro.axle_zero_flag = 4;
pro.brake_enable=0;
}
else if(SENSORR == 1)//初始位置在右位置传感器
pro.motor_dir = DIR_LEFT;
else
pro.motor_dir = DIR_RIGHT;//其他情况
}break;
case 1:
{
if(SENSORM == 1)//运行位置在中位值传感器
{
if(pro.motor_dir == DIR_LEFT)
{
pro.axle_zero_flag = 2;
}else if(pro.motor_dir == DIR_RIGHT)
{
pro.pulseNum =0;
pro.axle_zero_flag = 3;
}
}else if(SENSORR == 1)
{
pro.motor_dir = DIR_LEFT;
}
}break;
case 2:
{
if(SENSORM == 0)
{
pro.axle_zero_flag = 1;
pro.motor_dir = DIR_RIGHT;
}
}break;
case 3://到复位点
{
if(pro.pulseNum == RST_ANGLE*AVR_PULSE_NUM)
{
pro.motor_dir = 0;
pro.pwm_out = 0;
motor_pwm_out(TIM3,pro.pwm_out);
pro.axle_zero_flag = 4;
pro.brake_enable=0;
}
}break;
default:break;
}
}
电机刹车处理逻辑
void motor_stop_handle(void)
{
if(pro.run_flag)
{
switch(pro.motor_stat)
{
case 2://起靶停,
{
if(abs((pro.pulseNum - pro.pointPulse)) <= 1)
{
pro.motor_dir = 0;
pro.pwm_out = 0;
motor_pwm_out(TIM3,pro.pwm_out);
pro.brake_enable=0;
pro.motor_stat = 3;
pro.run_flag = 0;
xbee.tx_flag=1;
if(pro.type==4||pro.type==6||pro.type==7)
xbee.tx_mind = 0xC4;
else
xbee.tx_mind =0xCF;
}
}break;
case 5://隐靶停
{
if(abs((pro.pulseNum - pro.pointPulse)) <= 1)
{
pro.motor_dir = 0;
pro.pwm_out = 0;
motor_pwm_out(TIM3,pro.pwm_out);
pro.brake_enable=0;
pro.motor_stat = 0;
pro.run_flag = 0;
xbee.tx_flag=1;
if(pro.type==4||pro.type==6||pro.type==7)
xbee.tx_mind = 0xC8;
else
xbee.tx_mind =0xC0;
pro.run_mode = 0;
pro.hit_flag=0;
}
}break;
case 6://起靶停2,对应摇摆靶的左右一侧的位置
{
if(abs((pro.pulseNum - pro.pointPulse)) <= 1)
{
pro.motor_dir = 0;
pro.pwm_out = 0;
motor_pwm_out(TIM3,pro.pwm_out);
pro.brake_enable=0;
pro.motor_stat = 7;
pro.run_flag = 0;
xbee.tx_flag=1;
xbee.tx_mind = 0xCB;
}
}break;
default: break;
}
}
}