你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ST2.0电机库SVPWM计算求指导(后加了扇区计算对比程序分析)  

[复制链接]
单片机_电子爱好者 提问时间:2016-9-11 20:45 /
本帖最后由 单片机_电子爱好者 于 2018-12-10 17:03 编辑

ST官方给的svpwm计算没有推导过程只有结果,对其过程不是很懂,望懂的赐教,感激不尽
附上我自己画的stm32fxx系列STM原理图,21楼和24楼有干货
ST svpwm.png

Schematic Prints1.pdf

下载

80.47 KB, 下载次数: 178, 下载积分: ST金币 -1

以前设计的,验证过的可以用,设计上如有缺陷勿喷

STM32F103_永磁同步电机_PMSM_FOC软件库_用户手册_中文版.pdf

下载

2.42 MB, 下载次数: 600, 下载积分: ST金币 -1

2 收藏 6 评论53 发布时间:2016-9-11 20:45

举报

53个回答
单片机_电子爱好者 回答时间:2018-7-31 17:36:33
ST使用的坐标系和其他家的不一样所以ST电机库的程序不太好看,现在没搞FOC了,在搞BLDC,有人搞过ST官网给的快速退磁吗?可以一起交流
龙吞潭水 回答时间:2018-11-29 09:29:33
单片机_电子爱好者 发表于 2018-11-13 18:04
我这几天推了一下,知道为什么少了根号3/Udc,主要是因为标幺话的缘故,st程序中对V alfe和Vbeta标幺成Q15 ...

楼主,能不能分析一下 FOC 2.0 无感启动过程啊?  
void STO_Start_Up(void)
{
  s16 hAux;
#ifdef NO_SPEED_SENSORS_ALIGNMENT
  static u32 wAlignmentTbase=0;
#endif  
  
  switch(Start_Up_State)
  {
  case S_INIT:
    //Init Ramp-up variables
    if (hSpeed_Reference >= 0)
    {
      hFreq_Inc = FREQ_INC;
      hI_Inc = I_INC;
      if (wTime == 0)
      {
        wStart_Up_I = FIRST_I_STARTUP *1024;
      }
    }
    else
    {
      hFreq_Inc = -(s16)FREQ_INC;
      hI_Inc = -(s16)I_INC;
      if (wTime == 0)
      {
        wStart_Up_I = -(s32)FIRST_I_STARTUP *1024;
      }
    }
    Start_Up_State = ALIGNMENT;
    break;
   
  case ALIGNMENT:
#ifdef NO_SPEED_SENSORS_ALIGNMENT
    wAlignmentTbase++;
    if(wAlignmentTbase <= SLESS_T_ALIGNMENT_PWM_STEPS)
    {                  
      hFlux_Reference = SLESS_I_ALIGNMENT * wAlignmentTbase /
                                                    SLESS_T_ALIGNMENT_PWM_STEPS;               
      hTorque_Reference = 0;
      
      Stat_Curr_a_b = GET_PHASE_CURRENTS();
      Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b);
      Stat_Curr_q_d = Park(Stat_Curr_alfa_beta, SLESS_ALIGNMENT_ANGLE_S16);  
      /*loads the Torque Regulator output reference voltage Vqs*/   
      Stat_Volt_q_d.qV_Component1 = PID_Regulator(hTorque_Reference,
                        Stat_Curr_q_d.qI_Component1, &PID_Torque_InitStructure);  
      /*loads the Flux Regulator output reference voltage Vds*/
      Stat_Volt_q_d.qV_Component2 = PID_Regulator(hFlux_Reference,
                          Stat_Curr_q_d.qI_Component2, &PID_Flux_InitStructure);

      RevPark_Circle_Limitation();

      /*Performs the Reverse Park transformation,
      i.e transforms stator voltages Vqs and Vds into Valpha and Vbeta on a
      stationary reference frame*/

      Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);

      /*Valpha and Vbeta finally drive the power stage*/
      CALC_SVPWM(Stat_Volt_alfa_beta);
    }
    else
    {
      wAlignmentTbase = 0;               
      Stat_Volt_q_d.qV_Component1 = Stat_Volt_q_d.qV_Component2 = 0;
      hTorque_Reference = PID_TORQUE_REFERENCE;
      hFlux_Reference = PID_FLUX_REFERENCE;
      Start_Up_State = RAMP_UP;
      hAngle = SLESS_ALIGNMENT_ANGLE_S16;      
    }
