前提和疑惑

前提:
三角形接法的矢量控制和星形不同的是,三角形接法的基本电压矢量的幅值是星形接法的根号2倍,相位滞后星形接法30度,这很关键。相差30度就意味着。星形的的扇区判断和合成矢量所需要的两个矢量作用时间也不一样了,需要重新推导。

后面有给出相关的文档。

疑惑1:
我不是很懂是怎么相差30度的,好像是三角形接法通过矢量的方式位移变成星形的形式后,其坐标系和星形比较相差了30度。
下面是参考文档的解释。
图1

Ualpha和Ubeta对扇区判断的作用

不管是星形的还是三角形的,都需要用到Vq和Vd的反park变换,得到Ualpha和Ubeta。Vq和Vd是Iq电流环和Id电流环的输出值。
Ualpha和Ubeta是怎么判断扇区的:
看下图,用Uabc映射到Ualpha和Ubeta,经过计算,能得到
Ualpha = Um Cos(θ)
Ubeta = Um sin(θ)

用Ubeta除以Ualpha得到,tan(θ),artan(tan(θ))就等于角度了。

在这里插入图片描述

星形的扇区判断

在看下图,我们可以列出6个不等式,不等式怎么来:
我们知道,把一个电角度分成6个扇区,每个扇区60度。
在这里插入图片描述
那么
tan0< Ubeta/Ualpha<tan60

tan300< Ubeta/Ualpha<tan360
再经过化简,发现有2个式子经常出现,那就是(√3/2)Ualpha 和 (1/2)Ubeta。这在后面会用到。

这里有个小插曲。
有的文档是没有这个1/2的,其实有没有都不影响判断。因为,我们的不等式是和0比较的,左右同时乘1/2,不影响结果,只是因为后面的矢量作用时间也会用到这个1/2,在单片机那里的具体表现就是不用再计算一次,浪费运行时间。

扇区判断
再往下看,我们可以假设出3个式子,是假设。
u1= Ubeta
u2= (√3/2)Ualpha-(1/2)Ubeta
u3= -(√3/2)Ualpha-(1/2)Ubeta

若u1>0 则A=1,否则A=0.
若u2>0 则B=1,否则B=0.
若u3>0 则C=1,否则C=0.
再结合上图对扇区角度的判断,我们能得到
Ualpha和Ubeta和扇区的关系。
利用关系
N = 4C + 2B +A得到扇区的区号,这些都是网上能找到的解释,至于为啥是N = 4C + 2B +A,这只是一个简化的公式,方便单片机计算,你也可以直接按上面的不等式用if语句来判断。
这里有个小插曲:

Ubeta
(√3/2)Ualpha-(1/2)Ubeta
-(√3/2)Ualpha-(1/2)Ubeta

这三个式子是假设出来的,可以是不一样的,这里的不一样是指正负不一样,这就是为什么看到别人的推导和自己的推导有不一样的地方,有的假设甚至把矢量作用的计算也考虑进去了。参考TI的简化代码。
在这里插入图片描述

三角形接法的扇区判断

这里的扇区判断是我直接使用了,别人文献的判断条件。
在这里插入图片描述
用这个判断条件就就可以了。
图中我圈主的地方是文献有写错的,应该是B0。
这里有点小疑惑:
在这里插入图片描述

根据星形的判断格式来看,
应该是
tan(330)<Ubeta/Ualpha<tan30
tan(30)<Ubeta/Ualpha<tan90
。。。。
tan(270)<Ubeta/Ualpha<tan330
这里就有问题了。
因为tan90度。是不存在的。是正无穷。

星形和三角形接法的矢量作用时间计算

先通过星形的作用时间推导,知道怎么推之后,然后推导三角形的。
引用:
在这里插入图片描述

星形的计算:
扇区1 2 3:
在这里插入图片描述
扇区4 5 6:
在这里插入图片描述
可以看到扇区456的这张笔记的,最后的那三个表达式,和扇区判断的联系了起来。
在这里插入图片描述
左上角的那个假设的表达式,是可以变的,这些表达式是根据前面扇区的计算出来的表达式关联起来的。

然后右下角是假设了tabc是这三个表达式,这是扇区1的,
因为每个扇区都用这三个扇区,只是位置不一样。

那么每个扇区的Ta Tb Tc怎么来的,
这是因为下面这个图来的,计算的方式参考扇区1.
每个扇区,3个开关管的作用时长不一样。

为什么是TX/2。Y/2,
因为我们计算的TX是整个周期的,但是我们单片机赋值只是幅值一半。剩下一般周期的都是硬件自动完成(中心对齐模式)

在这里插入图片描述

