jiugechen
发表于 2023-7-10 10:31:01
梁工,这是我自己列的驱动表,您看一下。
jiugechen
发表于 2023-7-10 10:36:44
驱动电压图
梁工
发表于 2023-7-10 13:09:48
jiugechen 发表于 2023-7-10 10:36
驱动电压图
看不明白,手上没有你的电机,我就无法给你进一步的建议。
jiugechen
发表于 2023-7-10 14:53:40
梁工:电机客户刚给我发过来,我自己先试试,不行再麻烦您。
dong97512
发表于 2023-7-11 15:15:43
梁工,你好! 我换相序列函数的最后一个相序理解加了一个计数器,打算计算工作圈数;为何计数器的值(XUANZ_num)比电机实际 运作圈数比值达到1000:1关系了, 不知道如何理解!
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_num1++;
}
XUANZ_num++;
HEnum=0;
break;
default:
break;
}
}
第2给我请问题:上面程序中的: if(HEnum==6 ){ XUANZ_num1++;
}
里面的:XUANZ_num1为何数字加不了。一直为0, 电机不是6个相序有序运转的吗?
dong97512
发表于 2023-7-11 15:18:48
dong97512 发表于 2023-7-11 15:15
梁工,你好! 我换相序列函数的最后一个相序理解加了一个计数器,打算计算工作圈数;为何计数器的值(XUA ...
还有, PWM_Value = 60; //启动电机的最低PWM, 根据具体电机而定30-45
PWMA_CCR1L = PWM_Value; //输出PWM
PWMA_CCR2L = PWM_Value;
PWMA_CCR3L = PWM_Value;
改变PWM_Value 不同值,计数器的值(XUANZ_num)比电机实际 运作圈数 的比值也会变化,不知道如何理解!
梁工
发表于 2023-7-11 16:44:51
dong97512 发表于 2023-7-11 15:15
梁工,你好! 我换相序列函数的最后一个相序理解加了一个计数器,打算计算工作圈数;为何计数器的值(XUA ...
1、你可以实际测量一下换相频率和转速的比值,我没见过这么大比值的,我手上的电机最大比值的是四轴飞行器的电机,42:1,即唤醒42次转一圈。
2、你的程序逻辑问题:
HEnum++;
if(HEnum==6 )
{
XUANZ_num1++;
}
XUANZ_num++;
HEnum=0;
每次运行到这里,先HEnum+1,然后判断HEnum是否等于6,之后HEnum=0,则运行后HEnum的值一直是0、1、0,所以你的判断语句永远都不满足条件,所以没执行。
dong97512
发表于 2023-7-12 14:12:16
梁工 发表于 2023-7-4 13:12
有霍尔就非常简单了,方法类似,驱动电机后,一定的时间没有霍尔信号,就认为堵转了。 ...
梁工,你好!一定的时间没有霍尔信号 ,这句话好理解,但是加了几个语句,不知道是不是加错地点还是逻辑不对,总是实现不了! 看看简单,做不来怎么办
梁工
发表于 2023-7-12 15:12:23
dong97512 发表于 2023-7-12 14:12
梁工,你好!一定的时间没有霍尔信号 ,这句话好理解,但是加了几个语句,不知道是不是加错地点还是逻 ...
那就继续努力。
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;
}
}
}
页:
1
2
3
4
5
[6]
7
8
9
10
11
12
13
14
15