七段式 SVPWM 关键公式

  • 前言
  • SVPWM生成流程
  • 判断扇区
  • 计算占空比
    • 计算每个扇区中基本矢量的持续时间
    • 计算三路占空比

前言

有关原理部分请参照 SVPWM算法原理及详解 和 SVPWM的原理及法则推导和控制算法详解(他们的公式慎用,有些有坑,看原理就行了)。本文主要讲解七段式SVPWM的实现方法以及关键公式推导与其结果。本算法经过了Simulink仿真以及STM32F407ZGT6、STM32F334C8T6、STM32F334R8T6等途径验证。如果你不想了解原理,也可以跳过这些,直接看这篇文章 SVPWM的Simulink实现。

SVPWM生成流程

Created with Raphaël 2.3.0 开关周期开始 得到Uref与角度θ 判断扇区 计算三路PWM的占空比 开关周期结束

其中 Uref 是期望电压矢量的模,角度 θ \theta θ是它与 α \alpha α轴的夹角。且
U r e f = m U d c 3 U_{ref} = \frac{mU_{dc}}{\sqrt{3}} Uref​=3 ​mUdc​​
其中m是调制系数,当 m > 1 m>1 m>1时会过调制,波形失真。此时 Uref 超出了图1中正六边形的内切圆范围。而Uref的最大值就是非零电压矢量的值,为 2 U d c 3 \dfrac{2U_{dc}}{3} 32Udc​​。

图1