在这里插入图片描述
然后每个扇区的tabc就可以有这样的规律
在这里插入图片描述

TI的代码就是不一样的,然后TI还给它优化了。

然后Ta Tb Tc的时长是这样的
在这里插入图片描述

先贴一个TI的代码

//0.8660254f等于 根号3/2
void  Svpwm_Tabc_Class::SVPWM_Cale(uint16_t period)
{
     tmp1=  Ubeta;   // 相当于二相静止坐标--到三相静止变换出Uabc
	   tmp2=  Ubeta*0.5f +  Ualpha*0.8660254f ;
     tmp3=  tmp2 -  tmp1;   // 三相逆变换和网上公式极性不同,// -Ubeta*0.5f +  Ualpha*0.8660254f ;
    //本方法的SVPWM的扇区判断不同1--6/对应0--360,均匀分布
		 VecSector=3;   // 根据三相电压符号计算矢量扇区
		 VecSector=( tmp2> 0)?(  VecSector-1): VecSector;
		 VecSector=( tmp3> 0)?(  VecSector-1): VecSector;
		 VecSector=( tmp1< 0)?(7- VecSector) : VecSector;

	  if( VecSector==1 ||  VecSector==4)   // 根据矢量扇区计算矢量占空比Tabc
   {
		 Ta=  tmp2;
		 Tb=  tmp1- tmp3; //1.5ub -Ualpha*0.8660254f ;
		 Tc=-tmp2;
   }

    else if( VecSector==2 ||  VecSector==5)
   {
     Ta=tmp3+ tmp2;
		 Tb=tmp1;
		 Tc=-tmp1;
   }
    else if( VecSector==3 ||  VecSector==6)
   {
    	 Ta=  tmp3;
       Tb=-tmp3;
       Tc=-(tmp1+ tmp2);
   }
   else     //异常状态下的判断出的扇区 0---7或者其他就执行0电压矢量
   {
		  Ta=0;
		  Tb=0;
		  Tc=0;
   }
	// Tabc是在浮点数据正负  , 电压, Ta/Svpwm_Km是标幺值计算,将Tabc计算成-1---1
	// 将占空比调节为-1---1   ,再讲PWM的半周期占空比值提出    (-1---1)*50%+50%=0---100%
	 //调制系数 m=Sqrt(3)*|Ts|/Udc  Svpwm_Km_Backw = 3/(Sqrt(3)*Udc)
	 //Svpwm_Km_Backw*(period),按我的理解,这里就是根号3*Ts /Udc ,是各个扇区的两个矢量合成需要的一个系数。 除以2是因为不能有负数,后面再加了0.5.
	 SVPTa=(int16_t)( Ta*Svpwm_Km_Backw*(period/2))+(period/2);  // 计算
	 SVPTb=(int16_t)( Tb*Svpwm_Km_Backw*(period/2))+(period/2);
	 SVPTc=(int16_t)( Tc*Svpwm_Km_Backw*(period/2))+(period/2);
	 
	 //启动时各砍一半,占空比,然后再慢慢往上加。
	 
}


三角形:
我是看了文档然后根据星形的推导,
然后自己推导了一遍,后面会给出文档的公式。

由于三角形的比星形是滞后了30度。
所以。6个扇区的分布如下。
在这里插入图片描述

计算方式和星形是一样的。只是角度不一样
由于是第一个扇区的计算。
下面贴几张扇区两个矢量的作用时长。

在这里插入图片描述

第一扇区,自己计算得很模糊,我贴一个文档的计算。
结果是一样的,我只是把T移到了右边。
在这里插入图片描述

第二扇区:
在这里插入图片描述

第三扇区
在这里插入图片描述

第四扇区
在这里插入图片描述
第五扇区和第六扇区

在这里插入图片描述

下图是每个扇区的两个作用矢量电压的作用时间
在这里插入图片描述

然后和星形一样,假设一个表达式
这是文档的表达式,文档的表达式和我的相差了一个((根号3)/2)
为什么?
。我也不清楚。。。,可能是这个图的原因

在这里插入图片描述
这是假设文档的3个表达式。
在这里插入图片描述
然后根据上面6张图推导出来的公式,去套XYZ
得到如下图:
在这里插入图片描述

在这里插入图片描述
然后根据每个扇区的3个开关管的作用时长,和星形的比较会发现是一样的规律。
在这里插入图片描述

这里的作用时长和星形的是一样的,因为扇区的切换方式是一样的。如下图
在这里插入图片描述在这里插入图片描述

下面贴上三角形的代码。

