耀子 发表于 2025-11-16 07:21:18

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

明白了,感谢梁老师{:ciya:}

HUHUhuhu 发表于 2025-11-18 08:27:55

请教一个问题,我现在想用外部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即高电平计数,请问是这样吗?

ct1000 发表于 2025-11-18 10:59:52

王昱顺 发表于 2025-9-8 12:452025年11月13日 新 更新 STC-FOC库,提供完整的项目程序






可以正常转动,但是三相的波形怎么不一样呢,

王昱顺 发表于 2025-11-18 12:41:33

ct1000 发表于 2025-11-18 10:59
可以正常转动,但是三相的波形怎么不一样呢,

无刷电机三相驱动本来就是相差120度的
他要一样那还能转嘛{:4_167:},那不就电平一致等效没通电了

何春木 发表于 2025-11-18 15:37:26

王工 !无刷电机启动一瞬间会抖动,有时候会正常运行,有时候电机启动不成功。而且电机在启动一瞬间电流在0.5A左右,请问这个应该怎么解决呢?附件是我的电机照片。谢谢

何春木 发表于 2025-11-18 16:18:18

何春木 发表于 2025-11-18 15:37
王工 !无刷电机启动一瞬间会抖动,有时候会正常运行,有时候电机启动不成功。而且电机在启动一瞬间电流在0 ...


// 电机参数相关:开环强拖参数、退磁等待时间,参考参数
#define Ref_MIN_PWM 300UL           // 开始强拖PWM值
#define Ref_MAX_PWM 350UL           // 结束强拖PWM值
#define Ref_MAX_FREQ 25UL           // 单位:us,每次切换角度间隔时间起始
#define Ref_MIN_FREQ 3UL           // 单位:us,每次切换角度间隔时间结束(从150us到1us)
#define Ref_DTIME 10000UL           // 细分步进,整个开环需要细分成多少个片进行变化
#define Ref_MOTO_DE_TIME_uS 20 // 电机退磁时间(32位无符号),如果出现换向异常可以调整这个数据,避开退磁脉冲
#define Ref_OVER_TIME 2                   // 超时时间(单位:32.768ms),用于判断B_Timer3_OverFlow的值是否超过此阈值,超过后即认为堵转,水泵类可调大此阈值


通过修改这里 启动的概率会有提高,但是还是会有启动不成功的时候,而且启动电流比较大,在12V的情况下电流达到2A左右。

王昱顺 发表于 2025-11-19 12:03:59

何春木 发表于 2025-11-18 16:18
// 电机参数相关:开环强拖参数、退磁等待时间,参考参数
#define Ref_MIN_PWM 300UL           // 开始强拖PWM ...

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

HUHUhuhu 发表于 2025-11-19 12:39:33

王工你好,我现在使用外部中断来检测外部PWM输入的频率和占空比了,但是引入外部中断貌似会干扰原本库的正常运行导致电机运行过程中产生顿挫,请问有什么改进方法吗?

王昱顺 发表于 2025-11-19 15:20:47

HUHUhuhu 发表于 2025-11-19 12:39
王工你好,我现在使用外部中断来检测外部PWM输入的频率和占空比了,但是引入外部中断貌似会干扰原本库的正 ...

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

HUHUhuhu 发表于 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即高电平计数,请问是这样吗?
页: 29 30 31 32 33 34 35 36 37 38 [39] 40 41 42 43 44 45 46 47 48
查看完整版本: 便宜的车规-FOC,24万转@STC32G12K128-24A车规,STC-FOC 新算法库,4/1更新