找回密码
 立即注册
楼主: 梁***

三相无刷直流电机驱动-STC8H-带HALL 梁工例子

[复制链接]

该用户从未签到

7

主题

7

回帖

373

积分

中级会员

积分
373
发表于 2023-7-10 10:31:01 | 显示全部楼层
梁工,这是我自己列的驱动表,您看一下。

电机驱动状态表.xlsx

15.53 KB, 下载次数: 24

回复 支持 反对 送花

使用道具 举报

该用户从未签到

7

主题

7

回帖

373

积分

中级会员

积分
373
发表于 2023-7-10 10:36:44 | 显示全部楼层
驱动电压图
驱动电压图.png

点评

看不明白,手上没有你的电机,我就无法给你进一步的建议。  详情 回复 发表于 2023-7-10 13:09
回复 支持 反对 送花

使用道具 举报

该用户从未签到

45

主题

2914

回帖

6550

积分

超级版主

积分
6550
 楼主| 发表于 2023-7-10 13:09:48 | 显示全部楼层

看不明白,手上没有你的电机,我就无法给你进一步的建议。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

7

主题

7

回帖

373

积分

中级会员

积分
373
发表于 2023-7-10 14:53:40 | 显示全部楼层
梁工:电机客户刚给我发过来,我自己先试试,不行再麻烦您。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 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个相序有序运转的吗?
           

点评

1、你可以实际测量一下换相频率和转速的比值,我没见过这么大比值的,我手上的电机最大比值的是四轴飞行器的电机,42:1,即唤醒42次转一圈。 2、你的程序逻辑问题: HEnum++; if(HEnum==6 ) { XUANZ_num1++; }  详情 回复 发表于 2023-7-11 16:44
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 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)比电机实际 运作圈数 的比值也会变化,不知道如何理解!
回复 支持 反对 送花

使用道具 举报

该用户从未签到

45

主题

2914

回帖

6550

积分

超级版主

积分
6550
 楼主| 发表于 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,所以你的判断语句永远都不满足条件,所以没执行。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 2023-7-12 14:12:16 | 显示全部楼层
梁工 发表于 2023-7-4 13:12
有霍尔就非常简单了,方法类似,驱动电机后,一定的时间没有霍尔信号,就认为堵转了。 ...

梁工,你好!一定的时间没有霍尔信号   ,这句话好理解,但是加了几个语句,不知道是不是加错地点还是逻辑不对,总是实现不了! 看看简单,做不来怎么办

点评

那就继续努力。  详情 回复 发表于 2023-7-12 15:12
回复 支持 反对 送花

使用道具 举报

该用户从未签到

45

主题

2914

回帖

6550

积分

超级版主

积分
6550
 楼主| 发表于 2023-7-12 15:12:23 | 显示全部楼层
dong97512 发表于 2023-7-12 14:12
梁工,你好!一定的时间没有霍尔信号   ,这句话好理解,但是加了几个语句,不知道是不是加错地点还是逻 ...

那就继续努力。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

37

回帖

131

积分

注册会员

积分
131
发表于 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
回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-4-28 03:36 , Processed in 0.070818 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表