下圖是FOC(磁場向量控制)中非常經典的系統控制圖,我相信很多人都會被系統圖中的PARK、CLARKE座標變換嚇到了,

說實話如果只是把座標變換當成工具來使用的話,真的也沒那們難理解,

當然如果你是學生的話可能會想推導公式,但是在工程應用推導複雜公式對產品的開發意義不大。

 

image

說穿了PARK、CLARKE只是一些公式而已如下圖所示

下面公式告訴我們三項交流的ia、ib 、 ic 透過PARK、CLARKE變換,會變成直流id 、iq

 

image

image

 

接下來我們用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波形。

 

image

 

 

再來就是將三相交流用轉換成 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 結果回饋量給你直上直下的,要怎們控制??

 

image

 

 

以上是用C語言實現Park和Clarke的轉換, 當然FOC還有其他的系統方塊  例如SVM

SVM簡單說一句 是為了增加電壓利用率,這就是另一個主題了。有機會我也會用簡單的C語言實現SVM。

當然在實作上Park和Clarke轉換不會像我這樣打幾行就結束了,以上只是希望讀者能對Park和Clarke更有感覺一點。

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小影 的頭像
    小影

    工作經驗筆記

    小影 發表在 痞客邦 留言(0) 人氣()