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

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

  [复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-06-23 20:51:31
已绑定手机

0

主题

7

回帖

34

积分

新手上路

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2026-07-06 10:28:35

83

主题

7895

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-06-23 20:51:31
已绑定手机

0

主题

7

回帖

34

积分

新手上路

积分
34
发表于 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;
                }
        }
}
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-06-23 20:51:31
已绑定手机

0

主题

7

回帖

34

积分

新手上路

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:301
  • 最近打卡:2026-07-07 00:00:49
已绑定手机

66

主题

816

回帖

3057

积分

论坛元老

DIY玩家

积分
3057
发表于 2025-11-14 14:59:57 | 显示全部楼层
dong9*** 发表于 2023-5-12 10:23
梁工,你好!在用你这个案例,加了一个定位电位器,检测电机转动位置, 还加了一路PWM 独立输出20K  4-80%  ...

最开始接触pid调差觉得也难搞
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:303
  • 最近打卡:2026-07-06 17:41:09

17

主题

73

回帖

1112

积分

金牌会员

积分
1112
发表于 2026-5-12 14:31:08 | 显示全部楼层
梁工,你好
    咨询一下, 有没有3--5KW(72V系统)等级的,有感无刷电机完整方案呢。 或者案例分享。谢谢了。
BR

点评

高压方案都差不多的,建下图,下载、打开PDF看清晰图。 电路带霍尔或无感都可以,按实际的电路提供12V辅助电源即可。 [attachimg]137514[/attachimg]  详情 回复 发表于 2026-5-12 15:05
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2026-07-06 10:28:35

83

主题

7895

回帖

1万

积分

超级版主

积分
16845
发表于 2026-5-12 15:05:58 | 显示全部楼层
Mike*** 发表于 2026-5-12 14:31
梁工,你好
    咨询一下, 有没有3--5KW(72V系统)等级的,有感无刷电机完整方案呢。 或者案例分享。谢谢了 ...

高压方案都差不多的,建下图,下载、打开PDF看清晰图。

电路带霍尔或无感都可以,按实际的电路提供12V辅助电源即可。
截图202605121505203514.jpg


无刷电机STC32G-310V.pdf (89.88 KB, 下载次数: 4)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:303
  • 最近打卡:2026-07-06 17:41:09

17

主题

73

回帖

1112

积分

金牌会员

积分
1112
发表于 2026-5-12 15:12:19 | 显示全部楼层
梁*** 发表于 2026-5-12 15:05
高压方案都差不多的,建下图,下载、打开PDF看清晰图。

电路带霍尔或无感都可以,按实际的电路提供12V辅 ...

谢谢,  对于空载启动,重载启动,抛载,请问有什么建议嘛。 目前我们正在分析相关驱动控制逻辑。 --- 是第一次遇到这样的案子,所以希望多多了解一下。  同时也拆解了峰迢,芯比达,极海,亚特力的方案在对比分析。

点评

有感,如果要自动控制,可以使用PID方式,可以兼顾这几种工况。  详情 回复 发表于 2026-5-12 16:22
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2026-07-06 10:28:35

83

主题

7895

回帖

1万

积分

超级版主

积分
16845
发表于 2026-5-12 16:22:21 | 显示全部楼层
Mike*** 发表于 2026-5-12 15:12
谢谢,  对于空载启动,重载启动,抛载,请问有什么建议嘛。 目前我们正在分析相关驱动控制逻辑。 --- 是 ...

有感,如果要自动控制,可以使用PID控制,可以兼顾这几种工况。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:303
  • 最近打卡:2026-07-06 17:41:09

17

主题

73

回帖

1112

积分

金牌会员

积分
1112
发表于 2026-5-13 14:39:01 | 显示全部楼层
梁*** 发表于 2026-5-12 16:22
有感,如果要自动控制,可以使用PID控制,可以兼顾这几种工况。

好的,谢谢。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-7 07:14 , Processed in 0.085055 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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