housping 发表于 2025-10-22 15:03
梁工,请教一下,我换了个带霍尔的电机,测试如下,霍尔的图哪里看到霍尔的上升下降沿ABC三相是有重叠,这 ...
能不能显示1、2个完整的周期?周期不完整,看不出来。
梁工 发表于 2025-10-22 16:14
能不能显示1、2个完整的周期?周期不完整,看不出来。
波形是这样的
从霍尔上来看,好像是一个霍尔还没转完,下一个霍尔就变化了,从UVW来看,就是波形前面短,后面长,不那么对称,这样是不是调整那个换相的延时时间?我试着增加那个延时时间,看波形没什么改变
housping 发表于 2025-10-22 16:45
波形是这样的
你的霍尔信号不对称,应该是安装位置不对造成的。理想的霍尔信号应该如下图:
梁工 发表于 2025-10-22 16:58
你的霍尔信号不对称,应该是安装位置不对造成的。理想的霍尔信号应该如下图:
看霍尔的板子上也是60度电角度的样子,从实际的波形来看,好像是差了一拍,时间上好像变成1-2-1-2这样的间隔了
housping 发表于 2025-10-23 09:29
看霍尔的板子上也是60度电角度的样子,从实际的波形来看,好像是差了一拍,时间上好像变成1-2-1-2这样的 ...
将波形周期等分成6份,每一份就是边沿的时刻。
梁工 发表于 2025-10-17 11:10
加角度校正,实际就是延时一下。
......每个电机单独矫正?之前使用的是一个无刷电机专用芯片,那个不知道怎么处理的霍尔信号,就可以直接使用,没有异常,我感觉是霍尔信号那面是不是经过修正处理,但是那个芯片很简单......。能把电机寄给您,您给看一下具体是什么原因码?
梁工 发表于 2025-10-17 11:10
加角度校正,实际就是延时一下。
您好,延时从默认的500ns加到1ms,效果越来越不好{:xiaojiujie:}
小强 发表于 2025-10-23 17:24
您好,延时从默认的500ns加到1ms,效果越来越不好
不是这个延时,这个延时是用于切换IO的,不超过1us,不要更改!
你要延时的是换相时刻,加一个相移时间。
梁工 发表于 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;
}
}
}