SVPWM数学模型搭建

24 篇文章 5 订阅
23 篇文章 3 订阅

原文PDF文档下载链接:https://download.csdn.net/download/qq_28149763/88687506
FOC算法讲解PDF文档下载地址:https://download.csdn.net/download/qq_28149763/87943594
FOC算法讲解博客地址:https://blog.csdn.net/qq_28149763/article/details/131362497
模型链接:https://download.csdn.net/download/qq_28149763/88687505
基于零序分量注入的SPWM模型请参考欧拉电子的FOC模型。

错误更正:
2024-05-14:
在这里插入图片描述

1、模型总览

在这里插入图片描述

2、电机参数

电机参数:

Rs=0.485
L=0.00395
V_peak L-L/krpm(反电动势常数)=5.21657
Inertia=0.00007
viscous damping(阻尼系数)=0.04924
pole pairs=7
static friction=0

在这里插入图片描述

3、核心模块

3.1 Park反变换

在这里插入图片描述

function [u_alpha,u_beta] = fcn(ud,uq,theta)

u_alpha=ud*cos(theta)-uq*sin(theta);
u_beta=ud*sin(theta)+uq*cos(theta);

3.2 SVPWM模块

方法一:
使用切换时刻处理。

function [Tcm1,Tcm2,Tcm3,sector] = fcn(u_alpha,u_beta,Udc,Ts)
 
 %init
 K=sqrt(3)*Ts/Udc;
 
 %Sector judgment
 u1=u_beta;
 u2=u_alpha*cos(pi/6)-u_beta*cos(pi/3);
 u3=-u_alpha*cos(pi/6)-u_beta*cos(pi/3);
 
 if u1>0
     A=1;
 else
     A=0;
 end
 
 if u2>0
     B=1;
 else
     B=0;
 end
 
 if u3>0
     C=1;
 else
     C=0;
 end
 
 sector = A+2*B+4*C;
 
 switch sector
     case 3
         t4=K*u2;
         t6=K*u1;
         if abs(t4+t6)>Ts
             t4=t4*Ts/(t4+t6);
             t6=t6*Ts/(t4+t6);
         end
         %t7=0.5*(Ts-t4-t6);
         Tcm1=0.25*(Ts-t4-t6);
         Tcm2=0.25*(Ts+t4-t6);
         Tcm3=0.25*(Ts+t4+t6);
      case 1
         t2=-K*u2;
         t6=-K*u3;
         if abs(t2+t6)>Ts
             t2=t2*Ts/(t2+t6);
             t6=t6*Ts/(t2+t6);
         end
         %t7=0.5*(Ts-t2-t6);
         Tcm1=0.25*(Ts+t2-t6);
         Tcm2=0.25*(Ts-t2-t6);
         Tcm3=0.25*(Ts+t2+t6);
      case 5
         t2=K*u1;
         t3=K*u3;
         if abs(t2+t3)>Ts
             t2=t2*Ts/(t2+t3);
             t3=t3*Ts/(t2+t3);
         end
         %t7=0.5*(Ts-t2-t3);
         Tcm1=0.25*(Ts+t2+t3);
         Tcm2=0.25*(Ts-t2-t3);
         Tcm3=0.25*(Ts+t2-t3);
     case 4
         t3=-K*u2;
         t1=-K*u1;
         if abs(t1+t3)>Ts
             t1=t1*Ts/(t1+t3);
             t3=t3*Ts/(t1+t3);
         end
         %t7=0.5*(Ts-t1-t3);
         Tcm1=0.25*(Ts+t1+t3);
         Tcm2=0.25*(Ts+t1-t3);
         Tcm3=0.25*(Ts-t1-t3);
     case 6
         t1=K*u3;
         t5=K*u2;
         if abs(t1+t5)>Ts
             t1=t1*Ts/(t1+t5);
             t5=t5*Ts/(t1+t5);
         end
         %t7=0.5*(Ts-t1-t5);
         Tcm1=0.25*(Ts+t1-t5);
         Tcm2=0.25*(Ts+t1+t5);
         Tcm3=0.25*(Ts-t1-t5);
    case 2
         t4=-K*u3;
         t5=-K*u1;
         if abs(t4+t5)>Ts
             t4=t4*Ts/(t4+t5);
             t5=t5*Ts/(t4+t5);
         end
         %t7=0.5*(Ts-t4-t5);
         Tcm1=0.25*(Ts-t4-t5);
         Tcm2=0.25*(Ts+t4+t5);
         Tcm3=0.25*(Ts+t4-t5);
     otherwise
         Tcm1=0.5*Ts;
         Tcm2=0.5*Ts;
         Tcm3=0.5*Ts;
 end

上面各个扇区的切换时刻表参考如下所示:
在这里插入图片描述

需要说明的是,上面代码隐藏了MCU中的ARR值,我取了10000,当Tcm/Ts*ARR=Tcm,但在实际使用中,这块是需要根据实际情况处理的。
方法二:
使用开关切换的总时间即占空比来处理,两种方法在本质上差不多