#else
    Start_Up_State = RAMP_UP;   
#endif   
    break;
   
  case RAMP_UP:
    wTime ++;  
    if (wTime <= I_STARTUP_PWM_STEPS)
    {     
      wStart_Up_Freq += hFreq_Inc;
      wStart_Up_I += hI_Inc;
    }
    else if (wTime <= FREQ_STARTUP_PWM_STEPS )
    {
      wStart_Up_Freq += hFreq_Inc;
    }      
    else
    {
      MCL_SetFault(START_UP_FAILURE);
      //Re_initialize Start Up
      STO_StartUp_Init();
    }
   
    //Add angle increment for ramp-up
    hAux = wStart_Up_Freq/65536;
    hAngle = (s16)(hAngle + (s32)(65536/(SAMPLING_FREQ/hAux)));
        
    Stat_Curr_a_b = GET_PHASE_CURRENTS();
    Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b);
    Stat_Curr_q_d = Park(Stat_Curr_alfa_beta, hAngle);
   
    hAux = wStart_Up_I/1024;
    hTorque_Reference = hAux;      
    hFlux_Reference = 0;
           
    /*loads the Torque Regulator output reference voltage Vqs*/   
    Stat_Volt_q_d.qV_Component1 = PID_Regulator(hTorque_Reference,
                        Stat_Curr_q_d.qI_Component1, &PID_Torque_InitStructure);
    /*loads the Flux Regulator output reference voltage Vds*/
    Stat_Volt_q_d.qV_Component2 = PID_Regulator(hFlux_Reference,
                          Stat_Curr_q_d.qI_Component2, &PID_Flux_InitStructure);
   
    RevPark_Circle_Limitation();
  
    /*Performs the Reverse Park transformation,
    i.e transforms stator voltages Vqs and Vds into Valpha and Vbeta on a
    stationary reference frame*/
   
    Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);
  
    /*Valpha and Vbeta finally drive the power stage*/
    CALC_SVPWM(Stat_Volt_alfa_beta);
   
    STO_Calc_Rotor_Angle(Stat_Volt_alfa_beta,Stat_Curr_alfa_beta,MCL_Get_BusVolt());
   
    if (IsObserverConverged()==TRUE)
    {      
      PID_Speed_InitStructure.wIntegral = (s32)(hTorque_Reference*256);
      STO_StartUp_Init();  
      State = RUN;
      if ((wGlobal_Flags & SPEED_CONTROL) != SPEED_CONTROL)
      {
        hTorque_Reference = PID_TORQUE_REFERENCE;
        hFlux_Reference = PID_FLUX_REFERENCE;
      }      
    }   
    break;
  default:
    break;
  }   
}

