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

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

 火... [复制链接]
已绑定手机

0

主题

11

回帖

212

积分

中级会员

积分
212
发表于 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
回复

使用道具 举报 送花

已绑定手机
已实名认证

147

主题

4049

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

已绑定手机

0

主题

11

回帖

212

积分

中级会员

积分
212
发表于 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
回复

使用道具 举报 送花

已绑定手机
已实名认证

147

主题

4049

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

11

主题

171

回帖

308

积分

中级会员

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

使用道具 举报 送花

已绑定手机

7

主题

413

回帖

6606

积分

论坛元老

积分
6606
发表于 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, 下载次数: 37)

点评

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

使用道具 举报 送花

已绑定手机

0

主题

3

回帖

32

积分

新手上路

积分
32
发表于 2025-11-14 09:46:18 | 显示全部楼层
电流检测能提供一个接口吗,方便控制输出功率和力矩
回复

使用道具 举报 送花

53

主题

1471

回帖

3694

积分

超级版主

积分
3694
发表于 2025-11-14 11:04:27 | 显示全部楼层
ugpbejnh 发表于 2025-11-14 09:48
高压的开发板能提供购买渠道吗,有个电动工具项目上要用,想先学习一下 ...
截图202511141308452714.jpg

微信商城有高压实验板【是空板,需自己焊接元器件】

STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复

使用道具 举报 送花

1

主题

13

回帖

385

积分

中级会员

积分
385
发表于 2025-11-15 12:28:29 | 显示全部楼层
a2f06d6e-bd99-4b13-94a3-f0a9b2a3ec37.png

老师们,这个极对数不都是双吗?我的无刷极对数是2个。。这里设置2吗?

点评

磁极对数可以是单或双,1对、2对、3对。。。 磁极数才是双数。  详情 回复 发表于 2025-11-15 16:24
回复

使用道具 举报 送花

83

主题

8223

回帖

1万

积分

超级版主

积分
17658
发表于 2025-11-15 16:24:40 | 显示全部楼层
耀*** 发表于 2025-11-15 12:28
老师们,这个极对数不都是双吗?我的无刷极对数是2个。。这里设置2吗?

...

磁极对数可以是单或双,1对、2对、3对。。。
磁极数才是双数。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-26 05:11 , Processed in 0.078002 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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