三角形接法永磁同步电机的FOC+SVPWM控制
前提和疑惑
前提:
三角形接法的矢量控制和星形不同的是,三角形接法的基本電壓矢量的幅值是星形接法的根號2倍,相位滯后星形接法30度,這很關鍵。相差30度就意味著。星形的的扇區判斷和合成矢量所需要的兩個矢量作用時間也不一樣了,需要重新推導。
后面有給出相關的文檔。
疑惑1:
我不是很懂是怎么相差30度的,好像是三角形接法通過矢量的方式位移變成星形的形式后,其坐標系和星形比較相差了30度。
下面是參考文檔的解釋。
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; // 相當于二相靜止坐標--到三相靜止變換出Uabctmp2= 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://2SVPTa = (uint16_t)Tb;SVPTb = (uint16_t)Ta;SVPTc = (uint16_t)Tc;break;case 2://3SVPTa = (uint16_t)Tc;SVPTb = (uint16_t)Ta;SVPTc = (uint16_t)Tb;break;case 5://6SVPTa = (uint16_t)Ta;SVPTb = (uint16_t)Tc;SVPTc = (uint16_t)Tb;break;case 6://4SVPTa = (uint16_t)Tc;SVPTb = (uint16_t)Tb;SVPTc = (uint16_t)Ta;break;case 4://5SVPTa = (uint16_t)Tb;SVPTb = (uint16_t)Tc;SVPTc = (uint16_t)Ta;break;default:SVPTa = 0;SVPTb = 0;SVPTc = 0;break;} }FOC控制所需要的相電流
因為我們用的是電流傳感器,
星形接法的時候感應到的是線電流,因為星形接法的線電流和相電流是一樣的,所以可以直接用來結算FOC的各種電流變換。
但是三角形的接法的線電流和相電流是不一樣的。需要從線電流提取出相電流。
而且經過實驗是不能直接除以根號3的,
那么我也直接運用了文檔的方法。
這里提示一下,經過實驗,發現三角形電流的線序的接法的不用,
公式11就會不同
我們根據上面的公式推導了自己實驗的電機,發現是不一樣的。
代碼如下
到這里,電機就能轉起來了。發現電流并不是很好。這里慢慢優化。
結束!
參考文檔
總結
以上是生活随笔為你收集整理的三角形接法永磁同步电机的FOC+SVPWM控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员把地府后台管理系统做出来了,还有3
- 下一篇: c++ pi