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

梁工 发表于 2023-7-14 16:37:06

dong97512 发表于 2023-7-14 13:11
梁工,正转反转加计算圈数, 为何正反转几个回合后,正反转对应位置就偏移动了,目前通过HEnum++; 或者HEnu ...

开环控制,有误差不能感知的。
要达到你要求的效果,建议增加编码器或码盘。

dong97512 发表于 2023-7-14 17:43:43

梁工 发表于 2023-7-14 16:37
开环控制,有误差不能感知的。
要达到你要求的效果,建议增加编码器或码盘。 ...

没法闭环吗?

梁工 发表于 2023-7-14 17:46:51

dong97512 发表于 2023-7-14 17:43
没法闭环吗?

电机控制的闭环是指由过0点指示换相时刻。
你要的是外部的闭环,那得有编码器或码盘。

dong97512 发表于 2023-7-14 17:47:48

梁工 发表于 2023-7-14 16:37
开环控制,有误差不能感知的。
要达到你要求的效果,建议增加编码器或码盘。 ...

我手上有一个GD32F03 加PT5671 样品, 能准确控制圈数。

梁工 发表于 2023-7-14 17:51:08

dong97512 发表于 2023-7-14 17:47
我手上有一个GD32F03 加PT5671 样品, 能准确控制圈数。

那可能是FOC方式控制的,算法不一样。

dong97512 发表于 2023-7-14 19:08:27

梁工 发表于 2023-7-14 17:51
那可能是FOC方式控制的,算法不一样。

目前这个不是PWNB 有霍尔触发中断吗?这个能闭换控制吗?

梁工 发表于 2023-7-14 23:48:21

dong97512 发表于 2023-7-14 19:08
目前这个不是PWNB 有霍尔触发中断吗?这个能闭换控制吗?

可以,上面我想成无HALL的了。有HALL的,HAL信号滤波一下,以免干扰影响计数。

goiupp 发表于 2023-8-1 10:23:38

梁工,你好! 根据这个原理图和带HALL程序,我已经将实物做出,电机在正转过程中转几分钟后会停一下以后立马再启动,反转没有这个问题。这个是硬件还是程序的问题。

goiupp 发表于 2023-8-1 11:19:46

现在又有新状况了,上电后转一会后,好像上下管会同时导通,电源直接短路;重新上电后正常转一会后,又短路。(带HALL程序)
页: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16
查看完整版本: 三相无刷直流电机驱动-8H系列-带HALL 梁工例子