单相SPWM
在单相电路中存在两个桥臂,也就是有两个电位点分别定义为a(在A轴上)和b(在B轴上),
输出的电压为输出电压矢量在实轴上的投影为; m为输出电压矢量
在单极性调制中
上半周期令
在下半周期
void SPwmGen(u16 m_Q15, u16 sita_Q15)
{
if(sita_Q15 > 0x7fff) // > 180
{
LeftBridgeSetLow();
RightBridgeSetPluse(m_Q15,sin(0xffff - sita_Q15));
}else
{
RightBridgeSetLow();
LeftBridgeSetPluse(m_Q15,sin(sita_Q15));
}
}
在双极性调制中
void SPwmGen(u16 m_Q15, u16 sita_Q15)
{
RightBridgeSetPluse(m_Q15,(sin(sita_Q15)+1)/2);
LeftBridgeSetPluse(m_Q15,(sin(sita_Q15+0x7fff)+1)/2);
}
从以上分析可以看出在单极性与与双极性调制,会有细微的差别,双极性调制需要对调制信号进行平移和缩放,这在实际编程时需要注意。
三相两电平
以alfa 和 beta 为坐标系进行扇区划分
扇区主要划分为6个区间,扇区的划分依据为边界线,比如图上所标注的一条边界线的表达式为
另外的边界表达式和,通过这三条边界线则可以将6个扇区区分开来,同时也就成为了判断矢量扇区的三个条件
u8 DetectAre(SVGEN *v)
{
v->tmp1= v->Ubeta; //
v->tmp2= v->Ubeta/2 + 866*v->Ualpha/1000; //0.5(beta + sqrt(3)*alfa)
v->tmp3= v->tmp2 - v->tmp1; //0.5(beta - sqrt(3)*alfa)
v->VecSector=3;
v->VecSector=(v->tmp2> 0)?( v->VecSector-1):v->VecSector;
v->VecSector=(v->tmp3> 0)?( v->VecSector-1):v->VecSector;
v->VecSector=(v->tmp1< 0)?(7-v->VecSector) :v->VecSector;
}
矢量作用时间的计算
矢量作用时间的计算比较复杂,首先通过几何特性计算每个扇区的矢量合成时间
然后按照七段式或五段式进行矢量的合成。
Ti官方给出的计算方法比较简练高效,现将代码粘贴如下,这是七段式代码,可以稍加修改改为5段式代码
void SvTimeCal(SVGEN *v)
{
v->tmp1= v->Ubeta;
v->tmp2= v->Ubeta/2 + 866*v->Ualpha/1000;
v->tmp3= v->tmp2 - v->tmp1;
v->VecSector=3;
v->VecSector=(v->tmp2> 0)?( v->VecSector-1):v->VecSector;
v->VecSector=(v->tmp3> 0)?( v->VecSector-1):v->VecSector;
v->VecSector=(v->tmp1< 0)?(7-v->VecSector) :v->VecSector;
if(v->VecSector==1 || v->VecSector==4)
{
v->Ta= v->tmp2;
v->Tb= v->tmp1-v->tmp3;
v->Tc=-v->tmp2;
}
else if(v->VecSector==2 || v->VecSector==5)
{
v->Ta= v->tmp3+v->tmp2;
v->Tb= v->tmp1;
v->Tc=-v->tmp1;
}
else
{
v->Ta= v->tmp3;
v->Tb=-v->tmp3;
v->Tc=-(v->tmp1+v->tmp2);
}
//五段式处理 (把111脉冲干掉)
x = (Ta+1)*period/2;
y = (Tb+1)*period/2;
z = (Tc+1)*period/2;
m = min( x, y, z );
x - m;
y - m;
z - m;
}
三相三电平
以alfa 和 beta 为坐标系进行扇区划分的9条线
矢量作用时间的计算