本帖最后由 RunningX 于 2020-12-3 21:25 编辑
最近学习了SVPWM,把推理过程跟代码分享一下。在FOC控制中,我们通过采集相电流(Ia,Ib,Ic),经过Clark变换成Ialpha,Ibeta,再经过park变化成Id,Iq;然后经过PID运算,输出经过PID运算得到的Id,Iq;Id,Iq经过repark变化得到Ialpha跟Ibeta,通过计算Ialpha跟Ibeta,就能生成SVPWM。
下面介绍红色字体的计算过程:
一.通过给定一个Id跟Iq值,可以通过公式Ialpha = cos(theta) * Id - sin(theta) * Iq; Ibeta = sin(theta) * Id + cos(theta) * Iq;得到Ialpha跟Ibeta
二.得到的Ialpha跟Ibeta就可以进行SVPWM的生成了。
1.扇区位置确定。
上图的为Alpha/Beta坐标系中电压旋转平面。
FOC控制分区说明:通过控制3对PMW的通断,有8种PWM控制方式,其中111和000位零矢量,其他6个矢量可将一个电压旋转平面分成6个扇区。
从0-300度分别为U4(100)、U6(110)、U2(010)、U3(011)、U1(001)、U5(101),每个矢量间隔60度。 每两个相邻两个电压矢量之间为一个扇区,例如U4与U6之间为I扇区,U6与U2之间为II扇区。下图为Alpha-Beta坐标及第I扇区:其中Alpha >0,Beta>0,Beta/Alpha < tan60° = sqrt(3);
同理,可推出每个扇区之间的的电压Alpha与电压Beta值存在以下关系: I区:Alpha > 0;Beta > 0; Beta < sqrt(3) * Alpha; II区:Beta > 0;Beta > |sqrt(3) * Alpha|;第二条公式分为(当Alpha>0,则Beta>sqrt(3)*Alpha;当Alpha<0;Beta>-sqrt(3)*Alpha) III区:Alpha < 0;Beta > 0; Beta < |sqrt(3) * Alpha|;第二条公式化为Beta< -sqrt(3) * Alpha IV区:Alpha < 0;Beta < 0; -Beta < -sqrt(3) * Alpha;第二条公式化为Beta>sqrt(3)*Alpha V区: Beta > 0;-Beta > |sqrt(3) * Alpha|;第二条公式分为(当Alpha>0,则-Beta>sqrt(3)*Alpha;当Alpha<0,则-Beta>-sqrt(3)*Alpha)
VI区:Alpha > 0;Beta < 0; -Beta < sqrt(3) * Alpha;
从以上的条件,略去单独Alpha的大小判断,可发现扇区的位置由Beta,sqrt(3)*Alpha-Beta,-sqrt(3)*Alpha-Beta三式决定令Sector_A = Beta; Sector_B = (sqrt(3)*Alpha-Beta)/2; Sector_C = (-sqrt(3)*Alpha-Beta)/2; 令N = 4*Sector_C + 2*Sector_B + 1*Sector_A;则有: I区: Sector_C < 0;Sector_B > 0;Sector_A> 0; 则N=(二进制)011=(十进制)3; II区: Sector_C < 0;Sector_B < 0;Sector_A >0; 则N=(二进制)001=(十进制)1; III区: Sector_C >0;Sector_B < 0;Sector_A > 0; 则N=(二进制)101=(十进制)5; IV区: Sector_C > 0;Sector_B < 0;Sector_A <0; 则N=(二进制)100=(十进制)4; V区: Sector_C > 0;Sector_B > 0;Sector_A< 0; 则N=(二进制)110=(十进制)6;
VI区: Sector_C < 0;Sector_B > 0;Sector_A <0; 则N=(二进制)010=(十进制)2;
即由Alpah跟Beta可得到扇区位置
2.扇区的矢量保持时间 同样以第I扇区为例:
第I扇区中Alpah*Ts =|U4|*T4 + |U6|*T6*cos(π/3);Beta*Ts= |U4|*T4*0 + |U6|*T6*sin(π/3);其中|U1| = |U2| = |U3| = |U4| = |U5| = |U6| = 2/3Udc; 则有Alpah*Ts = 2/3Udc*T4 + 1/3Udc*T6;Beta*Ts =(1/ sqrt(3))*T6;由这两条公式继续推,可得:T4 = (sqrt(3)/2)(sqrt(3)*Alpha - Beta)*(Ts/Udc) = (sqrt(3))*Sector_B*(Ts/Udc); T6 = sqrt(3)*Beta*(Ts/Udc) = sqrt(3)*Sector_A*(Ts/Udc);
第II扇区中Alpha*Ts = |U6|*T6 *cos(π/3)- |U2|*T2*cos(π/3); Beta*Ts= |U6|*T6*sin(π/3) + |U2|*T2*sin(π/3);同理可推得: T6 = sqrt(3)/2*(sqrt(3)Alpha + Beta)*(Ts/Udc) = -sqrt(3)*Sector_C*(Ts/Udc); T2 = sqrt(3)/2*(Beta - sqrt(3)Alpha)*(Ts/Udc) = -sqrt(3)*Sector_B*(Ts/Udc);
第III扇区中,Alpha*Ts = -|U2|*T2*cos(π/3) - |U3|*T3;Beta*Ts = |U2|*T2*sin(π/3) + |U3|*T3*0; 可得:T2 = sqrt(3)*Beta*(Ts/Udc) = sqrt(3)*Sector_A*(Ts/Udc); T3 = -sqrt(3)/2*(sqrt(3)Alpha + Beta)*(Ts/Udc) = sqrt(3)*Sector_C*(Ts/Udc);
第IV扇区中, Alpha*Ts = -|U3|*T3 - |U1|*T1*cos(π/3);Beta*Ts = |U3|*T3*0 - |U1|*T1*sin(π/3);可得:T3 = sqrt(3)/2*(Beta - sqrt(3)Alpha)*(Ts/Udc) = -sqrt(3)*Sector_B*(Ts/Udc); T1 = -sqrt(3)*Beta*(Ts/Udc) = -sqrt(3)*Sector_A*(Ts/Udc);
第V扇区中,Alpha*Ts = -|U1|*T1*cos(π/3) + |U5|*T5*cos(π/3); Beta*Ts= -|U1|*T1*sin(π/3) + -|U5|*T5*sin(π/3);可得: T1 = -sqrt(3)/2*(sqrt(3)Alpha + Beta)*(Ts/Udc) = sqrt(3)*Sector_C*(Ts/Udc); T5 = sqrt(3)/2*(sqrt(3)Alpha - Beta)*(Ts/Udc) = sqrt(3)*Sector_B*(Ts/Udc);
第VI扇区中,Alpah*Ts =|U5|*T5 *cos(π/3)+ |U4|*T4;Beta*Ts= |U5|*T5*sin(π/3) + |U4|*T4*0;可得T5 = -sqrt(3)*Beta*(Ts/Udc) = -sqrt(3)*Sector_A*(Ts/Udc) T4 = sqrt(3)/2*(sqrt(3)Alpha + Beta)*(Ts/Udc) = -sqrt(3)*Sector_C*(Ts/Udc)
其中Ts/Udc为固定值,可以理解为PWM周期/电压 即由Alpah跟Beta也可得到扇区的矢量保持时间
3.根据扇区及矢量保持时间,既可用来生成相应的PWM 根据扇区中各个矢量的保持时间,可以计算得到各个PWM通道的占空比,控制各个PWM通道输出,也就是SVPWM
工程中可以通过仿真改变startFlag的值来控制电机运行,通过调节openLoop_Iq来控制Iq的输出;因为是强拖运行,所以是theta角度是手动给的,theta角对应的正弦值可通过查表的方式得到。
|