function [Tcm1,Tcm2,Tcm3,sector] = fcn(u_alpha,u_beta,Udc,Ts)
 
 %init
 K=sqrt(3)*Ts/Udc;
 
 %Sector judgment
 u1=u_beta;
 u2=u_alpha*cos(pi/6)-u_beta*cos(pi/3);
 u3=-u_alpha*cos(pi/6)-u_beta*cos(pi/3);
 
 if u1>0
     A=1;
 else
     A=0;
 end
 
 if u2>0
     B=1;
 else
     B=0;
 end
 
 if u3>0
     C=1;
 else
     C=0;
 end
 
 sector = A+2*B+4*C;
 
 switch sector
     case 3
         t4=K*u2;
         t6=K*u1;
         if abs(t4+t6)>Ts
             t4=t4*Ts/(t4+t6);
             t6=t6*Ts/(t4+t6);
         end
         t7=0.5*(Ts-t4-t6);
         Tcm1=t4+t6+t7;
         Tcm2=t6+t7;
         Tcm3=t7;
      case 1
         t2=-K*u2;
         t6=-K*u3;
         if abs(t2+t6)>Ts
             t4=t2*Ts/(t2+t6);
             t6=t6*Ts/(t4+t6);
         end
         t7=0.5*(Ts-t2-t6);
         Tcm1=t6+t7;
         Tcm2=t2+t6+t7;
         Tcm3=t7;
      case 5
         t2=K*u1;
         t3=K*u3;
         if abs(t2+t3)>Ts
             t2=t2*Ts/(t2+t3);
             t3=t3*Ts/(t2+t3);
         end
         t7=0.5*(Ts-t2-t3);
         Tcm1=t7;
         Tcm2=t2+t3+t7;
         Tcm3=t3+t7;
     case 4
         t3=-K*u2;
         t1=-K*u1;
         if abs(t1+t3)>Ts
             t1=t1*Ts/(t1+t3);
             t3=t3*Ts/(t1+t3);
         end
         t7=0.5*(Ts-t1-t3);
         Tcm1=t7;
         Tcm2=t3+t7;
         Tcm3=t1+t3+t7;
     case 6
         t1=K*u3;
         t5=K*u2;
         if abs(t1+t5)>Ts
             t1=t1*Ts/(t1+t5);
             t5=t5*Ts/(t1+t5);
         end
         t7=0.5*(Ts-t1-t5);
         Tcm1=t5+t7;
         Tcm2=t7;
         Tcm3=t1+t5+t7;
    case 2
         t4=-K*u3;
         t5=-K*u1;
         if abs(t4+t5)>Ts
             t4=t4*Ts/(t4+t5);
             t5=t5*Ts/(t4+t5);
         end
         t7=0.5*(Ts-t4-t5);
         Tcm1=t4+t5+t7;
         Tcm2=t7;
         Tcm3=t5+t7;
     otherwise
         Tcm1=0.5*Ts;
         Tcm2=0.5*Ts;
         Tcm3=0.5*Ts;
 end
 %此处是一个BUG,需要取一半
 Tcm1=Tcm1/2;
 Tcm2=Tcm2/2;
 Tcm3=Tcm3/2;

3.3 六路互补PWM生成

在这里插入图片描述
这里使用了Repeating Sequence模块来生成一个频率10KHz,幅值等于ARR=10000的等腰三角形锯齿波。
在这里插入图片描述
SVPWM模块产生的为处理过的“占空比”(CCR),两种情况:
● 当Repeating Sequence模块产生的三角形波形腰边值大于CCR值,Relay模块打开输出为1;
● 当Repeating Sequence模块产生的三角形波形腰边值小于CCR值,Relay模块打开输出为0;
在通过取反,就可以产生与当前PWM互补的信号。以下是生成六路互补PWM的模块;
在这里插入图片描述

4、波形输出

4.1 扇区切换波形

在这里插入图片描述
切换顺序5-4-6-2-3-1,周期性变换。

4.2 等腰三角形锯齿波

在这里插入图片描述

4.3 扇区矢量切换时刻波形

在这里插入图片描述
上图就是“马鞍波”,在实际使用中,上图每一时刻幅值就是PWM的占空比。

4.4 三相电流采样

在这里插入图片描述
三相互差120°的正弦波(近似),频率约4.762Hz

4.5 定子相电流

在这里插入图片描述
与三相相电流一致。

4.6 转速

在这里插入图片描述
转速约4.259rad/s(机械电角速度)

5、 马鞍波的形成原因

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、 基于零序分量注入的SPWM算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
波形分析:
在这里插入图片描述
合成信号就是马鞍波。

参考:
1、现代永磁同步电机控制及MATLAB仿真.袁雷
2、STM32无刷电机控制-电流环PI参数计算:https://www.bilibili.com/video/BV1yG411V7Nn/?spm_id_from=333.999.0.0&vd_source=5f570a9f261c43941608688d2d31a4c5
3、SVPWM仿真搭建及马鞍波形成的原因分析:
https://blog.csdn.net/m0_70748084/article/details/125578567

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hlpinghcg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值