|
发表于 2023-7-14 13:11:19
|
显示全部楼层
梁工,正转反转加计算圈数, 为何正反转几个回合后,正反转对应位置就偏移动了,目前通过HEnum++; 或者HEnum--; 来计数。怎样才能保证吻合理想要的位置,而不偏移?
if(!B_direct) //顺时针
{
switch(step)
{
case 2: // 010, P2.0-HALL_A下降沿 PWM3, PWM2_L=1 //顺时针
HEnum=0;
PWMA_ENO = 0x00; PWM1_L=0; PWM3_L=0;
Delay_500ns();
PWMA_ENO = 0x10; // 打开C相的高端PWM
PWM2_L = 1; // 打开B相的低端
PWMB_CCER2 |= (0x01+0x00); //P2.2 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_CCER2 |= 0x10; // 开启比较输出, 高电平有效 //230517
PWMB_IER |= 0x08; //P2.2 使能中断
HEnum++;
break;
case 6: // 110, P2.2-HALL_C上升沿 PWM3, PWM1_L=1
PWMA_ENO = 0x10; PWM2_L=0; PWM3_L=0; // 打开C相的高端PWM
Delay_500ns();
PWM1_L = 1; // 打开A相的低端
PWMB_CCER1 |= (0x10+0x20); //P2.1 0x10:允许输入捕获, +0x00:上升沿, +0x20:下降沿
PWMB_IER |= 0x04; //P2.1 使能中断
HEnum++;
break;
case 4: // 100, P2.1-HALL_B下降沿 PWM2, PWM1_L=1
PWMA_ENO = 0x00; PWM2_L=0; PWM3_L=0;
Delay_500ns();
PWMA_ENO = 0x04; // 打开B相的高端PWM
PWM1_L = 1; // 打开A相的低端
PWMB_CCER1 |= (0x01+0x00); //P2.0 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_IER |= 0x02; //P2.0 使能中断
HEnum++;
break;
case 5: // 101, P2.0-HALL_A上升沿 PWM2, PWM3_L=1
PWMA_ENO = 0x04; PWM1_L=0; PWM2_L=0; // 打开B相的高端PWM
Delay_500ns();
PWM3_L = 1; // 打开C相的低端
PWMB_CCER2 |= (0x01+0x02); //P2.2 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_CCER2 |= 0x10; // 开启比较输出, 高电平有效 //230517
PWMB_IER |= 0x08; //P2.2 使能中断
HEnum++;
break;
case 1: // 001, P2.2-HALL_C下降沿 PWM1, PWM3_L=1
PWMA_ENO = 0x00; PWM1_L=0; PWM2_L=0;
Delay_500ns();
PWMA_ENO = 0x01; // 打开A相的高端PWM
PWM3_L = 1; // 打开C相的低端
PWMB_CCER1 |= (0x10+0x00); //P2.1 0x10:允许输入捕获, +0x00:上升沿, +0x20:下降沿
PWMB_IER |= 0x04; //P2.1 使能中断
HEnum++;
break;
case 3: // 011, P2.1-HALL_B上升沿 PWM1, PWM2_L=1
PWMA_ENO = 0x01; PWM1_L=0; PWM3_L=0; // 打开A相的高端PWM
Delay_500ns();
PWM2_L = 1; // 打开B相的低端
PWMB_CCER1 |= (0x01+0x02); //P2.0 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_IER |= 0x02; //P2.0 使能中断
HEnum++; if(HEnum==6 ){ // XUANZ_num++;
}
//if(S1==0) { XUANZ_num--; }else{ XUANZ_num++; }
XUANZ_num++;
HEnum=0;
break;
default:
break;
}
}
else //逆时针
{
switch(step)
{
case 4: // 100, P2.0-HALL_A下降沿 PWM1, PWM2_L=1 //逆时针
HEnum=0;
PWMA_ENO = 0x00; PWM1_L=0; PWM3_L=0;
Delay_500ns();
PWMA_ENO = 0x01; // 打开A相的高端PWM
PWM2_L = 1; // 打开B相的低端
PWMB_CCER1 |= (0x10+0x00); //P2.1 0x10:允许输入捕获, +0x00:上升沿, +0x20:下降沿
PWMB_IER |= 0x04; //P2.1 使能中断
HEnum++;
break;
case 6: // 110, P2.1-HALL_B上升沿 PWM1, PWM3_L=1
PWMA_ENO = 0x01; PWM1_L=0; PWM2_L=0; // 打开A相的高端PWM
Delay_500ns();
PWM3_L = 1; // 打开C相的低端
PWMB_CCER2 |= (0x01+0x02); //P2.2 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_CCER2 |= 0x10; // 开启比较输出, 高电平有效 //230517
PWMB_IER |= 0x08; //P2.2 使能中断
HEnum++;
break;
case 2: // 010, P2.2-HALL_C下降沿 PWM2, PWM3_L=1
PWMA_ENO = 0x00; PWM1_L=0; PWM2_L=0;
Delay_500ns();
PWMA_ENO = 0x04; // 打开B相的高端PWM
PWM3_L = 1; // 打开C相的低端
PWMB_CCER1 |= (0x01+0x00); //P2.0 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_IER |= 0x02; //P2.0 使能中断
HEnum++;
break;
case 3: // 011, P2.0-HALL_A上升沿 PWM2, PWM1_L=1
PWMA_ENO = 0x04; PWM2_L=0; PWM3_L=0; // 打开B相的高端PWM
Delay_500ns();
PWM1_L = 1; // 打开A相的低端
PWMB_CCER1 |= (0x10+0x20); //P2.1 0x10:允许输入捕获, +0x00:上升沿, +0x20:下降沿
PWMB_IER |= 0x04; //P2.1 使能中断
HEnum++;
break;
case 1: // 001, P2.1-HALL_B下降沿 PWM3, PWM1_L=1
PWMA_ENO = 0x00; PWM2_L=0; PWM3_L=0;
Delay_500ns();
PWMA_ENO = 0x10; // 打开C相的高端PWM
PWM1_L = 1; // 打开A相的低端
PWMB_CCER2 |= (0x01+0x00); //P2.2 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_CCER2 |= 0x10; // 开启比较输出, 高电平有效 //230517
PWMB_IER |= 0x08; //P2.2 使能中断
HEnum++;
break;
case 5: // 101, P2.2-HALL_C上升沿 PWM3, PWM2_L=1
PWMA_ENO = 0x10; PWM1_L=0; PWM3_L=0; // 打开C相的高端PWM
Delay_500ns();
PWM2_L = 1; // 打开B相的低端
PWMB_CCER1 |= (0x01+0x02); //P2.0 0x01:允许输入捕获, +0x00:上升沿, +0x02:下降沿
PWMB_IER |= 0x02; //P2.0 使能中断
HEnum++; if(HEnum==6 ){ //XUANZ_num++;
}
//if(S1==0) { XUANZ_num--; }else{ XUANZ_num++; }
XUANZ_num--;
HEnum=0;
break;
default:
break;
}
}
} |
|