//*****************************************************************************
// t@C      ClaCode.cla
// Ώۃ}CR    TI C2000
// ̧ٓe        CLAōstB[hobN
//*****************************************************************************
//======================================
//include
//======================================
#include 	"DSP28x_Project.h"
#include	"DigitalPower.h"

//======================================
//萔̒`
//======================================
//PWMW[ CMPAl 60MHz/PWMg100[kHz]=600
#define ClaCMPA	600

//Type-3⏞W CV,CC
#define a1	1.257873708494
#define a2  -0.264633152863
#define a3  0.006759444370
#define b0  1.062196736738
#define b1  -0.783617871698
#define b2  -1.045727879254
#define b3  0.800086729181

//pQC
#define P_Gain 0.001

//f[eB[l
#define DutyMax 1.0
#define DutyMin 0.0

//Type-3⏞ϐl
#define Type3RegMax 20.0

//======================================
//O[oϐ
//======================================
//CPU to CLA RAM
extern CPUCLARAM CPUtoCLARAM;
//CLA to CPU RAM
extern CLACPURAM CLAtoCPURAM;

//IIRtB^p
float xn_v;		//
float yn_v;		//o
float un_v;     //͉Z_
float un1_v;    //u[n-1]
float un2_v;    //u[n-2]
float un3_v;    //u[n-3]

float xn_i;     //͍l
float yn_i;     //o͍l
float un_i;     //͉Z_
float un1_i;    //u[n-1]
float un2_i;    //u[n-2]
float un3_i;    //u[n-3]

//*****************************************************************************
// CLA荞1
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task1( void ){

    //**************************************
    //XCb`OdCV tB[hobN
    //**************************************
    //΍擾
    xn_v = (CPUtoCLARAM.VSet - AdcResult.ADCRESULT4) * P_Gain;

    //Type-3⏞
    un_v = xn_v +      a1 * un1_v + a2 * un2_v + a3 * un3_v;
    yn_v = b0 * un_v + b1 * un1_v + b2 * un2_v + b3 * un3_v;
    un2_v >= Type3RegMax ? (un3_v = Type3RegMax) : (un3_v = un2_v);
    un1_v >= Type3RegMax ? (un2_v = Type3RegMax) : (un2_v = un1_v);
    un_v  >= Type3RegMax ? (un1_v = Type3RegMax) : (un1_v = un_v);

    //Oa
    if(yn_v > DutyMax) yn_v = DutyMax;
    if(yn_v < DutyMin) yn_v = DutyMin;

    //**************************************
    //XCb`OdCC tB[hobN
    //**************************************
    //΍擾
    xn_i = (CPUtoCLARAM.ISet - AdcResult.ADCRESULT3) * P_Gain;

    //Type-3⏞
    un_i = xn_i +      a1 * un1_i + a2 * un2_i + a3 * un3_i;
    yn_i = b0 * un_i + b1 * un1_i + b2 * un2_i + b3 * un3_i;
    un2_i >= Type3RegMax ? (un3_i = Type3RegMax) : (un3_i = un2_i);
    un1_i >= Type3RegMax ? (un2_i = Type3RegMax) : (un2_i = un1_i);
    un_i  >= Type3RegMax ? (un1_i = Type3RegMax) : (un1_i = un_i);

    //Oa
    if(yn_i > DutyMax) yn_i = DutyMax;
    if(yn_i < DutyMin) yn_i = DutyMin;

    //**************************************
    //PWMXV
    //**************************************
    if(yn_i > yn_v){
        //CV
        EPwm1Regs.CMPA.all = (unsigned long)(65536.0 * ((float)ClaCMPA * yn_v));
    }
    else{
        //CC
        EPwm1Regs.CMPA.all = (unsigned long)(65536.0 * ((float)ClaCMPA * yn_i));
    }

	return;
}

//*****************************************************************************
// CLA荞2 (O[oϐ̏)
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task2( void ){
	return;
}

//*****************************************************************************
// CLA荞3
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task3( void ){

}

//*****************************************************************************
// CLA荞4
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task4( void ){

}

//*****************************************************************************
// CLA荞5
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task5( void ){

}

//*****************************************************************************
// CLA荞6
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task6( void ){

}

//*****************************************************************************
// CLA荞7
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task7( void ){

}

//*****************************************************************************
// CLA荞8
//  Ȃ
// ߂l Ȃ
//*****************************************************************************
interrupt void Cla1Task8( void ){
    un_v = 0;
    un1_v = 0;
    un2_v = 0;
    un3_v = 0;

    un_i = 0;
    un1_i = 0;
    un2_i = 0;
    un3_i = 0;
}

//*****************************************************************************
// I
//*****************************************************************************
