手把手教你电机FOC控制【二】

手把手教你电机FOC控制【二】

文章作者: 范子琦
文章链接: https://www.robotsfan.com/posts/d99d1c1a.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 范子琦的博客

SVPWM

根据BLDC的六步换向,可以将一圈分为六个扇区,前文FOC引入章节已经讲过,只需要控制每个状态通电的时间就可以控制转子到达任意角度。这就是SVPWM。

SVPWM的输入为 U α U_{\alpha} Uα U β U_{\beta} Uβ ,输出为三向计数器的比较值。所以应该首先判断用哪两个相邻矢量,然后计算两个相邻矢量的作用时长,然后将作用时长转化成计数器的比较数值送入定时器。下面对这三个步骤进行讲解。

扇区判断

三相电压可以表示为( U m U_{m} Um 为电压幅值):
U a = U m c o s θ U b = U m c o s ( θ − 2 3 π ) U c = U m c o s ( θ + 2 3 π ) \begin{array}{l} U_a = U_{m}cos\theta \\ U_b = U_{m}cos(\theta-\frac{2}{3}\pi) \\ U_c = U_{m}cos(\theta+\frac{2}{3}\pi) \end{array} Ua=UmcosθUb=Umcos(θ32π)Uc=Umcos(θ+32π)
将其转换为 α − β \alpha-\beta αβ 坐标系,可以算出
U α = U m c o s θ U β = U m s i n θ \begin{array}{l} U_{\alpha} = U_{m}cos\theta \\ U_{\beta} = U_{m}sin\theta \end{array} Uα=UmcosθUβ=Umsinθ
从这个式子发现,可以从中算出角度信息从而可以判断在哪个扇区
θ = a r c t a n ( U β U α ) \theta = arctan(\frac{U_{\beta}}{U_{\alpha}}) θ=arctan(UαUβ)
由于除法和反三角函数对于MCU来说计算量比较大。我们来找一个简便算法。

U α U_{\alpha} Uα 是关于cos的三角函数, U β U_{\beta} Uβ 是关于sin的三角函数,可以得到:
扇区 1 : U α > 0 , U β > 0 扇区 2 : U α > o r < 0 , U β > 0 扇区 3 : U α < 0 , U β > 0 扇区 4 : U α < 0 , U β < 0 扇区 5 : U α > o r < 0 , U β < 0 扇区 6 : U α > 0 , U β < 0 \begin{array}{l} 扇区1:& U_{\alpha} > 0&,& U_{\beta} > 0\\ 扇区2:& U_{\alpha} >or< 0&,& U_{\beta} > 0\\ 扇区3:& U_{\alpha} < 0&,& U_{\beta} > 0\\ 扇区4:& U_{\alpha} < 0&,& U_{\beta} < 0\\ 扇区5:& U_{\alpha} >or< 0&,& U_{\beta} < 0\\ 扇区6:& U_{\alpha} > 0&,& U_{\beta} < 0 \end{array} 扇区1:扇区2:扇区3:扇区4:扇区5:扇区6:Uα>0Uα>or<0Uα<0Uα<0Uα>or<0Uα>0,,,,,,Uβ>0Uβ>0Uβ>0Uβ<0Uβ<0Uβ<0
可以看到,通过 U β U_{\beta} Uβ 的正负可以判断出是1/2/3扇区还是4/5/6扇区。