/*******************************************************************************
* Function Name : STO_StartUp_Init
* Description : This private function initializes the sensorless start-up
* Input : details the input parameters.
* Output : details the output parameters.
* Return : details the return value.
*******************************************************************************/
void STO_StartUp_Init(void)
{
  //Re_initialize Start Up
  Start_Up_State = S_INIT;  
  hAngle = 0;
  wTime = 0;
  wStart_Up_Freq = 0;
  bConvCounter = 0;
}      
单片机_电子爱好者 回答时间:2018-12-10 16:57:30
龙吞潭水 发表于 2018-11-29 09:29
楼主,能不能分析一下 FOC 2.0 无感启动过程啊?  
void STO_Start_Up(void)
{

我今天看了一下,st的无感启动流程大致是三步:预定位 强拖 闭环
预定位: 转矩电流给0  励磁电流给设定的最大电流值(从0增加到SLESS_I_ALIGNMENT) 把D轴吸到90度位置,执行时间是SLESS_T_ALIGNMENT设定的值默认700ms   时间已到完成预定位
强拖:    励磁电流给0  转矩电流从FIRST_I_STARTUP增加到设定的最大电流值FINAL_I_STARTUP执行时间I_START_UP_DURATION(默认FIRST_I_STARTUP=FINAL_I_STARTUP),并且在电流增加的过程角速度dpp从0增加到FINAL_START_UP_SPEED,执行时间FREQ_START_UP_DURATION,并且一直检测无感算法是否收敛,如果收敛闭环,否则继续拖,如果时间大于FREQ_START_UP_DURATION还未收敛,认为启动失败
闭环 : 就是无感估算位置啦
其实说白了就是BLDC的升压升频拖动,默认恒压升频拖动,讲的够详细了吧,个人愚见,有更好的启动算法可以讨论
alisa123 回答时间:2016-9-12 13:19:15
楼主,这个你是在哪里看到st给的计算的?
单片机_电子爱好者 回答时间:2016-9-25 22:12:30
st的官方手册啊?
fangli 回答时间:2016-12-18 11:58:54
楼主你好,我是新手,你说的库是那些?我现在用STM8S103F3,K3,还有STM32F103系列,原来开发了一些通讯、液晶控制方面的产品,现在想要开发变频器,希望能获得你的指点,谢谢!
jcx0324 回答时间:2017-8-4 09:41:34
TI上面有详细介绍,感觉ST这些都是遮遮掩掩的, 还没TI的强
czhuanqilai 回答时间:2018-2-5 00:09:15
努力的人 发表于 2017-8-5 19:08
https://www.stmcu.org.cn/module/forum/thread-610617-1-1.html看我的帖子

楼主贴出来的文档里的Uα 与 Uβ 和现在网上 的文档给出的公式不一样,不知道为啥要乘以T
能讲解一下么?
czhuanqilai 回答时间:2018-2-5 00:12:53
努力的人 发表于 2017-8-5 19:08
https://www.stmcu.org.cn/module/forum/thread-610617-1-1.html看我的帖子

安哥文档就是你贴出来得那个,看了文档之后看ST的程序,看不懂
努力的人 回答时间:2018-2-5 11:03:05
czhuanqilai 发表于 2018-2-5 00:12
安哥文档就是你贴出来得那个,看了文档之后看ST的程序,看不懂

T就是采样的时间,要想搞懂就自己写程序,SVPWM的程序网上就能搜到,ST的库我一般都是调用库的API来进行控制的。你就单独写SVPWM的程序调,光看是不行的

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

czhuanqilai 回答时间:2018-2-5 20:45:26
没找到 和 文档 里描述一样的程序!!    想模仿一下大神们写的,再理解理解
qwerzxcv-339169 回答时间:2018-8-3 13:55:12
楼主你好,你看的官网文档能发我一份么?就是图片里讲关于扇区判定的文档,谢谢!see-flying@163.com
单片机_电子爱好者 回答时间:2018-8-28 19:45:19
qwerzxcv-339169 发表于 2018-8-3 13:55
楼主你好,你看的官网文档能发我一份么?就是图片里讲关于扇区判定的文档,谢谢! ...

附件里面有啊,我没有设置要积分啊,
单片机_电子爱好者 回答时间:2018-9-4 11:21:51
好久没有搞FOC了,需要解释st svpwm计算的人多的话,有时间再把ST扇区计算svpwm回顾一下,把原理讲一下
fufudezheng 回答时间:2018-9-12 21:57:25
楼主这个官方教程能发一下吗?
1234下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版