找回密码
 立即注册
楼主: 神农鼎

便宜的车规-FOC,24万转@STC32G12K128-24A车规,STC-FOC 新算法库,11/30更新

 火.. [复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-11-11 14:07:47
已绑定手机

0

主题

1

回帖

6

积分

新手上路

积分
6
发表于 2025-11-11 14:07:47 | 显示全部楼层
这个控制算法跟电机参数没有关系吗,比如极对数,相电感等,看完后有点迷茫。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:129
  • 最近打卡:2026-02-24 10:00:32

11

主题

170

回帖

300

积分

中级会员

积分
300
发表于 2025-11-13 13:48:22 | 显示全部楼层
请问我用P0.0测量外界发送过来的PWM的周期和占空比,程序如下,有什么问题吗?
截图202511131348201504.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:320
  • 最近打卡:2026-03-07 10:14:14

0

主题

154

回帖

335

积分

中级会员

积分
335
发表于 2025-11-13 14:48:04 | 显示全部楼层
梁工您好!请问带霍尔电机能否用SVPWM方式驱动,
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:320
  • 最近打卡:2026-03-07 10:14:14

0

主题

154

回帖

335

积分

中级会员

积分
335
发表于 2025-11-13 14:48:55 | 显示全部楼层
svpwm与方波驱动那个效率高些
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2026-02-27 09:09:39
已绑定手机

0

主题

11

回帖

200

积分

中级会员

积分
200
发表于 2025-11-13 15:47:48 | 显示全部楼层
大家好!我遇到一个问题,使用王工的FOC库,导致所有的串口不能使用,请问这个怎么解决?
初始化Stc_Foc_Init(Foc_User_Init, Foc_Pwm_Swx); // 调用初始化,固定形
导致串口不能正常使用!!!

点评

定时器3被占用了,请不要使用定时器3 例如串口3会使用定时器3作为波特率发生器,请不要使用定时器3 如果非要使用串口3的话,需要将波特率发生器切换到定时器2上 [attachimg]120986[/attachimg] 其余串口均未操作,不  详情 回复 发表于 2025-11-13 17:12
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-03-05 13:33:59
已绑定手机
已实名认证

129

主题

3375

回帖

8784

积分

版主

积分
8784
发表于 2025-11-13 17:12:34 | 显示全部楼层
何*** 发表于 2025-11-13 15:47
大家好!我遇到一个问题,使用王工的FOC库,导致所有的串口不能使用,请问这个怎么解决?
初始化Stc_Foc_In ...

定时器3被占用了,请不要使用定时器3
例如串口3会使用定时器3作为波特率发生器,请不要使用定时器3
如果非要使用串口3的话,需要将波特率发生器切换到定时器2上
截图202511131712081299.jpg
其余串口均未操作,不存在干扰情况
今天更新的版本有串口示例,可以参考使用
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2026-02-27 09:09:39
已绑定手机

0

主题

11

回帖

200

积分

中级会员

积分
200
发表于 2025-11-13 17:45:45 | 显示全部楼层
王*** 发表于 2025-11-13 17:12
定时器3被占用了,请不要使用定时器3
例如串口3会使用定时器3作为波特率发生器,请不要使用定时器3
如果 ...


尝试了串口3和串口2打印都正常,但是对无刷电机的控制就不对了,不能减速,加速按一下就最大。不知道问题出现在哪里!
/******************* IO配置函数 *******************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                //结构定义

        GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
        GPIO_InitStructure.Mode = GPIO_PullUp;        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P4,&GPIO_InitStructure);        //初始化
}

/***************  串口初始化函数 *****************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                                        //结构定义

        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
//        COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2, 所以不用选择)
        COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率,     110 ~ 115200
        COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
        UART_Configuration(UART2, &COMx_InitStructure);                //初始化串口2 USART1,USART2,USART3,USART4
        NVIC_UART2_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        UART2_SW(UART2_SW_P46_P47);                //UART2_SW_P10_P11,UART2_SW_P46_P47
}

/**********************************************/
void main(void)
{
        WTST = 0;
        CKCON = 0;
        EAXFR = 1;                                                                  // SFR enable, 允许访问扩展寄存器
        Stc_Foc_Init(Foc_User_Init, Foc_Pwm_Swx); // 调用初始化,固定形式
        EA = 1;                                                                          // 打开总中断
        Io_Init();                                                                  // 用户的其他初始化部分
        GPIO_config();
        UART_config();
        set_duty = 250; // 占空比最高可达1024(超过1024进入过调制状态,最高可达1177,允许再放大1.15倍)
#if START_MODE == 0 // 是否上电启动
        {
                ReStart_Moto();
        } // 已启动
#else
        {
                Stop_Moto();
        } // 未启动
#endif

        PrintString2("STC32G UART2 Test Programme!\r\n"); // UART2发送一个字符串

        while (1)
        {
                // 用户的其他循环程序
                // set_duty = 1177;//过调制状态最大占空比,此时接近方波的电压利用率
                if (P32 == 0 && set_duty > 10)
                        set_duty--; // 更高的占空比

                if (P33 == 0 && set_duty < 1024)
                        set_duty++; // 满占空比

                if (P34 == 0) // 正反转切换
                {
                        if (CW_CCW == 0)
                                CW_CCW = 1;
                        else
                                CW_CCW = 0;                                                   // 取反正反转标志位
                        if (B_Timer3_OverFlow < Ref_OVER_TIME) // 判断如果还在转
                        {
                                while (B_Timer3_OverFlow > Ref_OVER_TIME)
                                        ;
                                ReStart_Moto(); // 等待停转,然后重新启动
                        }
                        while (P34 == 0)
                                ;
                };
                if (P54 == 0)
                {
                        if (B_Timer3_OverFlow > Ref_OVER_TIME)
                        {
                                ReStart_Moto();
                        } // 启动/停止控制
                        // else{Fast_Stop_Moto();while(P54==0);}}//可选快速刹车
                        else
                        {
                                Stop_Moto();
                                while (P54 == 0)
                                        ;
                        }
                } // 可选慢速刹车(自由滑行刹停)
        }
}

点评

将foc初始化放在其他初始化最后试试?大概是其他初始化改动了foc的初始化内容  详情 回复 发表于 2025-11-13 18:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-03-05 13:33:59
已绑定手机
已实名认证

129

主题

3375

回帖

8784

积分

版主

积分
8784
发表于 2025-11-13 18:28:05 | 显示全部楼层
何*** 发表于 2025-11-13 17:45
尝试了串口3和串口2打印都正常,但是对无刷电机的控制就不对了,不能减速,加速按一下就最大。不知道问 ...

将foc初始化放在其他初始化最后试试?大概是其他初始化改动了foc的初始化内容
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:129
  • 最近打卡:2026-02-24 10:00:32

11

主题

170

回帖

300

积分

中级会员

积分
300
发表于 2025-11-14 09:19:41 | 显示全部楼层
请问我用P0.0测量外界发送过来的PWM的周期和占空比,程序如下,有什么问题吗?
截图202511140919402520.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2026-03-07 09:59:50
已绑定手机

4

主题

197

回帖

746

积分

高级会员

积分
746
发表于 2025-11-14 09:25:32 | 显示全部楼层
首先感谢楼主提供的电路、程序(库)。
等我有空了一定要弄一下。
前面几个视频只能看第一个,其它的只有声音,不知是不是我浏览器的问题。
关于反电势的采集,电路中只用四只电阻,相比于BLDC一般需要9只电阻,这个简直把成本降到了极致。
四只电阻形成分压后的U、V相电压到比较器的两个输入,比较器动作的时候其实是三相电压中的UV相电压的交叉点,与过零点存在30度的相位差。
原理猜测应该是在PWM中断里,在死区时间内查询比较器的输出,计算换相周期,不知对不对?
其实这并非真正的“FOC”(磁场定向),只能称之为“正弦驱动”,但是它能像FOC一样低噪音,不知我的理解对不对?
建议楼主多讲解一些原理性的东西,或者给一个简单些的源代码(C文件,不是库的那种),比如用户需要在PWM中断里做一些采集、过流保护等,才会比较方便扩展。
前些天我看到21ic上的一个资料,感觉很有用,分享给大家:
“利用死区时间间隔检测正弦驱动电机反电动势的方法”
https://bbs.21ic.com/forum.php?mod=viewthread&tid=3455176
利用死区时间间隔检测正弦驱动电机反电动势的方法.pdf (1.4 MB, 下载次数: 17)

点评

FOC全称是定向磁场控制,我这个里面使用了SVPWM,确实可以做到定向磁场控制 并且这个控制也是有闭环同步的,叫FOC没什么问题 相电流也可以实际观测到,确实是正弦波 不过原理确实和传统FOC不大一样就是了,没有使用  详情 回复 发表于 2025-11-27 17:03
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 10:42 , Processed in 0.126167 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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