这个条件只将扇区分为两个部分,我们还需要几个条件来更细致地分。将每个扇区的反三角函数范围计算出来:
扇区 1 : t a n 0 ∘ > U β U α > t a n 6 0 ∘ ⇒ 0 > U β U α > 3 扇区 2 : t a n 6 0 ∘ > U β U α > t a n 12 0 ∘ ⇒ 3 > U β U α > − 3 扇区 3 : t a n 12 0 ∘ > U β U α > t a n 18 0 ∘ ⇒ − 3 > U β U α > 0 扇区 4 : t a n 18 0 ∘ > U β U α > t a n 24 0 ∘ ⇒ 0 > U β U α > 3 扇区 5 : t a n 24 0 ∘ > U β U α > t a n 30 0 ∘ ⇒ 3 > U β U α > − 3 扇区 6 : t a n 30 0 ∘ > U β U α > t a n 36 0 ∘ ⇒ − 3 > U β U α > 0 \begin{aligned} 扇区1:& tan0^{\circ} > \frac{U_{\beta}}{U_{\alpha}} > tan60^{\circ} &\Rightarrow& 0 &>& \frac{U_{\beta}}{U_{\alpha}} >& \sqrt{3} \\ 扇区2:& tan60^{\circ} > \frac{U_{\beta}}{U_{\alpha}} > tan120^{\circ} &\Rightarrow& \sqrt{3} &>& \frac{U_{\beta}}{U_{\alpha}} >& -\sqrt{3} \\ 扇区3:& tan120^{\circ} > \frac{U_{\beta}}{U_{\alpha}} > tan180^{\circ} &\Rightarrow& -\sqrt{3} &>& \frac{U_{\beta}}{U_{\alpha}} >& 0 \\ 扇区4:& tan180^{\circ} > \frac{U_{\beta}}{U_{\alpha}} > tan240^{\circ} &\Rightarrow& 0 &>& \frac{U_{\beta}}{U_{\alpha}} >& \sqrt{3} \\ 扇区5:& tan240^{\circ} > \frac{U_{\beta}}{U_{\alpha}} > tan300^{\circ} &\Rightarrow& \sqrt{3} &>& \frac{U_{\beta}}{U_{\alpha}} >& -\sqrt{3} \\ 扇区6:& tan300^{\circ} > \frac{U_{\beta}}{U_{\alpha}} > tan360^{\circ} &\Rightarrow& -\sqrt{3} &>& \frac{U_{\beta}}{U_{\alpha}} >& 0 \end{aligned} 扇区1:扇区2:扇区3:扇区4:扇区5:扇区6:tan0>UαUβ>tan60tan60>UαUβ>tan120tan120>UαUβ>tan180tan180>UαUβ>tan240tan240>UαUβ>tan300tan300>UαUβ>tan36003 3 03 3 >>>>>>UαUβ>UαUβ>UαUβ>UαUβ>UαUβ>UαUβ>3 3 03 3 0
观察这个结论, U β U_{\beta} Uβ 3 U α \sqrt{3}U_{\alpha} 3 Uα 似乎有关系,回顾反Clark变换, U b U_{b} Ub U c U_{c} Uc 的式子就是这种关系。所以可以把上面的结论往反Clark变换上凑。看一下反Clark变换的图像,注意我们需要的关系里的 3 \sqrt{3} 3 是乘在 U α U_{\alpha} Uα 上的,所以我们把 U β U_{\beta} Uβ U α U_{\alpha} Uα 反一下,对应的公式为:
{ U a = U β U b = − 1 2 U β + 3 2 U α U c = − 1 2 U β − 3 2 U α \left\{\begin{array}{l} U_{a} = U_{\beta} \\ U_{b} = -\frac{1}{2}U_{\beta} + \frac{\sqrt3}{2}U_{\alpha}\\ U_{c} = -\frac{1}{2}U_{\beta} - \frac{\sqrt3}{2}U_{\alpha} \end{array}\right. Ua=UβUb=21Uβ+23 UαUc=21Uβ23 Uα

生成上述公式的图像,其中黄色的线为 U a U_{a} Ua U β U_{\beta} Uβ ,蓝色的线 U b U_{b} Ub 3 2 U α − 1 2 U β \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} 23 Uα21Uβ ,红色的线 U c U_{c} Uc − 3 2 U α − 1 2 U β -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} 23 Uα21Uβ

image-20220330145027064