由于三项电压互差 12 0 ∘ 120^\circ 120∘,以其中一项为例,它的相电压调制函数和线电压调制函数(也就是SVPWM滤过波之后的)分别是:
U a ( θ ) = { 3 2 U r e f cos ⁡ ( θ − π 6 ) , 0 ≤ θ < π 3 , π ≤ θ < 4 π 3 3 2 U r e f cos ⁡ ( θ ) , π 3 ≤ θ < 2 π 3 , 4 π 3 ≤ θ < 5 π 3 3 2 U r e f cos ⁡ ( θ + π 6 ) , 2 π 3 ≤ θ < π , 5 π 3 ≤ θ < 2 π U_{a}(\theta)=\begin{cases}\dfrac{\sqrt{3}}{2}U_{ref}\cos(\theta-\dfrac{\pi}{6}),& 0\leq\theta<\dfrac{\pi}{3},\pi\leq\theta<\dfrac{4\pi}{3} \cr\cr \dfrac{3}{2}U_{ref}\cos\left(\theta\right),& \dfrac{\pi}{3}\leq\theta<\dfrac{2\pi}{3},\dfrac{4\pi}{3}\leq\theta<\dfrac{5\pi}{3} \cr\cr \dfrac{\sqrt{3}}{2}U_{ref}\cos(\theta+\dfrac{\pi}{6}), &\dfrac{2\pi}{3}\leq\theta<\pi,\dfrac{5\pi}{3}\leq\theta<2\pi\end{cases} Ua​(θ)=⎩ ⎨ ⎧​23 ​​Uref​cos(θ−6π​),23​Uref​cos(θ),23 ​​Uref​cos(θ+6π​),​0≤θ<3π​,π≤θ<34π​3π​≤θ<32π​,34π​≤θ<35π​32π​≤θ<π,35π​≤θ<2π​
U a b ( θ ) = U a ( θ ) − U b ( θ ) = 3 U r e f sin ⁡ ( θ + π 3 ) U_{ab}(\theta)=U_{a}(\theta)-U_{b}(\theta)=\sqrt{3}U_{ref}\sin\left(\theta+\dfrac{\pi}{3}\right) Uab​(θ)=Ua​(θ)−Ub​(θ)=3 ​Uref​sin(θ+3π​)
因此SVPWM逆变器相电压最大幅值为 3 2 × 2 U d c 3 = U d c 3 \frac{\sqrt{3}}{2}\times\frac{2U_{dc}}{3}=\frac{U_{dc}}{\sqrt{3}} 23 ​​×32Udc​​=3 ​Udc​​

从调制波函数来看,相电压输出的是不规则的分段函数,为马鞍波形。而线电压输出的则是正弦波形。

判断扇区

七段式 SVPWM 共有6个非零矢量和2个零矢量,这6个非零矢量将平面分成了6个扇区,如图所示。

图2

首先我们要根据 U α U_\alpha Uα​ 和 U β U_\beta Uβ​ 判断出扇区N。由矢量图几何关系分析,可以判断出合成电压矢量 Uref 落在第 X扇区的充分必要条件,因此得出下表:

扇区 落在此扇区的充要条件
I U α > 0 U_\alpha>0 Uα​>0, U β > 0 U_\beta>0 Uβ​>0 且 U β U α < 3 \dfrac{U_{\beta}}{U_\alpha}<\sqrt{3} Uα​Uβ​​<3 ​
II U β > 0 U_\beta>0 Uβ​>0 且 U β ∣ U α ∣ > 3 \dfrac{U_{\beta}}{\vert U_\alpha\vert}>\sqrt{3} ∣Uα​∣Uβ​​>3 ​
III U α < 0 U_\alpha<0 Uα​<0, U β > 0 U_\beta>0 Uβ​>0 且 − U β U α < 3 \dfrac{-U_{\beta}}{U_\alpha}<\sqrt{3} Uα​−Uβ​​<3 ​
IV U α < 0 U_\alpha<0 Uα​<0, U β < 0 U_\beta<0 Uβ​<0 且 U β U α < 3 \dfrac{U_{\beta}}{U_\alpha}<\sqrt{3} Uα​Uβ​​<3 ​
V U β < 0 U_\beta<0 Uβ​<0 且 − U β ∣ U α ∣ > 3 \dfrac{-U_{\beta}}{\vert U_\alpha\vert}>\sqrt{3} ∣Uα​∣−Uβ​​>3 ​
VI U α > 0 U_\alpha>0 Uα​>0, U β < 0 U_\beta<0 Uβ​<0 且 − U β U α < 3 \dfrac{-U_{\beta}}{U_\alpha}<\sqrt{3} Uα​−Uβ​​<3 ​
进一步观察分析可得扇区N完全由 U β , 3 U α − U β , − 3 U α − U β U_\beta,\sqrt{3}U_\alpha-U_\beta,-\sqrt{3}U_\alpha-U_\beta Uβ​,3 ​Uα​−Uβ​,−3 ​Uα​−Uβ​ 三个式子的正负来决定。因此若定义 { U 1 = U β U 2 = 3 U α − U β U 3 = − 3 U α − U β \begin{cases}U_1=U_\beta \cr U_2=\sqrt{3}U_\alpha-U_\beta \cr U_3=-\sqrt{3}U_\alpha-U_\beta\end{cases} ⎩ ⎨ ⎧​U1​=Uβ​U2​=3 ​Uα​−Uβ​U3​=−3 ​Uα​−Uβ​​
且若 U 1>0, A=1 , 否则 A=0;
U2>0, B=1 , 否则 B=0;
U3>0, C=1 , 否则 C=0;

可以看出 A,B,C 之间共有八种组合,但由判断扇区的公式可知 A,B,C 不会同时为 1 或同时为 0,所以实际的组合是六种,A,B,C 组合取不同的值对 应着不同的扇区,并且是一一对应的,因此完全可以由 A,B,C 的组合判断所在的扇区。为区别六种状态,令 N=4C+2B+A,则可以通过下表计算参考电压矢量 Uref 所在的扇区。

N 1 2 3 4 5 6
扇区 II VI I IV III V

C语言实现:

#define Sqrt3 1.732050808f
void JudgeArea(svpwm_variables * svpwm_v)
{   //看不清楚可以删掉所有代码段中的'svpwm_v->' char A,B,C,T;A = (svpwm_v->Ub)>0? 1:0;B = (Sqrt3*svpwm_v->Ua - svpwm_v->Ub)>0? 1:0;C = (-Sqrt3*svpwm_v->Ua - svpwm_v->Ub)>0? 1:0;T = A + 2*B +4*C;switch (T){case 1: svpwm_v->N=2;break;case 2: svpwm_v->N=6;break;case 3: svpwm_v->N=1;break;case 4: svpwm_v->N=4;break;case 5: svpwm_v->N=3;break;case 6: svpwm_v->N=5;break;default: svpwm_v->N=1;break;}
}

计算占空比

计算每个扇区中基本矢量的持续时间

传统计算使用到了角度以及三角函数,较为繁琐,实际上利用 U α , U β U_\alpha,U_\beta Uα​,Uβ​ 就可以得出结论。以扇区III为例,求解方程组后得出各矢量持续时间为 T 2 = T K 3 U β U d c T_2 = T_K\dfrac{\sqrt{3}U_{\beta}}{U_{dc}} T2​=TK​Udc​3 ​Uβ​​ T 3 = − T K 3 U α + 3 U β 2 U d c T_3 = -T_K\dfrac{3U_{\alpha}+\sqrt{3}U_{\beta}}{2U_{dc}} T3​=−TK​2Udc​3Uα​+3 ​Uβ​​ T 0 = T 7 = T K − T 2 − T 3 2 T_0 = T_7=\dfrac{T_K-T_2-T_3}{2} T0​=T7​=2TK​−T2​−T3​​

其中TK是开关周期。若计算出所有扇区的基矢持续时间发现如此可简化运算,定义
{ X = 3 U β Y = 3 U α + 3 U β 2 Z = − 3 U α + 3 U β 2 \begin{cases}X=\sqrt{3}U_{\beta}\cr Y=\dfrac{3U_{\alpha}+\sqrt{3}U_{\beta}}{2}\cr Z=\dfrac{-3U_{\alpha}+\sqrt{3}U_{\beta}}{2}\end{cases} ⎩ ⎨ ⎧​X=3 ​Uβ​Y=23Uα​+3 ​Uβ​​Z=2−3Uα​+3 ​Uβ​​​
再定义TX是主矢量,TY是辅矢量(如I扇区中TX=T4,TY=T6;III扇区中TX=T2,TY=T3)。则可根据扇区N来简化计算:

扇区 I II III IV V VI
TX -Z Y X Z -Y -X
TY X Z -Y -X -Z Y
C语言实现:
//已经定义过Sqrt3了
void CacuTime(svpwm_variables * svpwm_v)
{float x,y,z;float Dx,Dy,Dz;//Tz是零矢量持续时间比//你看我x y z的表达式里边已经把开关周期除了,实际上这是持续时间占开关周期的比例x = Sqrt3*svpwm_v->Ub;y = (3*svpwm_v->Ua +Sqrt3*svpwm_v->Ub)/2;z = (-3*svpwm_v->Ua +Sqrt3*svpwm_v->Ub)/2;switch(svpwm_v->N){case 1: Dx = -z;Dy = x;break;case 2: Dx = y;Dy = z;break;case 3: Dx = x;Dy = -y;break;case 4: Dx = z;Dy = -x;break;case 5: Dx = -y;Dy = -z;break;case 6: Dx = -x;Dy = y;break;default:Dx = -z;Dy = x;break;}Dz = 1-(Dx+Dy);
}

计算三路占空比

为了尽量减少开关次数,这里的PWM的定时器模式使用了中心对称模式(有疑问可看这里边沿对齐PWM和中心对齐PWM)在这里我以扇区I、II、III为例说明三路PWM的占空比与扇区N计算规律。

由于占空比是比例这里我把TX、TY、TZ同除以TK,分别记为DX、DY、DZ可总结出规律如下:

扇区N I II III IV V VI
DutyA Dx+Dy+Dz/2 Dx+Dz/2 Dz/2 Dz/2 Dy+Dz/2 Dx+Dy+Dz/2
DutyB Dy+Dz/2 Dx+Dy+Dz/2 Dx+Dy+Dz/2 Dx+Dz/2 Dz/2 Dz/2
DutyC Dz/2 Dz/2 Dy+Dz/2 Dx+Dy+Dz/2 Dx+Dy+Dz/2 Dx+Dz/2

C语言实现:

void CacuPWMDuty(svpwm_variables * svpwm_v)
{//Dx Dy Dz 已经由上一个函数计算得出switch(svpwm_v->N){case 1: svpwm_v->DutyA = Dx+Dy+Dz/2;svpwm_v->DutyB = Dy+Dz/2;svpwm_v->DutyC = Dz/2;break;case 2: svpwm_v->DutyA = Dx+Dz/2;svpwm_v->DutyB = Dx+Dy+Dz/2;svpwm_v->DutyC = Dz/2;break;case 3:svpwm_v->DutyA = Dz/2;svpwm_v->DutyB = Dx+Dy+Dz/2;svpwm_v->DutyC = Dy+Dz/2;break;case 4: svpwm_v->DutyA = Dz/2;svpwm_v->DutyB = Dx+Dz/2;svpwm_v->DutyC = Dx+Dy+Dz/2;break;case 5:svpwm_v->DutyA = Dy+Dz/2;svpwm_v->DutyB = Dz/2;svpwm_v->DutyC = Dx +Dy +Dz/2;break;case 6:svpwm_v->DutyA = Dx+Dy+Dz/2;svpwm_v->DutyB = Dz/2;svpwm_v->DutyC = Dx+Dz/2;break;default:svpwm_v->DutyA = Dx+Dy+Dz/2;svpwm_v->DutyB = Dy+Dz/2;svpwm_v->DutyC=Dz/2;break;}
}

其实到这就差不多了,实际操作生成SVPWM时还需要在每个开关周期的中断重新调用这几个函数。暂时想不到还有什么,想到了再补充。
其他文章地址
三项逆变闭环控制软件部分项目文件

【SVPWM】SVPWM算法推导及其Simulink仿真(一)相关推荐

  1. 智能驾驶ADAS算法设计及Prescan仿真(1): 前向碰撞预警FCW算法设计与simulink仿真

    前言: 本系列文章将对智能驾驶ADAS算法进行完整的介绍,并在simulink中搭建算法模型,并在Prescan中搭建场景并且与simulink联合仿真对ADAS算法进行验证.智能驾驶ADAS算法详解 ...

  2. 绕线机算法模型(Simulink仿真验证+PLC代码实现)

    绕线机应用的详细内容大家可以参看下面这篇博客,这里不再赘述.本文主要借助Simulink仿真分析和解决工程实际问题.希望对大家学习Simulink有所帮助.限于水平和能力所限,文中难免出现错误和不足之 ...

  3. 二相混合式步进电机闭环矢量控制simulink仿真(含仿真文件)

    目录 在位置跟踪伺服系统中二相混合式步进电机闭环矢量控制simulink仿真 闭环矢量控制系统simulink图​ 闭环矢量控制系统系统结构框图 二相混合式步进电机的数学模型 矩角特性 电压方程 机械 ...

  4. PMSM FOC控制 Matlab/Simulink仿真 SVPWM算法

    1.原理 SVPWM是电机控制的一种算法,空间电压矢量控制:可以直接使用SVPWM进行电机控制,SVPWM是基于电压控制,只是控制效果没有FOC(基于电流控制)的效果好:而foc控制要借助于SVPWM ...

  5. SVPWM控制技术+Matlab/Simulink仿真详解

    文章目录 前言 一.SVPWM的控制原理 二.空间矢量的概念 三.电压与磁链空间矢量的关系 四.三相逆变器的基本电压空间矢量 五.SVPWM 算法的合成原理 六.SVPWM 算法推导 6.1.七段式S ...

  6. (二)永磁同步电机矢量控制(三电平)——三电平传统SVPWM调制算法原理

      各位同学你们好呀,上期我们讲了中性点钳位型的三电平逆变器原理,相信大家都有印象了.那么这一期我们要详解三电平传统SVPWM调制算法原理.通过学习后,希望能给初学者提供捷径明白算法原理,将来做仿真研 ...

  7. SVPWM过调制算法实现

    SVPWM过调制算法实现 我们知道SVPWM的在线性调制区的其最大的输出电压为Udc/sqrt(3),采用过调制的方法,可以时输出的基波幅值达到*2Udc/Π*.在永磁同步电机高速运行时,由于电枢反电 ...

  8. 【自适应盲均衡4】基于RLS的多径衰落信道均衡算法(RLS-CMA)的理论推导与MATLAB仿真

    关注公号[逆向通信猿]更精彩!!! 一.回顾CMA和MMA 对于前面两种算法 [自适应均衡]多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 [自适应均衡]多模算法(MMA)--复数改 ...

  9. 【自适应盲均衡3】多模算法(MMA)——复数改进常模算法(MCMA)的理论推导与MATLAB仿真

    关注公号[逆向通信猿]更精彩!!! 接上篇[自适应均衡2]多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 理论推导 MMA或者MCMA其实是在CMA基础上改进而得到的,有学者称其为实 ...

最新文章

  1. 干货丨一文看懂生成对抗网络:从架构到训练技巧
  2. 关于模板页调用js的问题
  3. Fishe向量Fisher Vecotr(二)
  4. SAP系统财务模块的集团公司处理模式
  5. 总结2:上传图片至指定服务器
  6. Android studio下载安装使用遇到的问题及解决办法
  7. 【活动预告】“智能医疗技术应用”线上论坛
  8. java 展现层框架_spring快速入门例子教程:06展现层
  9. ZGrapher 画函数曲线图的工具
  10. 刘宇凡:微博的那些人,那些事
  11. ansible+packer+terraform在aws上布署web服务器
  12. Python输入一个三位数,输出其个位数字、十位数字和百位数字。
  13. c语言星钻图形的输出
  14. 华为云服务器安装win10系统,云服务器安装win10
  15. 计算机网络原理 读书笔记
  16. “RFID射频识别技术”简介
  17. 在java中使用RBL服务器(中国反垃圾邮件联盟的CBL+使用)
  18. Android中应用分包的方法(Apk Splits)
  19. 数据仓库系列:初识数仓
  20. 数据库 schema含义

热门文章

  1. linux如何扫描网络漏洞,在Linux系统上用nmap扫描SSL漏洞的方法
  2. 经纬度和高德地图计算两点距离面积
  3. Unity两点距离计算
  4. 王爽《汇编语言》学习笔记
  5. 用sort对vector排序(转载)
  6. Tiny4412 在linux下的dnw使用
  7. Centos7下安装FastDFS服务
  8. 再也不写个人日记了,再也...
  9. HTML小游戏20 —— html5版开心斗地主小游戏(附完整源码)
  10. 【重点】Selenium + Nightwatch 自动化测试环境搭建