Prius IPM controller

Dependencies:   mbed

Fork of analoghalls5_5 by N K

meta/modulators.cpp

Committer:
nki
Date:
2015-03-09
Revision:
17:d754b71a1290
Parent:
14:1cc975207995
Child:
19:280c62c71cf8

File content as of revision 17:d754b71a1290:

#include "includes.h"
#include "core.h"
#include "meta.h"
#include "fastmath.h"
#include "transforms.h"

void SinusoidalModulator::Update(float valpha, float vbeta) {
    
    //swapping valpha and vbeta for reasons documented in CalcRef.s here: http://ww1.microchip.com/downloads/jp/AppNotes/ACIM%20Vector%20Control%2000908a.pdf
    float vra = vbeta;
    float vrb = ((-vbeta + sqrt(3.0f)*valpha)/2.0f);
    float vrc = ((-vbeta - sqrt(3.0f)*valpha)/2.0f);
    
    float dtcA;
    float dtcB;
    float dtcC;
    
    if( vra >= 0 ){  // (xx1)
        if( vrb >= 0 ){ // (x11) 
            // Must be Sector 3 since Sector 7 not allowed
            // Sector 3: (0,1,1) 0-60 degrees
            T1 = vrb;
            T2 = vra;
        }
        else{  // (x01)
            if( vrc >= 0 ){  // Sector 5: (1,0,1) 120-180 degrees
            T1 = vra;
            T2 = vrc;
            }
            else{// Sector 1: (0,0,1) 60-120 degrees
            T1 = -vrb;
            T2 = -vrc;
            }
        }
    }
    else{ // (xx0)
        if( Vrb >= 0 ){ // (x10)
            if( Vrc >= 0 ){ // Sector 6: (1,1,0) 240-300 degrees
            T1 = vrc;
            T2 = vrb;
            }
            else{// Sector 2: (0,1,0) 300-0 degrees
            T1 = -vrc;
            T2 = -vra;
            }
        }
        else{ // (x00)
            // Must be Sector 4 since Sector 0 not allowed
            // Sector 4: (1,0,0) 180-240 degrees
            T1 = -vra;
            T2 = -vrb;
            }
        }
    }
    
    dtcA = (1.0f-T1-T2)/2.0f
    dtcB = dtcA + T1
    dtcC = dtcB + T2
    
    //--hack to make duty cycles positive
  
    _inverter->SetDtcA(dtcA * 0.5f + 0.5f);
    _inverter->SetDtcB(dtcB * 0.5f + 0.5f);
    _inverter->SetDtcC(dtcC * 0.5f + 0.5f);
}

void SvmModulator::Update(float valpha, float vbeta) {
    float va, vb, vc;
    InverseClarke(valpha, vbeta, &va, &vb);
    vc = -(va + vb);
}