可以看到在每个扇区内总有一向大于0,两向小于0,所以 U b U_{b} Ub U c U_{c} Uc 的正负可以当做判断条件之一。我们顺便还又一次得到了 U β U_{\beta} Uβ 这个判断条件。整理一下上面的式子
扇区 1 : U β > 0 , 3 2 U α − 1 2 U β > 0 , − 3 2 U α − 1 2 U β < 0 扇区 2 : U β > 0 , 3 2 U α − 1 2 U β < 0 , − 3 2 U α − 1 2 U β < 0 扇区 3 : U β > 0 , 3 2 U α − 1 2 U β < 0 , − 3 2 U α − 1 2 U β > 0 扇区 4 : U β < 0 , 3 2 U α − 1 2 U β < 0 , − 3 2 U α − 1 2 U β > 0 扇区 5 : U β < 0 , 3 2 U α − 1 2 U β > 0 , − 3 2 U α − 1 2 U β > 0 扇区 6 : U β < 0 , 3 2 U α − 1 2 U β > 0 , − 3 2 U α − 1 2 U β < 0 \begin{aligned} 扇区1:U_{\beta} > 0 , \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} >0 , -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} < 0\\ 扇区2:U_{\beta} > 0 , \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} <0 , -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} < 0\\ 扇区3:U_{\beta} > 0 , \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} <0 , -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} > 0\\ 扇区4:U_{\beta} < 0 , \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} <0 , -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} > 0\\ 扇区5:U_{\beta} < 0 , \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} >0 , -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} > 0\\ 扇区6:U_{\beta} < 0 , \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} >0 , -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} < 0 \end{aligned} 扇区1:Uβ>0,23 Uα21Uβ>0,23 Uα21Uβ<0扇区2:Uβ>0,23 Uα21Uβ<0,23 Uα21Uβ<0扇区3:Uβ>0,23 Uα21Uβ<0,23 Uα21Uβ>0扇区4:Uβ<0,23 Uα21Uβ<0,23 Uα21Uβ>0扇区5:Uβ<0,23 Uα21Uβ>0,23 Uα21Uβ>0扇区6:Uβ<0,23 Uα21Uβ>0,23 Uα21Uβ<0
所以通过计算 3 2 U α − 1 2 U β \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} 23 Uα21Uβ − 3 2 U α − 1 2 U β -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} 23 Uα21Uβ 的正负可以判断出是1/6扇区,3/4扇区,2扇区,5扇区的哪一组。

综上,我们的判断条件有: U β U_{\beta} Uβ 3 2 U α − 1 2 U β \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} 23 Uα21Uβ − 3 2 U α − 1 2 U β -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} 23 Uα21Uβ 。我们分别定义:
U a = U β U b = 3 2 U α − 1 2 U β U c = − 3 2 U α − 1 2 U β \begin{array}{l} U_a = U_{\beta} \\ U_b = \frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta}\\ U_c = -\frac{\sqrt3}{2}U_{\alpha} - \frac{1}{2}U_{\beta} \end{array} Ua=UβUb=23 Uα21UβUc=23 Uα21Uβ
综合这三个条件就可以判断是在哪个扇区 。那么有没有一种算法可以将这一堆判断数值化并转换成1~6的数字呢?可以用下面的公式:
N = A + 2 B + 4 C N=A+2B+4C N=A+2B+4C
式中A代表 U a U_a Ua 的正负,B代表 U b U_b Ub 的正负,C代表 U c U_c Uc 的正负,大于0为1,小于0为0。最后转换出来的的N即为1~6的数字:
扇区 1 2 3 4 5 6 N 3 1 5 4 6 2 \begin{array}{c} 扇区 & 1 & 2 & 3 & 4 & 5 & 6 & \\ N & 3 & 1 & 5 & 4 & 6 & 2 & \end{array} 扇区N132135445662
至此,我们成功完成了扇区判断。

计算相邻矢量作用时长

控制相邻矢量作用时长就可以控制转子到达任意方向,下面进行分析。

六个矢量的大小

六个MOS管可以产生8种状态

image-20220330152650462

设上开下合为0(电流从O往对应的向流),上合下开为1(电流从对应的向往O流),表示其中的六个矢量。

image-20220330152634407

放在一张图中即为:

image-20220330152741018

还有两个零矢量(000和111),无电流,不产生磁场。

对于100的状态,可以等效为下面的电路图:

image-20220330154344462

可以计算出电机中三个相电压(每相相对于电机中间连接点的电压)
U A N = U A − U N = 2 3 U d c U B N = U B − U N = − 1 3 U d c U C N = U C − U N = − 1 3 U d c \begin{aligned} U_{AN} &=U_{A}-U_{N}=\frac{2}{3} U_{d c} \\ U_{BN} &=U_{B}-U_{N}=-\frac{1}{3} U_{d c} \\ U_{CN} &=U_{C}-U_{N}=-\frac{1}{3} U_{d c} \end{aligned} UANUBNUCN=UAUN=32Udc=UBUN=31Udc=UCUN=31Udc
同理可以计算其他所有方向矢量的相电压,可以看出,六个矢量的大小均为 2 3 U d c \frac{2}{3} U_{d c} 32Udc ,即SVPWM相电压幅值为 2 3 U d c \frac{2}{3} U_{d c} 32Udc

电压利用率

