User Tools

Site Tools

blog:2024-04-30_share_foc演算法的簡介v2.0.2



2024-04-30 Share: FOC演算法的簡介v2.0.2

Local Backup

FOC演算法的簡介v2.0.2

  • Field oriented control (FOC) 演算法的主要任務是基於使用者定義的電壓u q,透過連續讀取馬達轉子位置a,計算出適當的相電壓u a , u b和u c。
  • FOC演算法在馬達轉子中產生磁場的相位電壓,該磁場正好在轉子的永久磁鐵的磁場後面90度,創造了一個推動效應。這是一個很好的動畫表示,當運行簡化版的FOC即六步調製時,馬達內部發生了什麼。
  • 另一種理解為什麼我們需要在轉子和定子磁場之間形成90度角的方法是記住導線穿過磁場時產生的電場的方程式:
    • F = B*I*L*sin(alpha)
    • 其中B是磁場的強度,L是導電流的大小,alpha是磁場B和電流,I之間的角度。從這個方程中我們可以看到,為了得到最大的力F = B*I*L,我們需要保持alpha角等於90度或PI/2弧度。

如何計算u a,u b和u c的適當電壓值

  • 由於Simple FOC library 的目的是關於FOC演算法的知識以及支援各種應用,兩個最標準的FOC調變版本在這個函式庫中實作。
    • 正弦PWM:SinePWM
    • 空間向量PWM:SpaceVectorPWM
  • 可以透過設定motor.foc_modulation的變數值進行設定:
  • motor.foc_modulation = FOCModulationType::SinePWM; // default
    // or
    motor.foc_modulation = FOCModulationType::SpaceVectorPWM;

正弦調製SinePWM

  • 正弦調變法是基於兩個變換方程式。
  • 逆派克變換法:
  • 逆克拉克變換法:
  • 以下是在中實作正弦PWM的程式碼:
    // 使用FOC将Uq设置到电机的最佳角度
    void BLDCMotor::setPhaseVoltage(float Uq, float angle_el) {
        // 正弦PWM调制 
        // 逆派克+克拉克变换
    
        // 角度在0和360°之间的归一化
        // 仅当使用_sin和_cos近似函数时才需要
        angle_el = normalizeAngle(angle_el + zero_electric_angle);
        // 逆派克变换
        Ualpha =  -_sin(angle_el) * Uq;  // -sin(angle) * Uq;
        Ubeta =  _cos(angle_el) * Uq;    //  cos(angle) * Uq;
    
        // 你克拉克变换
        Ua = Ualpha + voltage_power_supply/2;
        Ub = -0.5 * Ualpha  + _SQRT3_2 * Ubeta + voltage_power_supply/2;
        Uc = -0.5 * Ualpha - _SQRT3_2 * Ubeta + voltage_power_supply/2;
    
        // 给硬件设定电压
        setPwm(Ua, Ub, Uc);
    }

空間向量調製SpaceVectorPWM

  • 空間向量調變基於兩個步驟的計算:
  • 在第一步,我們發現扇區s轉子目前在。 360度的角被分成6等份的60度。這個計算很簡單。然後我們計算時間T 0 , T 1和T 2。T 1和T 2告訴我們第一階段和第二階段應該開多久,T 0告訴我們馬達上0電壓應該開多久。
  • 第二步是將T 0,1,2值投影到適當的佔空比T a,b,c,這些佔空比直接取決於馬達目前所在的磁區。
