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

三相无刷直流电机驱动-8H系列-带HALL 梁工例子

  [复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-10-26 10:46:25
已绑定手机

0

主题

5

回帖

28

积分

新手上路

积分
28
发表于 2025-10-23 17:24:10 | 显示全部楼层
梁*** 发表于 2025-10-17 11:10
加角度校正,实际就是延时一下。

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:216
  • 最近打卡:2025-10-31 11:24:48

83

主题

6818

回帖

1万

积分

超级版主

积分
14622
发表于 2025-10-23 18:54:12 | 显示全部楼层
小*** 发表于 2025-10-23 17:24
您好,延时从默认的500ns加到1ms,效果越来越不好

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-10-26 10:46:25
已绑定手机

0

主题

5

回帖

28

积分

新手上路

积分
28
发表于 2025-10-23 20:02:39 | 显示全部楼层
梁*** 发表于 2025-10-23 18:54
不是这个延时,这个延时是用于切换IO的,不超过1us,不要更改!
你要延时的是换相时刻,加一个相移时间。 ...

抱歉,没有懂您说的什么意思,能麻烦具体指出在您发布的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;
                }
        }
}
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-10-26 10:46:25
已绑定手机

0

主题

5

回帖

28

积分

新手上路

积分
28
发表于 6 天前 | 显示全部楼层
梁*** 发表于 2025-10-23 18:54
不是这个延时,这个延时是用于切换IO的,不超过1us,不要更改!
你要延时的是换相时刻,加一个相移时间。 ...

大佬,能给指点一下是程序哪个位置加延时吗?感激不尽!!!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-1 05:58 , Processed in 0.122258 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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