电压利用率等于合成矢量的电压除以母线电压。下面在复平面计算合成矢量的电压 U o u t U_{out} Uout
U o u t = U a + U b ⋅ e j ⋅ 2 3 π + U c ⋅ e j ⋅ ( − 2 3 π ) U_{out} = U_a +U_{b}\cdot e^{j\cdot \frac{2}{3}\pi}+U_{c}\cdot e^{j\cdot (-\frac{2}{3}\pi)} Uout=Ua+Ubej32π+Ucej(32π)
根据欧拉公式可以推导出:
e j x = c o s x + j s i n x e^{jx}=cosx+jsinx ejx=cosx+jsinx
又因为三相电压与相电压幅值之间的关系:
U a = U m c o s θ U b = U m c o s ( θ − 2 3 π ) U c = U m c o s ( θ + 2 3 π ) \begin{array}{l} U_a = U_{m}cos\theta \\ U_b = U_{m}cos(\theta-\frac{2}{3}\pi) \\ U_c = U_{m}cos(\theta+\frac{2}{3}\pi) \end{array} Ua=UmcosθUb=Umcos(θ32π)Uc=Umcos(θ+32π)
带入可以计算出 U o u t U_{out} Uout
U o u t = 3 2 U m ⋅ e j θ U_{out}=\frac{3}{2}U_m\cdot e^{j\theta} Uout=23Umejθ
合成矢量的电压是相电压幅值的 3 2 \frac{3}{2} 23 倍,而SVPWM相电压幅值 U m U_m Um 2 3 U d c \frac{2}{3} U_{d c} 32Udc ,所以
U o u t = U d c U_{out}=U_{dc} Uout=Udc
合成矢量的电压等于母线电压。所以SVPWM的电压利用率是100%

SVPWM输出电压是马鞍波

由于中间连接点N的点位 是浮动的,为三角波,而相电压是每相相对于电机中间连接点N的电压,所以相电压不是一个正弦波,而是一个正弦波与一个三角波叠加而成的,即为马鞍波。网图:

d94c427b1d664ffe9b585d58e60482f6
矢量作用时长

合成矢量的电压是所在扇区两个矢量与空矢量不同时长的组合,其中 T N T_N TN 为空矢量作用时长:
U o u t = U x T x T s + U y T y T s + U N T N T s U_{out}=U_x\frac{T_x}{T_s}+U_y\frac{T_y}{T_s}+U_N\frac{T_N}{T_s} Uout=UxTsTx+UyTsTy+UNTsTN
由于SVPWM的输入是 U α U_{\alpha} Uα U β U_{\beta} Uβ ,但是要控制 T x T_x Tx T y T_y Ty ,所以要找到他们的对应关系。

对于第一个扇区,将 U o u t U_{out} Uout α − β \alpha-\beta αβ 坐标系中表示:
U α = ∣ U x ∣ T x T s + ∣ U y ∣ T y T s c o s 6 0 ∘ U β = ∣ U y ∣ T y T s s i n 6 0 ∘ \begin{array}{l} U_\alpha=|U_x|\frac{T_x}{T_s}+|U_y|\frac{T_y}{T_s}cos60^{\circ}\\ U_\beta=|U_y|\frac{T_y}{T_s}sin60^{\circ} \end{array} Uα=UxTsTx+UyTsTycos60Uβ=UyTsTysin60
其中 ∣ U x ∣ |U_x| Ux ∣ U y ∣ |U_y| Uy 根据前面的计算均为 2 3 U d c \frac{2}{3} U_{d c} 32Udc ,可以解出:
T x = 3 T S U d c ( 3 2 U α − 1 2 U β ) T y = 3 T S U d c U β \begin{array}{l} T_x=\frac{\sqrt{3}T_S}{U_{dc}}(\frac{\sqrt{3}}{2}U_\alpha-\frac{1}{2}U_\beta)\\ T_y=\frac{\sqrt{3}T_S}{U_{dc}}U_\beta \end{array} Tx=Udc3 TS(23 Uα21Uβ)Ty=Udc3 TSUβ
同理,可以计算出所有六个扇区:

