MCSDK 扇区判断解析

前言

本文为学习st的电机库MCSDK笔记,记录判断扇区的逻辑,并结合其他文章进行对比。

关键词:SVPWMMCSDK,FOC

扇区判断

参考文章:《彻底吃透SVPWM如此简单》


图1

参考图1,为了便于判断扇区,将αβ坐标系用三条直线分割,分别是:

β=0β=tan(π3)α=3αβ=tan(π3)α=3α

通过判断向量在每条直线的上下即可判断扇区。
因此记

X=βY=3αβ2Z=3αβ2

对XYZ的大小进行判断,即可得知当前所在扇区
(注:这里除2的原因目前不太清楚;st的αβ坐标系以向下为正)。

扇区 X Y Z
1 >0 >0 <0
2 >0 >0 >0
3 >0 <0 >0
4 <0 <0 >0
5 <0 <0 <0
6 <0 >0 <0

对比ST代码:

    wUAlpha = Valfa_beta.alpha * (int32_t)pHandle->hT_Sqrt3;
    wUBeta = -(Valfa_beta.beta * ((int32_t)pHandle->PWMperiod)) * 2;

    wX = wUBeta;
    wY = (wUBeta + wUAlpha) / 2;
    wZ = (wUBeta - wUAlpha) / 2;

    /* Sector calculation from wX, wY, wZ */
    if (wY < 0){
      if (wZ < 0){}
      else /* wZ >= 0 */
      if (wX <= 0){}
      else /* wX > 0 */
      {}
    }
    else /* wY > 0 */
    {
      if (wZ >= 0)
      {}
      else /* wZ < 0 */
      if ( wX <= 0 ){}
      else /* wX > 0 */
      {}
    }

首先,根据传入的αβ值生成中间值wUAlpha,wUBeta。有

wUAlpha=23VαTswUBeta=2VβTs

计算得

wX=2VβTswY=(Vβ+3Vα)TswZ=(Vβ3Vα)Ts

根据wX,wY,wZ目前可以确定扇区,但是还无法确定各向量的作用时间。

时间计算

先分析st的计算流程:

    if (wY < 0){
      if (wZ < 0)
      {
        pHandle->Sector = SECTOR_5;
        wTimePhA = (((int32_t)pHandle->PWMperiod) / 4) + ((wY - wZ) / (int32_t)262144);
        wTimePhB = wTimePhA + (wZ / 131072);
        wTimePhC = wTimePhA - (wY / 131072) ;
      }
    }

wY<0时,wZ<0时,扇区为5。
然后看Ta,Tb,Tc的计算,和wY,wZ有关,且随扇区变化。

看结果看不出来,需要正向推导下。

参考图2:


图2

记总导通时间为Ts

(1)|U4|=V4Ts(2)|U6|=V6Ts

Uout分解,记T4为基本矢量V4的作用时间,T6为基本矢量V6的作用时间,有

(3)|U1|=V4T4(4)|U2|=V6T6

Uout在αβ轴的投影记为Uα,Uβ,有

(5)Uα=|U1|+|U2|cos(π3)(6)Uβ=|U2|sin(π3)

联立(1)~(6)可得:

Uα=|U4|Ts×T4+|U6|Ts×T6cos(π3)Uβ=|U6|Ts×T6sin(π3)

解得

T4=(3Uα+Uβ)Ts3|U4|T6=2UβTs3|U6|

在一般情况下,|U4|=|U6|=2Udc3,其中|Udc|为最大输出相电压,但是|Uout|无法完全维持在Udc,如图3所示:


图3

为了避免输出电压失真,将|Umax|限制在|3Ux2|

则有:

T4=3UαTs+UβTs2|Umax|T6=UβTs|Umax|

在ST的库中,Uα|Umax|=Vα,Uβ|Umax|=Vβ,因此

T4=(3VαTs+VβTs)2=wZ2T6=VβTs=wX2

在第一扇区,矢量分布如图4:


图3

由于采用中心对称计数模式,计算单侧时间即可。
可得

Ta=T04=TsT4T64=Ts4+(wZwX)8Tb=Ta+T42=TawZ4Tc=Tb+T62=Tb+wX4

代码解读

这时候对比st的代码

    pHandle->Sector = SECTOR_1;
    wTimePhA = (((int32_t)pHandle->PWMperiod) / 4)+ ((wX - wZ) / (int32_t)262144);
    wTimePhB = wTimePhA + (wZ / 131072);
    wTimePhC = wTimePhB - (wX / 131072);

显然

262144=32768×8131072=32768×4

观察wX:

wX=2VβTs

其中Vβint16_t,即q15格式。在前面有

Vβ=Uβ|Umax|

显然Vβ[1,1],为浮点型。因此这里除以32768实际上是将q15转换为float

因此st计算公式可表示为

Ta=Ts4+(wXwZ)8Tb=Ta+wZ4Tc=TbwX4

可以看到,和我们推算出的公式符号不一致。

参考st的定时器配置,发现st采用的向下中心计数模式,前面参考的图为向上计数,因此重新推算公式如下:

Ta=Ts2T04=Ts+T6+T44=Ts4+(wXwZ)8Tb=TaT42=Ta+wZ4Tc=Tb+T62=TbwX4

和代码中吻合。

其他扇区按照相同方法推算,得出每个扇区对应的计算公式,实际使用时,根据扇区选择对应的计算公式即可。

过调制

前面为了矢量不失真,将|Umax|限制了在|32Ux||33Udc|

[0,3Udc3]称之为线性区,在线性区内,UoutUαUβ线性相关;

(33Udc,23Udc]称之为过调制区,在过调制区内,需要对UαUβ进行缩放,以保证合成矢量Uout不超出最大幅值。过调制方法这里不再探讨,可以参考相关文章:

《STM32 MC SDK Overmodulation (new in V5.Y) - stm32mcu (stmicroelectronics.cn)》

《电控入门之五(电机FOC,SVPWM过调制算法) - 知乎 (zhihu.com)》

《stm32 foc 库输出波形 - USTHzhanglu - 博客园 (cnblogs.com)》

posted @   USTHzhanglu  阅读(488)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示