• 永磁同步电机36问(三)——SVPWM代码实现


    学习SVPWM过后总有一种似乎学了,又好像没学的感觉,感觉懂了又好像没懂。怎么办呢,那最好的办法就是一五一十的撸一遍原理,用代码实现一下它。为了方便理解,就用与公式原理完全一一对应的代码去实现,先不管这个代码的效率了,理解了再优化。走起。

    判断前的准备:Ualpha与Ubeta信号来源的构建

    simulink的library搜索sine,Ualpha和Ubeta的设置如下,设定频率为50Hz,幅值为300。Ualpha要超前Ubeta一个90°的相位,因此设置的区别在于Ubeta的相位初始值为 -pi/2。

    写算法前看看输入信号的效果,好嘞是我想要的效果,幅值频率都对,下一步就开始写算法了。

    步骤一名称:扇区判断

    步骤一原理:

    依据输入的Ualpha与Ubeta来判断此时的电压矢量处于哪个扇区,其判断逻辑如下图所示,通过设立 Uref1 、Uref2 、Uref3 三个判断变量,来决定ABC值的大小,并通过公式 N =4A+2B+C得到扇区号。

    这里必须明确一个非常重要的点:扇区号N 与 扇区I II等是两个概念,我们后面的逻辑判断全都是用的扇区号N,而非从0-360°依次以60°区分的扇区。

    步骤一代码:

    1. Uref1 = Ubeta;
    2. Uref2 = sqrt(3)*Ualpha/2 - Ubeta/2;
    3. Uref3 = -sqrt(3)*Ualpha/2 - Ubeta/2;
    4. if Uref1>0
    5. A = 1;
    6. else
    7. A = 0;
    8. end
    9. if Uref2>0
    10. B = 1;
    11. else
    12. B = 0;
    13. end
    14. if Uref3>0
    15. C = 1;
    16. else
    17. C = 0;
    18. end
    19. N = 4*C + 2*B + A;

    这一步也看看效果:效果就是N出来是3-1-5-4-6-2,对应0-360的旋转。

    步骤二名称:基本矢量作用时间的判断与分配

    步骤二原理:

    算出XYZ三个基本矢量的作用时间,然后根据扇区号N对其进行分配,其分配的表格如下图所示。

     步骤二代码:

    1. X = sqrt(3)*Ts*Ubeta/Udc;
    2. Y = sqrt(3)*Ts/Udc*(sqrt(3)*Ualpha/2+Ubeta/2);
    3. Z = sqrt(3)*Ts/Udc*(-sqrt(3)*Ualpha/2+Ubeta/2);
    4. switch(N)
    5. case 1
    6. T1 = Z;
    7. T2 = Y;
    8. case 2
    9. T1 = Y;
    10. T2 = -X;
    11. case 3
    12. T1 = -Z;
    13. T2 = X;
    14. case 4
    15. T1 = -X;
    16. T2 = Z;
    17. case 5
    18. T1 = X;
    19. T2 = -Y;
    20. case 6
    21. T1 = -Y;
    22. T2 = -Z;
    23. end

    步骤二的代码不太好验证效果,直接进入步骤三吧。

    步骤三:切换点的时间计算与分配

    步骤三原理:

    在计算到了基本矢量的作用时间后,也就是得到了下图公式的T4和T6之后,就需要对ABC三相进行切换点的计算,并分配到ABC三相上去。 这里需要搞清楚的一个地方记录一下:切换点是什么的问题?首先问这个切换是针对的是什么?,这个切换点是针对abc三路脉冲电平由低切换到高的点。再问生成的脉冲电平用来干什么?我们熟知的三相逆变器有6个管子,三个桥臂,驱动桥臂开关管的其实就是PWM脉冲,PWM脉冲有高有低,这个切换点实际上就是PWM高低切换的点。如果我们把这个点算出来了,那么PWM就算出来了,三相逆变器也被按照我们所想的驱动了。

    步骤三代码:

    1. Ta = (Ts - T1 - T2)/4;
    2. Tb = Ta + T1/2;
    3. Tc = Tb + T2/2;
    4. switch(N)
    5. case 1
    6. Tcm1 = Tb;
    7. Tcm2 = Ta;
    8. Tcm3 = Tc;
    9. case 2
    10. Tcm1 = Ta;
    11. Tcm2 = Tc;
    12. Tcm3 = Tb;
    13. case 3
    14. Tcm1 = Ta;
    15. Tcm2 = Tb;
    16. Tcm3 = Tc;
    17. case 4
    18. Tcm1 = Tc;
    19. Tcm2 = Tb;
    20. Tcm3 = Ta;
    21. case 5
    22. Tcm1 = Tc;
    23. Tcm2 = Ta;
    24. Tcm3 = Tb;
    25. case 6
    26. Tcm1 = Tb;
    27. Tcm2 = Tc;
    28. Tcm3 = Ta;
    29. end

    步骤四:接口输出

    到这里配置一个接口输出量(matlab的function模块输出信号不允许直接放在判断逻辑里面,否则会报错),所以最后加一小段代码。

    1. Tc1 = Tcm1;
    2. Tc2 = Tcm2;
    3. Tc3 = Tcm3;

    输出效果如下图所示:是不是非常美丽的马鞍波,并且其频率也是输入的50Hz。 

    如果有兴趣的小伙伴,想要学习这个地方的,可以按照以上步骤搭建一下,搭建的仿真框图如下图所示:

    为了方便使用,其中function部分的全代码放在下面了,大家直接复制粘贴就可以了,去试试效果吧,有深入探究的同学可以试着优化一下,我这个代码太过。。。。额。。。初级了,但是好处是便于理解。有优化好的同学可以评论区留言分享一下。

    1. function [N,N_Sector1,Tc1,Tc2,Tc3] = fcn(Ualpha,Ubeta)
    2. %#codegen
    3. persistent Uref1 Uref2 Uref3 A B C X Y Z T1 T2 Ta Tb Tc N_Sector Udc Ts Tcm1 Tcm2 Tcm3;
    4. if isempty(Uref1)
    5. U1 = 0; U2 = 0; U3 = 0;
    6. A = 0; B = 0; C = 0;
    7. X = 0; Y = 0; Z = 0;
    8. T1 = 0; T2 = 0;
    9. Ta = 0; Tb = 0; Tc = 0;
    10. Tcm1 = 0; Tcm2 = 0; Tcm3 = 0;
    11. Ts = 1/5000;
    12. m = sqrt(3)/540*Ts;
    13. N_Sector=0;
    14. Udc =540;
    15. end
    16. Uref1 = Ubeta;
    17. Uref2 = sqrt(3)*Ualpha/2 - Ubeta/2;
    18. Uref3 = -sqrt(3)*Ualpha/2 - Ubeta/2;
    19. if Uref1>0
    20. A = 1;
    21. else
    22. A = 0;
    23. end
    24. if Uref2>0
    25. B = 1;
    26. else
    27. B = 0;
    28. end
    29. if Uref3>0
    30. C = 1;
    31. else
    32. C = 0;
    33. end
    34. N = 4*C + 2*B + A;
    35. switch(N)
    36. case 1
    37. N_Sector=2;
    38. case 2
    39. N_Sector=6;
    40. case 3
    41. N_Sector=1;
    42. case 4
    43. N_Sector=4;
    44. case 5
    45. N_Sector=3;
    46. case 6
    47. N_Sector=5;
    48. end
    49. N_Sector1 = N_Sector;
    50. X = sqrt(3)*Ts*Ubeta/Udc;
    51. Y = sqrt(3)*Ts/Udc*(sqrt(3)*Ualpha/2+Ubeta/2);
    52. Z = sqrt(3)*Ts/Udc*(-sqrt(3)*Ualpha/2+Ubeta/2);
    53. switch(N)
    54. case 1
    55. T1 = Z;
    56. T2 = Y;
    57. case 2
    58. T1 = Y;
    59. T2 = -X;
    60. case 3
    61. T1 = -Z;
    62. T2 = X;
    63. case 4
    64. T1 = -X;
    65. T2 = Z;
    66. case 5
    67. T1 = X;
    68. T2 = -Y;
    69. case 6
    70. T1 = -Y;
    71. T2 = -Z;
    72. end
    73. Ta = (Ts - T1 - T2)/4;
    74. Tb = Ta + T1/2;
    75. Tc = Tb + T2/2;
    76. switch(N)
    77. case 1
    78. Tcm1 = Tb;
    79. Tcm2 = Ta;
    80. Tcm3 = Tc;
    81. case 2
    82. Tcm1 = Ta;
    83. Tcm2 = Tc;
    84. Tcm3 = Tb;
    85. case 3
    86. Tcm1 = Ta;
    87. Tcm2 = Tb;
    88. Tcm3 = Tc;
    89. case 4
    90. Tcm1 = Tc;
    91. Tcm2 = Tb;
    92. Tcm3 = Ta;
    93. case 5
    94. Tcm1 = Tc;
    95. Tcm2 = Ta;
    96. Tcm3 = Tb;
    97. case 6
    98. Tcm1 = Tb;
    99. Tcm2 = Tc;
    100. Tcm3 = Ta;
    101. end
    102. Tc1 = Tcm1;
    103. Tc2 = Tcm2;
    104. Tc3 = Tcm3;

     

  • 相关阅读:
    计算机组成原理---第五章中央处理器---指令流水线---选择题
    机器学习案例之客户的信用风险与预测
    35的程序员被辞了可以自己接外包啊?为什么都那么悲观呢?
    Java【类和对象】,你还没对象?我教你new一个!
    数据结构--B树
    PostgreSQL 15新版本特性解读(含直播问答、PPT资料汇总)
    SAP Router 配置手册
    【2023】Git版本控制-本地仓库详解
    石化人员定位方案:uBeacon+ibeacon融合定位特点
    为安全带来光明:光耦继电器的 10 种救生应用
  • 原文地址:https://blog.csdn.net/sy243772901/article/details/126064616