第二扇区
T x = 3 T S U d c ( − 3 2 U α + 1 2 U β ) T y = 3 T S U d c ( 3 2 U α + 1 2 U β ) \begin{array}{l} T_x=\frac{\sqrt{3}T_S}{U_{dc}}(-\frac{\sqrt{3}}{2}U_\alpha+\frac{1}{2}U_\beta)\\ T_y=\frac{\sqrt{3}T_S}{U_{dc}}(\frac{\sqrt{3}}{2}U_\alpha+\frac{1}{2}U_\beta) \end{array} Tx=Udc3 TS(23 Uα+21Uβ)Ty=Udc3 TS(23 Uα+21Uβ)
第三扇区
T x = 3 T S U d c U β T y = 3 T S U d c ( − 3 2 U α − 1 2 U β ) \begin{array}{l} T_x=\frac{\sqrt{3}T_S}{U_{dc}}U_\beta\\ T_y=\frac{\sqrt{3}T_S}{U_{dc}}(-\frac{\sqrt{3}}{2}U_\alpha-\frac{1}{2}U_\beta) \end{array} Tx=Udc3 TSUβTy=Udc3 TS(23 Uα21Uβ)
第四扇区
T x = 3 T S U d c ( − U β ) T y = 3 T S U d c ( − 3 2 U α + 1 2 U β ) \begin{array}{l} T_x=\frac{\sqrt{3}T_S}{U_{dc}}(-U_\beta)\\ T_y=\frac{\sqrt{3}T_S}{U_{dc}}(-\frac{\sqrt{3}}{2}U_\alpha+\frac{1}{2}U_\beta) \end{array} Tx=Udc3 TS(Uβ)Ty=Udc3 TS(23 Uα+21Uβ)
第五扇区
T x = 3 T S U d c ( − 3 2 U α − 1 2 U β ) T y = 3 T S U d c ( 3 2 U α − 1 2 U β ) \begin{array}{l} T_x=\frac{\sqrt{3}T_S}{U_{dc}}(-\frac{\sqrt{3}}{2}U_\alpha-\frac{1}{2}U_\beta)\\ T_y=\frac{\sqrt{3}T_S}{U_{dc}}(\frac{\sqrt{3}}{2}U_\alpha-\frac{1}{2}U_\beta) \end{array} Tx=Udc3 TS(23 Uα21Uβ)Ty=Udc3 TS(23 Uα21Uβ)
第六扇区
T x = 3 T S U d c ( 3 2 U α + 1 2 U β ) T y = 3 T S U d c ( − U β ) \begin{array}{l} T_x=\frac{\sqrt{3}T_S}{U_{dc}}(\frac{\sqrt{3}}{2}U_\alpha+\frac{1}{2}U_\beta)\\ T_y=\frac{\sqrt{3}T_S}{U_{dc}}(-U_\beta) \end{array} Tx=Udc3 TS(23 Uα+21Uβ)Ty=Udc3 TS(Uβ)
六个扇区中都有相同的项,其中包含前文判断扇区所用的 U 1 U_1 U1 U 2 U_2 U2 U 3 U_3 U3 。直接把前面已经计算过的变量拿过来使用,大大减少了计算量。式中的 3 T S U d c \frac{\sqrt{3}T_S}{U_{dc}} Udc3 TS 为调制比,定义:
U m r = 3 T S U d c X = 3 T S U d c U β = U m r U 1 Y = 3 T S U d c ( 3 2 U α − 1 2 U β ) = U m r U 2 Z = 3 T S U d c ( − 3 2 U α − 1 2 U β ) = U m r U 3 \begin{array}{l} U_{mr} = \frac{\sqrt{3}T_S}{U_{dc}} \\ X= \frac{\sqrt{3}T_S}{U_{dc}}U_\beta=U_{mr}U_1\\ Y= \frac{\sqrt{3}T_S}{U_{dc}}(\frac{\sqrt{3}}{2}U_\alpha-\frac{1}{2}U_\beta)=U_{mr}U_2\\ Z= \frac{\sqrt{3}T_S}{U_{dc}}(-\frac{\sqrt{3}}{2}U_\alpha-\frac{1}{2}U_\beta)=U_{mr}U_3 \end{array} Umr=Udc3 TSX=Udc3 TSUβ=UmrU1Y=Udc3 TS(23 Uα21Uβ)=UmrU2Z=Udc3 TS(23 Uα21Uβ)=UmrU3
可以将六个扇区表示为:
T x T y 扇区 1 Y X 扇区 2 − Y − Z 扇区 3 X Z 扇区 4 − X − Y 扇区 5 Z Y 扇区 6 − Z − X \begin{array}{c} & T_x & T_y \\ 扇区1& Y & X \\ 扇区2& -Y & -Z \\ 扇区3& X & Z \\ 扇区4& -X & -Y \\ 扇区5& Z & Y \\ 扇区6& -Z & -X \\ \end{array} 扇区1扇区2扇区3扇区4扇区5扇区6TxYYXXZZTyXZZYYX