Sector T a T b T c
1 T 1 + T 2 + T 0 /2 T 2 + T 0 /2 T 0 /2
2 T 1 + T 0 /2 T 1 + T 2 + T 0 /2 T 0 /2
3 T 0 /2 T 1 + T 2 + T 0 /2 T 2 + T 0 /2
4 T 0 /2 T 1 + T 0 /2 T 1 + T 2 + T 0 /2
5 T 2 + T 0 /2 T 0 /2 T 1 + T 2 + T 0 /2
6 T 1 + T 2 + T 0 /2 T 0 /2 T 1 + T 0 /2
  • 以下是一個例子使用SVM表產生pwm訊號的參數: s = 2 , T 1 = 1/8 = 0.125 , T 2 = 1/8 = 0.125 and T 0 = 1/2 = 0.5
  • 這裡是空間向量PWM實現的程式碼在Simple FOC library :
  • // 使用FOC将Uq设置到电机的最佳角度
    void BLDCMotor::setPhaseVoltage(float Uq, float angle_el) {
        // 解释SpaceVectorModulation (SVPWM)算法的视频如下
        // https://www.youtube.com/watch?v=QMSWUMEAejg
    
        // 如果负电压的变化与相相反
        // 角度 +180°
        if(Uq < 0) angle_el += _PI;
        Uq = abs(Uq);
    
        // 角度归一化,在0和360°之间
        // 仅当使用_sin和_cos近似函数时才需要
        angle_el = normalizeAngle(angle_el + zero_electric_angle + _PI_2);
    
        // 找到我们目前所在的象限
        int sector = floor(angle_el / _PI_3) + 1;
        // 计算占空比
        float T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uq/voltage_power_supply;
        float T2 = _SQRT3*_sin(angle_el - (sector-1.0)*_PI_3) * Uq/voltage_power_supply;
        // 两个版本 
        // 以电压电源为中心/2
          float T0 = 1 - T1 - T2;
        // 低电源电压,拉到0
        //float T0 = 0;
    
        // 计算占空比(时间)
        float Ta,Tb,Tc; 
        switch(sector){
        case 1:
            Ta = T1 + T2 + T0/2;
            Tb = T2 + T0/2;
            Tc = T0/2;
            break;
        case 2:
            Ta = T1 +  T0/2;
            Tb = T1 + T2 + T0/2;
            Tc = T0/2;
            break;
        case 3:
            Ta = T0/2;
            Tb = T1 + T2 + T0/2;
            Tc = T2 + T0/2;
            break;
        case 4:
            Ta = T0/2;
            Tb = T1+ T0/2;
            Tc = T1 + T2 + T0/2;
            break;
        case 5:
            Ta = T2 + T0/2;
            Tb = T0/2;
            Tc = T1 + T2 + T0/2;
            break;
        case 6:
            Ta = T1 + T2 + T0/2;
            Tb = T0/2;
            Tc = T1 + T0/2;
            break;
        default:
             // 可能的错误状态
              Ta = 0;
              Tb = 0;
              Tc = 0;
          }
    
          // 计算相电压和中心
          Ua = Ta*voltage_power_supply;
          Ub = Tb*voltage_power_supply;
          Uc = Tc*voltage_power_supply;
          break;
      }
      
      // 设置硬件中的电压
      setPwm(Ua, Ub, Uc);
    }

我們應如何選擇?

  • 這是由U q = 0.5V的正弦和空間向量調變產生的波形影像:

  • Sinusoidal Space Vector
  • 這兩種演算法之間有幾個關鍵的差異。但就Simple FOC library而言,你需要知道的就是空間向量演算法更好地使用了電源的最大電壓範圍。在上面的表格中,你可以看到,對於U q = 0.5V,正弦調製產生的正弦波的幅度正好等於1,空間向量調製還不是平靜的。由空間向量產生的「雙正弦波」的振幅為2/sqrt(3) = 1.15,這意味著在使用相同的電源時,它可以向馬達多輸出15%的功率。
  • 這意味著,當使用SinePWM時,你的供電電壓V power_supply可以設定最大為U q = 0.5 V power_supply 。如果使用SpaceVectorPWM,你將可以設定U q = 0.58 V power_supply
  • 你應該透過改變馬達參數motor.voltage_power_supply的值來指定電源電壓V power_supply。預設值為12V。如果你需要設定你的V power_supply為其他值,在這裡更改它,FOC演算法將據此調整適當的U q ( motor.voltage_q)值。
  • // 电源电压
    motor.voltage_power_supply = 12;
  • 如果我不指定這個參數呢?
    • 如果你沒有指定motor.voltage_power_supply演算法仍然有效,但你motor.voltage_q的值將不再等於實際輸出電壓。

當我超過最大值U q時會發生什麼?

  • 如果你試著把電壓U q高於U q = 0.5 V power_supply 給SinePWM或U q = 0.58 V power_supply給SpaceVectorPWM,它仍然會工作,但U a,b,c訊號會飽和。
  • 這裡有一些SinePWM的不同U q值的圖像。

  • U q = 0.5 V power_supply U q = 0.6 V power_supply U q = V power_supply
  • 基本上你可以在影像上看到的是U a,b,c是飽和的,在你超過最大值後,你其實不再設定正弦波到你的馬達。馬達的功率仍在增加,但不再是直線或平滑的。
  • 經驗法則
    • 在現實中,馬達可以看到的差異一直到U q ~ 0.7 V power_supply 。在此值之後,U a,b,c過於飽和,U q的進一步增加不會導致馬達功率的增加。但是每一個馬達都有點不同,你可以很容易地根據經驗檢查這些值。將馬達置於電壓控制中,查看電壓* U q *後,馬達功率將不再有改善(它將停止加速)。

TAGS

  • 30 person(s) visited this page until now.

Permalink blog/2024-04-30_share_foc演算法的簡介v2.0.2.txt · Last modified: 2024/04/30 11:09 by jethro

oeffentlich