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

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

 火.. [复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-12-17 10:15:23
已绑定手机
已实名认证

123

主题

3278

回帖

8316

积分

版主

积分
8316
发表于 2025-11-19 12:03:59 | 显示全部楼层
何*** 发表于 2025-11-18 16:18
// 电机参数相关:开环强拖参数、退磁等待时间,参考参数
#define Ref_MIN_PWM 300UL           // 开始强拖PWM ...

可以使用最新的库函数
电流过大可以调低一点pwm的值
开环启动参数调整请看最新版程序里面的文档,有讲如何调整
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-12-05 09:16:53

11

主题

157

回帖

631

积分

高级会员

积分
631
发表于 2025-11-19 12:39:33 | 显示全部楼层
王工你好,我现在使用外部中断来检测外部PWM输入的频率和占空比了,但是引入外部中断貌似会干扰原本库的正常运行导致电机运行过程中产生顿挫,请问有什么改进方法吗?

点评

频率比较高的话,就是会反复进入中断 这个可以使用pwmb的输入捕获来实现  详情 回复 发表于 2025-11-19 15:20
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-12-17 10:15:23
已绑定手机
已实名认证

123

主题

3278

回帖

8316

积分

版主

积分
8316
发表于 2025-11-19 15:20:47 | 显示全部楼层
HUHU*** 发表于 2025-11-19 12:39
王工你好,我现在使用外部中断来检测外部PWM输入的频率和占空比了,但是引入外部中断貌似会干扰原本库的正 ...

频率比较高的话,就是会反复进入中断
这个可以使用pwmb的输入捕获来实现
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-12-05 09:16:53

11

主题

157

回帖

631

积分

高级会员

积分
631
发表于 2025-11-19 16:11:08 | 显示全部楼层
王*** 发表于 2025-11-19 15:20
频率比较高的话,就是会反复进入中断
这个可以使用pwmb的输入捕获来实现 ...

王工,我原先是想用PWMB的捕获输入来写的,但是没有成功。我的程序如下,麻烦帮我看看哪里设置有问题。请教一个问题,我现在想用外部PWM(1Khz)的占空比来控制电机转速。目前使用的是P00的输入捕获功能,同时测量外部PWM的频率和占空比,程序如下。我调试了好久都无法实现,请问是哪边设置有问题吗?

void PWM_Config(void)
{

        PWMB_ARRH = (u16)(1000 >> 8);                                                
        PWMB_ARRL = (u16)(1000);




        PWMB_PSCRH = (u16)(23>> 8);                              
        PWMB_PSCRL = (u16)(23);      


        PWMB_CCER1 = 0x00;                                                                                               
                                                                                                                                                                              
        PWMB_CCMR1 = 0x01;                                                                                                
        PWMB_CCER1 |= 0x01;                                                                                               
        PWMB_CCMR2 = 0x02;                                                                                               
        PWMB_CCER1 |= 0x30;                                                                                               
        PWMB_PS = 0x02;                                                                                                        
        PWMB_IER = 0x06;                                                                                                        
        P00 = 1;
        P01 = 1;



        PWMB_CR1 |= 0x01;                                                                                                
}



void PWMB_ISR() interrupt 27                                                                                                                                                                       
{
        if (PWMB_SR1 & 0X02)                                                                                                                                                      
        {      
                PWMB_SR1 &= ~0X02;                                                                                                                                                      
                cap1 =(PWMB_CCR1H << 8) + PWMB_CCR1L;                                                                              
        }
        if(PWMB_SR1 & 0x04)                                                                                                                                                               
        {
                PWMB_SR1 &= ~0x04;                                                                                                                                                      
                cap2 =(PWMB_CCR2H << 8) + PWMB_CCR2L;                                                                              
        }
      
        F_Inpwm_Done = 1;                                                                                                                                                                       
        Inpwm_Down_Count = 0;
}



程序中的cap1即周期计数,cap2即高电平计数,请问是这样吗?

点评

不是这样的,建议你先在一个开发板上尝试捕获的程序,成功以后再移植过去 计算占空比需要做减法和除法运算,这个捕获值只是捕获时刻的PWM计数器计数值 需要自己另外计算才能得到占空比,是无法直接得到占空比的 这部  详情 回复 发表于 2025-11-19 17:48
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-12-17 10:15:23
已绑定手机
已实名认证

123

主题

3278

回帖

8316

积分

版主

积分
8316
发表于 2025-11-19 17:48:24 | 显示全部楼层
HUHU*** 发表于 2025-11-19 16:11
王工,我原先是想用PWMB的捕获输入来写的,但是没有成功。我的程序如下,麻烦帮我看看哪里设置有问题。请 ...

不是这样的,建议你先在一个开发板上尝试捕获的程序,成功以后再移植过去
计算占空比需要做减法和除法运算,这个捕获值只是捕获时刻的PWM计数器计数值
需要自己另外计算才能得到占空比,是无法直接得到占空比的
这部分程序可以参考论坛内的PWM捕获部分程序,都很完善
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:81
  • 最近打卡:2025-12-17 07:24:03
已绑定手机

0

主题

12

回帖

291

积分

中级会员

积分
291
发表于 2025-11-20 23:20:10 | 显示全部楼层
王*** 发表于 2025-9-8 12:45
2025年11月13日 新 更新 STC-FOC库,提供完整的项目程序

王工,目前我12V小电机是空载,微调参数后下载给驱动板,能顺利驱动电机,但过一会(转速感觉挺快了)就停止了,按照贴吧内容,应该属于【进不去闭环】。看了40页内容,没看到很明确的调试思路。

对于进入电机闭环,需要什么条件呐?开环到达某个速度以上?电阻采样电流要大于某个值?还有什么其他要求么?

目前一个参数一个参数的去调试看效果,效率很低阿。

点评

很简单验证办法就是用手拧一下看看能不能转起来 文档里面写了这些排查方法的 最大的可能是闭环后的驱动占空比过小导致没有力气继续驱动  详情 回复 发表于 2025-11-21 08:42
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-12-17 10:15:23
已绑定手机
已实名认证

123

主题

3278

回帖

8316

积分

版主

积分
8316
发表于 2025-11-21 08:42:05 | 显示全部楼层
曾*** 发表于 2025-11-20 23:20
王工,目前我12V小电机是空载,微调参数后下载给驱动板,能顺利驱动电机,但过一会(转速感觉挺快了)就 ...

很简单验证办法就是用手拧一下看看能不能转起来
文档里面写了这些排查方法的
最大的可能是闭环后的驱动占空比过小导致没有力气继续驱动
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-12-05 09:16:53

11

主题

157

回帖

631

积分

高级会员

积分
631
发表于 2025-11-21 08:54:25 | 显示全部楼层
王*** 发表于 2025-11-19 17:48
不是这样的,建议你先在一个开发板上尝试捕获的程序,成功以后再移植过去
计算占空比需要做减法和除法运 ...

王工你好,现在输入捕获功能已经调试出来了。但是我发现如果同一组PWMB,其中一个通道设置为输入捕获,而另一组通道设置为PWM输出,这2个功能不能同时实现。调试后发现是由于当将其中一组通道设置为PWM输出时,设置了PWMB_ARRH 和 PWMB_ARRL 的值,导致开启捕获功能时达到了溢出;而如果单独开启输入捕获功能时通常把 PWMB_ARRH 和 PWMB_ARRL 设置为FFFF。请问又什么方法既可以满足输入捕获功能,又可以使输出PWM的频率随意改变?

点评

不好做到的,如果仅仅是捕获高电平宽度可以使用INT配合定时器实现 PWMB只用来输出这样子,否则PWM同时配置成输入和输出是会相互干扰的  详情 回复 发表于 2025-11-21 17:50
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:81
  • 最近打卡:2025-12-17 07:24:03
已绑定手机

0

主题

12

回帖

291

积分

中级会员

积分
291
发表于 2025-11-21 08:55:07 | 显示全部楼层
王*** 发表于 2025-11-21 08:42
很简单验证办法就是用手拧一下看看能不能转起来
文档里面写了这些排查方法的
最大的可能是闭环后的驱动占 ...

开环转起来一会后,突然停止,再手动正转反转,都没反应。而且set_duty = 900;,,开环参数如下:
#define Ref_MIN_PWM 500UL                                       
#define Ref_MAX_PWM 900UL                                
#define Ref_MAX_FREQ 200UL                                        
#define Ref_MIN_FREQ 120UL                                        
#define Ref_DTIME 10000UL                                        
#define Ref_MOTO_DE_TIME_uS 20                               
#define Ref_OVER_TIME 16

Ref_OVER_TIME ,尝试过给16000,就开环转久一点,但最终还是会停下来。
所以,满足什么条件,才能进入闭环?

点评

手动正反转都没有反应,考虑反馈到MCU的两路端电压采样是否正常? 使用的是官方购买到的电机开发板吗?  详情 回复 发表于 2025-11-21 17:51
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-12-17 10:15:23
已绑定手机
已实名认证

123

主题

3278

回帖

8316

积分

版主

积分
8316
发表于 2025-11-21 17:50:35 | 显示全部楼层
HUHU*** 发表于 2025-11-21 08:54
王工你好,现在输入捕获功能已经调试出来了。但是我发现如果同一组PWMB,其中一个通道设置为输入捕获,而 ...

不好做到的,如果仅仅是捕获高电平宽度可以使用INT配合定时器实现
PWMB只用来输出这样子,否则PWM同时配置成输入和输出是会相互干扰的
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-17 10:30 , Processed in 0.119855 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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