注意:当非零矢量作用时间 T x + T y > T s Tx+Ty>Ts Tx+Ty>Ts ,需要进行过饱和处理:
{ T x = T x T x + T y T s T y = T y T x + T y T s \left\{\begin{array}{l} T_{x}=\frac{T_{x}}{T_{x}+T_{y}} T_{s} \\ T_{y}=\frac{T_{y}}{T_{x}+T_{y}} T_{s} \end{array}\right. {Tx=Tx+TyTxTsTy=Tx+TyTyTs

定时器比较值计算

我们前文算出来的 T x T_x Tx T y T_y Ty 以秒为单位,在单片机中使用定时器控制MOS管的通断需要配置比较值,所以需要把 T x T_x Tx T y T_y Ty 转换为三个互补的定时器比较值 T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3

定时器应设置为中心对齐模式,若为向上计数,计数器会从0开始计数到最大值,再反向从最大值计数到0;向下计数反之。故只需要控制前半个周期的比较值就可以产生相对中心对称的PWM波。

CB0D861C81399F86BFB03E925F9AF8AC

为了减少MOS管的开关损耗,提高其使用寿命,应尽量减少MOS管的开关次数。在一个扇区内切换状态的时候,合理使用零矢量可以保证每次切换只改变一个MOS管。

先来看第一扇区,以每次只改变一个MOS管为原则,则切换顺序为:
000 → 100 → 110 → 111 → 110 → 100 → 000 000 \to 100 \to 110 \to 111 \to 110 \to 100 \to 000 000100110111110100000
可以看到,切换顺序构成了一个环路。在一个周期内我们需要控制三段作用时长:
T s = T x + T y + T N T_s=T_x+T_y+T_N Ts=Tx+Ty+TN
六个MOS需要产生六路PWM来控制他们的状态。由于上下半桥是互补的,所以只需要生成三个PWM:

image-20220331151522966

由于是中心对齐模式,所以只需要控制半个周期的时长 T x 2 \frac{T_x}{2} 2Tx T y 2 \frac{T_y}{2} 2Ty 。在半个周期内 T N T_N TN 出现了两次,分别为000和111,在半个周期内将这两段时间平均分配。即为 T S − T x − T y 4 \frac{T_S-T_x-T_y}{4} 4TSTxTy

这样就可以计算三个定时器的比较值 T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3
T 1 = T S − T x − T y 4 T 2 = T 1 + T x 2 T 3 = T 2 + T y 2 \begin{array}{l} T_1= \frac{T_S-T_x-T_y}{4}\\ T_2=T_1+\frac{T_x}{2}\\ T_3=T_2+\frac{T_y}{2} \end{array} T1=4TSTxTyT2=T1+2TxT3=T2+2Ty
同理,可以计算出全部六个扇区的切换顺序,这里计算过程不再赘述。由图像和计算结果可以分析出,无论在哪个扇区中,三个定时器切换的图像都是由上图中三个方波构成,三个图像排列组合也正好就是六个扇区的组合方式。故为了方便程序运行,将六个扇区的定时器比较值归纳如下:


T a = T S − T x − T y 4 T b = T a + T x 2 T c = T b + T y 2 \begin{array}{l} T_a= \frac{T_S-T_x-T_y}{4}\\ T_b=T_a+\frac{T_x}{2}\\ T_c=T_b+\frac{T_y}{2} \end{array} Ta=4TSTxTyTb=Ta+2TxTc=Tb+2Ty
此时六个扇区可以表示为:
扇区 1 扇区 2 扇区 3 扇区 4 扇区 5 扇区 6 T 1 T a T b T c T c T b T a T 2 T b T a T a T b T c T c T 3 T c T c T b T a T a T b \begin{array}{c} & 扇区1 & 扇区2 & 扇区3 & 扇区4 & 扇区5 & 扇区6 & \\ T1& T_a & T_b & T_c & T_c & T_b & T_a &\\ T2& T_b & T_a & T_a & T_b & T_c & T_c &\\ T3& T_c & T_c & T_b & T_a & T_a & T_b & \end{array} T1T2T3扇区1TaTbTc扇区2TbTaTc扇区3TcTaTb扇区4TcTbTa扇区5TbTcTa扇区6TaTcTb
也就是说编程时只需要计算 T a T_a Ta T b T_b Tb T c T_c Tc ,通过判断就可以得到对应扇区的比较值。

至此,SVPWM输出比较值 T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3 ,互补得到六个比较值,输入到定时器,输出三路PWM。

MATLAB仿真

假设需要产生10Khz的PWM波,则一个周期为0.0001秒。若单片机主频为180Mhz,预分频系数为100-1,由下面计算公式:(其中 A R R ARR ARR 是计数值, P S C PSC PSC 是预分频值)
F p w m ( H z ) = 主频 ( M ) ( A R R + 1 ) ∗ ( P S C + 1 ) Fpwm(Hz) = \frac{主频(M)}{(ARR+1)*(PSC+1)} Fpwm(Hz)=(ARR+1)(PSC+1)主频(M)
180,000,000/(18,000*100)=10,000Hz,则定时器的计数值应设置为18000-1。

在模型中设定 U d c Udc Udc 为24, T p w m Tpwm Tpwm 为18000。

image-20220331163919487

在foc子模块中,将park反变换的输出输入到SVPWM模块:

image-20220331163836635

SVPWM模块代码为:

function [T1,T2,T3,sector] = fcn(Ualpha,Ubeta,Udc,Tpwm)

% 初始化
sector = single(0);
T1 = single(0);
T2 = single(0);
T3 = single(0);

% 第一步:扇区判断
% 计算三个临时变量
Ua = Ubeta;
Ub = (sqrt(3)*Ualpha - Ubeta)/2;
Uc = (-sqrt(3)*Ualpha - Ubeta)/2;
% 计算判断扇区所用的ABC的值
A=single(0);B=single(0);C=single(0);N=single(0);
if(Ua>0)
    A = single(1);
elseif(Ua<0)
    A = single(0);
end
if(Ub>0)
    B = single(1);
elseif(Ub<0)
    B = single(0);
end
if(Uc>0)
    C = single(1);
elseif(Uc<0)
    C = single(0);
end
% 计算判断扇区所用的N的值
N = A + 2*B + 4*C;
% 扇区判断
switch (N)   
    case 3
        sector = single(1);
    case 1
        sector = single(2);
    case 5
        sector = single(3);
    case 4
        sector = single(4);
    case 6
        sector = single(5);
    case 2
        sector = single(6);
end

% 第二步:计算相邻矢量作用时长
% 计算调制比
Umr = sqrt(3)*Tpwm/Udc;
% 计算三个临时变量
X = Umr * Ua;
Y = Umr * Ub;
Z = Umr * Uc;
% 分扇区计算Tx和Ty的值
Tx=single(0);Ty=single(0);
switch (sector)
    case 1
        Tx = Y; Ty = X;
    case 2
        Tx = -Y; Ty = -Z;
    case 3
        Tx = X; Ty = Z;
    case 4
        Tx = -X; Ty = -Y;
    case 5
        Tx = Z; Ty = Y;
    case 6
        Tx = -Z; Ty = -X;
end

% 第三步:定时器比较值计算
% 干啥用的?
if Tx+Ty > Tpwm
    Tx = Tx/(Tx+Ty);
    Ty = Ty/(Tx+Ty);
else
    Tx = Tx;
    Ty = Ty;
end
% 计算三个临时变量
Ta = (Tpwm-Tx-Ty)/4.0;
Tb = Ta+Tx/2.0;
Tc = Tb+Ty/2.0;
% 分扇区计算定时器比较值T1、T2和T3的值
switch (sector)
    case 1
        T1 = Ta; T2 = Tb; T3 = Tc;
    case 2
        T1 = Tb; T2 = Ta; T3 = Tc;
    case 3
        T1 = Tc; T2 = Ta; T3 = Tb;
    case 4
        T1 = Tc; T2 = Tb; T3 = Ta;
    case 5
        T1 = Tb; T2 = Tc; T3 = Ta;
    case 6
        T1 = Ta; T2 = Tc; T3 = Tb;
end

end

可以看到,定时器比较值为马鞍波

image-20220331165323898

扇区为从1到6的循环

image-20220331165348883
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范子琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值