下圖是FOC(磁場向量控制)中非常經典的系統控制圖,我相信很多人都會被系統圖中的PARK、CLARKE座標變換嚇到了,
說實話如果只是把座標變換當成工具來使用的話,真的也沒那們難理解,
當然如果你是學生的話可能會想推導公式,但是在工程應用推導複雜公式對產品的開發意義不大。
說穿了PARK、CLARKE只是一些公式而已如下圖所示
下面公式告訴我們三項交流的ia、ib 、 ic 透過PARK、CLARKE變換,會變成直流id 、iq
接下來我們用C語言去驗證是不是真的如此??
接下來用Dev C++開啟一個空白專案並且貼上以下程式
我們先創建三項(互差120度)交流電
************************************************************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int i;
float We,i_as,i_bs,i_cs,i_ds,i_qs,dt,t;
FILE *fp;
fp = fopen("D:/work/result1.txt", "w+");
for(i=1;i<=2000;i=i+1)
{
dt = 0.0001;
t = t+dt;
We = 2.0*3.14159*60.0; //2*pi*f 頻率假設60hz
////用數學式表示相差120度的三個sin wave
i_as = 1.0*cos(We*t);
i_bs = 1.0*cos(We*t-2*3.14159/3.0);
i_cs = 1.0*cos(We*t-4*3.14159/3.0);
fprintf(fp,"%5.5f , %5.5f, %5.5f, \n",i_as,i_bs,i_cs); //數字列印到txt檔案
//,再把txt的數字拖到excel跑圖形
printf("%5.5f , %5.5f , %5.5f, %5.5f, \n",i_as,i_bs,i_cs); //印到螢幕
}
fclose(fp);
system("pause");
return 0;
}
************************************************************************************************************************************
將印出來的數字全貼到EXCEL在畫成圖形,此時你應該可以呈現下圖的sin波形。
再來就是將三相交流用轉換成 i_arfa i_beta ,就是俗稱的CLARKE變換
Clarke 假設 ia+ib+ic =0
i_arfa = ia
i_beta = (ia+2ib)/1.732;
再把i_arfa、 i_beta 轉成 id 、iq ,就是俗稱的Park變換
i_d = i_arfa * cos(thita) + i_beta * sin(thita)
i_q = -i_arfa * sin(thita) + i_beta * cos(thita)
此時的 i_d 、i_q 就是直流分量, i_d就是控制激磁、i_q就是控制轉拒,
如果控制電動車,想讓電動車加速,這時要控制甚麼??
當然是轉拒, 轉拒一大 ,加速度也會變大 ,電動車就會加速了,
i_d則是用在弱磁控制上的,詳情請爬文。
************************************************************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int i;
float We,i_as,i_bs,i_cs,i_ds,i_qs,dt,t;
float i_arfa,i_beta,thita;
FILE *fp;
fp = fopen("D:/work/result1.txt", "w+");
for(i=1;i<=2000;i=i+1)
{
dt = 0.0001;
t = t+dt;
We = 2.0*3.14159*60.0; //2*pi*f f假設60hz
i_as = 1.0*cos(We*t);
i_bs = 1.0*cos(We*t-2*3.14159/3.0);
i_cs = 1.0*cos(We*t-4*3.14159/3.0);
// clark tran.
i_arfa = i_as;
i_beta = (1.0/1.732)*i_as+(2.0/1.732)*i_bs;
// Park tran.
thita = We*t; //thita 先用60hz假設一下
i_ds = (cos(thita)) * (i_arfa) + (sin(thita)) * (i_beta);
i_qs = (-1.0*sin(thita))* (i_arfa) + (cos(thita)) * (i_beta);
fprintf(fp,"%5.5f , %5.5f, \n",i_ds,i_qs);
printf("%5.5f , %5.5f , \n",i_ds,i_qs);
}
fclose(fp);
system("pause");
return 0;
}
************************************************************************************************************************************
此時compiler 成功後,數據應該也會拷貝到txt檔案 ,再把數據用excel化成圖形,如下圖所示,
這時候三相交流就會變成直流量,這時候才能實現用PI控制,
否則sinwave 也沒辦法用PI控制。 例如 你想控制在10 結果回饋量給你直上直下的,要怎們控制??
以上是用C語言實現Park和Clarke的轉換, 當然FOC還有其他的系統方塊 例如SVM
SVM簡單說一句 是為了增加電壓利用率,這就是另一個主題了。有機會我也會用簡單的C語言實現SVM。
當然在實作上Park和Clarke轉換不會像我這樣打幾行就結束了,以上只是希望讀者能對Park和Clarke更有感覺一點。