梁工 发表于 2025-10-22 16:14:07

housping 发表于 2025-10-22 15:03
梁工,请教一下,我换了个带霍尔的电机,测试如下,霍尔的图哪里看到霍尔的上升下降沿ABC三相是有重叠,这 ...

能不能显示1、2个完整的周期?周期不完整,看不出来。

housping 发表于 2025-10-22 16:45:04

梁工 发表于 2025-10-22 16:14
能不能显示1、2个完整的周期?周期不完整,看不出来。

波形是这样的

housping 发表于 2025-10-22 16:47:35

从霍尔上来看,好像是一个霍尔还没转完,下一个霍尔就变化了,从UVW来看,就是波形前面短,后面长,不那么对称,这样是不是调整那个换相的延时时间?我试着增加那个延时时间,看波形没什么改变

梁工 发表于 2025-10-22 16:58:26

housping 发表于 2025-10-22 16:45
波形是这样的

你的霍尔信号不对称,应该是安装位置不对造成的。理想的霍尔信号应该如下图:



housping 发表于 2025-10-23 09:29:13

梁工 发表于 2025-10-22 16:58
你的霍尔信号不对称,应该是安装位置不对造成的。理想的霍尔信号应该如下图:




看霍尔的板子上也是60度电角度的样子,从实际的波形来看,好像是差了一拍,时间上好像变成1-2-1-2这样的间隔了

梁工 发表于 2025-10-23 10:22:56

housping 发表于 2025-10-23 09:29
看霍尔的板子上也是60度电角度的样子,从实际的波形来看,好像是差了一拍,时间上好像变成1-2-1-2这样的 ...

将波形周期等分成6份,每一份就是边沿的时刻。

小强 发表于 2025-10-23 16:58:46

梁工 发表于 2025-10-17 11:10
加角度校正,实际就是延时一下。

......每个电机单独矫正?之前使用的是一个无刷电机专用芯片,那个不知道怎么处理的霍尔信号,就可以直接使用,没有异常,我感觉是霍尔信号那面是不是经过修正处理,但是那个芯片很简单......。能把电机寄给您,您给看一下具体是什么原因码?

小强 发表于 2025-10-23 17:24:10

梁工 发表于 2025-10-17 11:10
加角度校正,实际就是延时一下。

您好,延时从默认的500ns加到1ms,效果越来越不好{:xiaojiujie:}

梁工 发表于 2025-10-23 18:54:12

小强 发表于 2025-10-23 17:24
您好,延时从默认的500ns加到1ms,效果越来越不好

不是这个延时,这个延时是用于切换IO的,不超过1us,不要更改!
你要延时的是换相时刻,加一个相移时间。

小强 发表于 2025-10-23 20:02:39

梁工 发表于 2025-10-23 18:54
不是这个延时,这个延时是用于切换IO的,不超过1us,不要更改!
你要延时的是换相时刻,加一个相移时间。 ...

抱歉,没有懂您说的什么意思{:xiaojiujie:},能麻烦具体指出在您发布的STC8H1K28例程里的那个位置加吗?大概要加多少延时?

void StepMotor(void) // 换相序列函数
{
        PWMB_IER   = 0;
        PWMB_CCER1 = 0;
        PWMB_CCER2 = 0;

        step = P2 & 0x07;        //P2.0-HALL_A P2.1-HALL_B P2.2-HALL_C

        if(!Motor_Dir)        //顺时针
        {
                switch(step)
                {
                case 2:// 010, P2.0-HALL_A下降沿PWM3, PWM2_L=1                //顺时针
                                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_IER   = 0x08;                        //P2.2 使能中断
                                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 使能中断
                                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 使能中断
                                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_IER   = 0x08;                        //P2.2 使能中断
                                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 使能中断
                                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 使能中断
                                break;

                default:
                                break;
                }
        }

        else        //逆时针
        {
                switch(step)
                {
                case 4:// 100, P2.0-HALL_A下降沿PWM1, PWM2_L=1                //逆时针
                                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 使能中断
                                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_IER   = 0x08;                        //P2.2 使能中断
                                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 使能中断
                                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 使能中断
                                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_IER   = 0x08;                        //P2.2 使能中断
                                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 使能中断
                                break;
       
                default:
                                break;
                }
        }
}
页: 10 11 12 13 14 15 16 17 18 19 [20] 21
查看完整版本: 三相无刷直流电机驱动-8H系列-带HALL 梁工例子