|  | 
 
 发表于 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;
 }
 }
 
 }
 | 
 |