void Svpwm_Tabc_Class::Triangle_Sector_Cal(float Ualpha,float Ubeta,uint32_t period)
{
	
	float  Vref1,Vref2,Vref3;
	float  X_Vef,Y_Vef,Z_Vef;
	float  T1,T2;
	
  Vref1 = Ualpha;
	Vref2 = 1.7320508f * Ubeta - Ualpha;
	Vref3 = -1.7320508f * Ubeta -  Ualpha;
	
	period = period * 2;
	VecSector=0;
	
	//扇区判断。
	if(Vref1>0)
		VecSector = 1;
	
	if(Vref2>0)
		VecSector = VecSector + 2;
	
	if(Vref3>0)
		VecSector = VecSector + 4;
	
	//扇区内两个矢量作用时长
	X_Vef = (0.5f * Ualpha/Standard_Work_Voltage_V  + 0.8660254f*Ubeta / Standard_Work_Voltage_V)*period;
	Y_Vef = (0.5f * Ualpha/Standard_Work_Voltage_V  - 0.8660254f*Ubeta / Standard_Work_Voltage_V)*period;
	Z_Vef = ( Ualpha/Standard_Work_Voltage_V  )*period;
	
	switch(VecSector)
	{
	  case 1:
			T1 = Y_Vef;
			T2 = X_Vef;
			break;
		case 3:
			T1 = -Y_Vef;
			T2 = Z_Vef;
			break;
		case 2:
			T1 = X_Vef;
			T2 = -Z_Vef;
			break;
		case 4:
			T1 = -Z_Vef;
			T2 = Y_Vef;
			break;
		case 5:
			T1 = Z_Vef;
			T2 = -X_Vef;
			break;
		case 6:
			T1 = -X_Vef;
			T2 = -Y_Vef;
			break;
	}
	
	if((T1 + T2)>period)
	{
		T1 = (T1 / (T1 + T2)) * period;
		T2 = (T2 / (T1 + T2)) * period;
	}
	
	//作用时间
	Ta = (period - T1 - T2) / 4.0f;
	Tb = Ta + T1/2.0f;
	Tc = Tb + T2/2.0f;
	
	switch(VecSector)
	{
	  case 1:
			SVPTa = (uint16_t)Ta;
			SVPTb = (uint16_t)Tb;
			SVPTc = (uint16_t)Tc;
			break;
		case 3://2
			SVPTa = (uint16_t)Tb;
			SVPTb = (uint16_t)Ta;
			SVPTc = (uint16_t)Tc;
			break;
		case 2://3
			SVPTa = (uint16_t)Tc;
			SVPTb = (uint16_t)Ta;
			SVPTc = (uint16_t)Tb;
			break;
		case 5://6
			SVPTa = (uint16_t)Ta;
			SVPTb = (uint16_t)Tc;
			SVPTc = (uint16_t)Tb;
			break;
		case 6://4
			SVPTa = (uint16_t)Tc;
			SVPTb = (uint16_t)Tb;
			SVPTc = (uint16_t)Ta;
			break;
		case 4://5
			SVPTa = (uint16_t)Tb;
			SVPTb = (uint16_t)Tc;
			SVPTc = (uint16_t)Ta;
			break;
		default:
			SVPTa = 0;
			SVPTb = 0;
			SVPTc = 0;
			break;
	}
}

FOC控制所需要的相电流

因为我们用的是电流传感器,
星形接法的时候感应到的是线电流,因为星形接法的线电流和相电流是一样的,所以可以直接用来结算FOC的各种电流变换。

但是三角形的接法的线电流和相电流是不一样的。需要从线电流提取出相电流。
而且经过实验是不能直接除以根号3的,

那么我也直接运用了文档的方法。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里提示一下,经过实验,发现三角形电流的线序的接法的不用,
公式11就会不同

我们根据上面的公式推导了自己实验的电机,发现是不一样的。
代码如下

		//三角形结构电机线电流Ia,Ib,Ic与相电流Iax,Iby,Icz的转换
		//1、如A相输出接B相输入
		//	Iax = (Ia - Ib) / 3
		//	Iby = (Ib - Ic) / 3
		//	Icz = (Ic - Ia) / 3
		//2、如A相输出接C相输入
		//	Iax = (Ia - Ic) / 3
		//	Iby = (Ib - Ia) / 3
		//	Icz = (Ic - Ib) / 3
		//使用第2种
		Large_iThreeCurrent[0] = (float)((fScrCurrent[2] - fScrCurrent[0])/3.0f);
		Large_iThreeCurrent[1] = (float)((fScrCurrent[0] - fScrCurrent[1])/3.0f);
		Large_iThreeCurrent[2] = (float)((fScrCurrent[1] - fScrCurrent[2])/3.0f);

到这里,电机就能转起来了。发现电流并不是很好。这里慢慢优化。
结束!

参考文档

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