/**************************************************************************
	Description: Всякие разные переключатели и уставки.

	Автор: Улитовский Д.И.
	Дата последнего обновления: 2021.11.08
**************************************************************************/

#ifndef DEF
#define DEF

// раскомментировать, если есть сдвиг между обмотками ГЭД (30 град.)
#define SHIFT

#define SIMULINK_SEQUENCE	V_PWM24_PHASE_SEQ_NORMAL_BCA
/*		V_PWM24_PHASE_SEQ_NORMAL_ABC, - не то
        V_PWM24_PHASE_SEQ_NORMAL_BCA, - похоже на правду
        V_PWM24_PHASE_SEQ_NORMAL_CAB, - жопа
        V_PWM24_PHASE_SEQ_REVERS_ACB, - жопа
        V_PWM24_PHASE_SEQ_REVERS_CBA, - жопа
        V_PWM24_PHASE_SEQ_REVERS_BAC  - жопа
		*/

// режимы работы (для state)
#define	STATE_SHUTDOWN	0 //аварийная остановка
#define	STATE_STOP		1 //штатная остановка
#define	STATE_WORK		2 //работа


// частота тактовых импульсов процессора, Гц
#define FSYSCLKOUT	200e6 //150e6 //
// prescaled version of the system clock and is used by
// all submodules within the ePWM, Гц
// (см. EPwmxRegs.TBCTL.bit.CLKDIV и EPwmxRegs.TBCTL.bit.HSPCLKDIV)
#define FTBCLK		(FSYSCLKOUT*0.5*0.5)
//#define FTBCLK		(FSYSCLKOUT*0.5*0.5*0.5*0.5)
// период ШИМ, c
#define T_PWM		2220e-6 //F_PWM = 450 Гц
//#define T_PWM		6000e-6 //F_PWM = 166.7 Гц
// период вызова основной программы, с
#define TY			(T_PWM*0.5)
// "мертвое время", с
#define DT			30e-6
//#define DT			60e-6
// Time-Base Period Register, ед. счётчика таймера
#define T1_PRD		(FTBCLK*T_PWM*0.5)
// максимальное значение амплитуды напряжения управления устанавливаем так,
// чтобы минимальная ширина импульса была 10 мкс, ед. счётчика таймера
#define Y_LIM		(T1_PRD - (DT + 10e-6)*FTBCLK)


// константы для вычисления всякого
#define PI2			6.283185307179586476925286766559	//pi*2
#define SQRT2		1.4142135623730950488016887242097	//sqrt(2)
#define SQRT3		1.7320508075688772935274463415059	//sqrt(3)
#define ISQRT3		0.57735026918962576450914878050196	//1./sqrt(3)

// Номинальные величины ГЭД
// ... мощность на валу, Вт
#define P_NOM		(6300e3.)
// ... линейное напряжение, В (ampl)
#define U_NOM		(3300.*SQRT2)
// ... механическая скорость, об/мин
#define N_NOM		180.
// ... число пар полюсов
#define PP			6.
// ... коэффициент мощности
#define COS_FI		0.89
// ... КПД
#define EFF			0.968
// ... приведенный к валу момент инерции, кг*м^2
#define J			(87e3*0.50)
// ... полная мощность, ВА
#define S_NOM		(P_NOM/(COS_FI*EFF))
// ... механическая скорость, рад/с
#define WM_NOM		(N_NOM/60.*PI2)
// ... момент на валу, Н*м
#define M_NOM		(P_NOM/WM_NOM)


// Базовые величины ГЭД
// ... полная мощность, BA
#define S_BAZ		S_NOM
// ... линейное напряжение, В (ampl)
#define U_BAZ		U_NOM
// ... фазный ток, А (ampl)
#define I_BAZ		(S_BAZ*2./(U_BAZ*SQRT3)*0.5) //0.5 - т.к. обмоток две
// ... механическая скорость, об/мин
#define N_BAZ		N_NOM
// ... механическая скорость, рад/с
#define WM_BAZ		(N_BAZ/60.*PI2)
// ... электрическая скорость, рад/с
#define WE_BAZ		(WM_BAZ*PP)
// ... момент на валу, Н*м
#define M_BAZ		(S_BAZ/WM_BAZ)
// ... потокосцепление статора, Вб
#define PSI_BAZ		(U_BAZ/(WE_BAZ*SQRT3))
// ... индуктивность, Гн
#define L_BAZ		(PSI_BAZ/I_BAZ)
// ... сопротивление, Ом
#define R_BAZ		(U_BAZ/(I_BAZ*SQRT3))


// для пересчёта из амплитуды фазного напряжения в единицы сигнала управления
#define U_2_Y	(T1_PRD*SQRT3/U_BAZ)

// напряжение в звене пост. тока, которое дало бы на выходе АЦП знач. 2048, В
#define UDC_SENS_MAX	(U_BAZ*1.15*1.3)
// выходной ток, который дал бы на выходе АЦП знач. 2048, А (ampl)
#define IAC_SENS_MAX	(I_BAZ*1.5)
// number of pulses per rev. (from tacho, Hall, optical sensor...etc)
#define NOP				1024.
// приращение счётчика QEP за TY сек. при частоте вращ. WM_BAZ
#define QEP_CNT_DEL_NOM	(NOP*4.*TY*WM_BAZ/PI2)


// коэффициенты для перевода измеренных величин в o.e.
#define GAIN_UDC		(UDC_SENS_MAX/(2048.*U_BAZ))
#define GAIN_IAC		(IAC_SENS_MAX/(2048.*I_BAZ))
#define GAIN_WM			(1.0/QEP_CNT_DEL_NOM)


// минимальная скорость для пересчёта мощности в ток, o.e.
#define WM_MIN				0.03 //0.003 //?
// для прореживания регуляторов потока, скорости и мощности
#define DECIM_PSI_WM_PM		2. //1. //5. //?


// for specify the PLL
#define PLLSTS_DIVSEL	2
#define PLLCR_DIV		10

// для вывода
#define	CONTROLLER_BIAS		3.2
#define	CONTROLLER_GAIN		2500.

// общее количество параметров 
#define PAR_NUMBER				400
// номер первого редактируемого параметра
#define FIRST_WRITE_PAR_NUM		150



// Дискретные входы/выходы (begin)
//-------------------------------------------------------------------------
// входы
// ----------------------------
#define DI_24V_SOURCE_FAULT		GpioDataRegs.GPBDAT.bit.GPIO50

// выходы
// ----------------------------
// ... разное
#define DO_GPIO00_SET			GpioDataRegs.GPASET.bit.GPIO0 = 1
#define DO_GPIO00_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO0 = 1
#define DO_GPIO01_SET			GpioDataRegs.GPASET.bit.GPIO1 = 1
#define DO_GPIO01_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO1 = 1
#define DO_GPIO02_SET			GpioDataRegs.GPASET.bit.GPIO2 = 1
#define DO_GPIO02_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO2 = 1
#define DO_GPIO03_SET			GpioDataRegs.GPASET.bit.GPIO3 = 1
#define DO_GPIO03_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO3 = 1
#define DO_GPIO04_SET			GpioDataRegs.GPASET.bit.GPIO4 = 1
#define DO_GPIO04_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO4 = 1
#define DO_GPIO05_SET			GpioDataRegs.GPASET.bit.GPIO5 = 1
#define DO_GPIO05_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO5 = 1
#define DO_GPIO06_SET			GpioDataRegs.GPASET.bit.GPIO6 = 1
#define DO_GPIO06_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO6 = 1
#define DO_GPIO07_SET			GpioDataRegs.GPASET.bit.GPIO7 = 1
#define DO_GPIO07_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO7 = 1
#define DO_GPIO08_SET			GpioDataRegs.GPASET.bit.GPIO8 = 1
#define DO_GPIO08_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO8 = 1
#define DO_GPIO09_SET			GpioDataRegs.GPASET.bit.GPIO9 = 1
#define DO_GPIO09_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO9 = 1
#define DO_GPIO10_SET			GpioDataRegs.GPASET.bit.GPIO10 = 1
#define DO_GPIO10_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO10 = 1
#define DO_GPIO11_SET			GpioDataRegs.GPASET.bit.GPIO11 = 1
#define DO_GPIO11_CLEAR			GpioDataRegs.GPACLEAR.bit.GPIO11 = 1
// ... не используются
#define DO_GPIO019_SET			GpioDataRegs.GPASET.bit.GPIO19 = 1
#define DO_GPIO019_CLEAR		GpioDataRegs.GPACLEAR.bit.GPIO19 = 1
#define DO_GPIO020_SET			GpioDataRegs.GPASET.bit.GPIO20 = 1
#define DO_GPIO020_CLEAR		GpioDataRegs.GPACLEAR.bit.GPIO20 = 1
#define DO_GPIO022_SET			GpioDataRegs.GPASET.bit.GPIO22 = 1
#define DO_GPIO022_CLEAR		GpioDataRegs.GPACLEAR.bit.GPIO22 = 1
#define DO_GPIO48_SET			GpioDataRegs.GPBSET.bit.GPIO48 = 1
#define DO_GPIO48_CLEAR			GpioDataRegs.GPBCLEAR.bit.GPIO48 = 1
#define DO_GPIO49_SET			GpioDataRegs.GPBSET.bit.GPIO49 = 1
#define DO_GPIO49_CLEAR			GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1
// ... для управления ножкой CS EEPROM
#define CS_SET					GpioDataRegs.GPBSET.bit.GPIO57 = 1
#define CS_CLEAR				GpioDataRegs.GPBCLEAR.bit.GPIO57 = 1
// ... светодиоды
// (зелёный "Готовность")
#define LED_GREEN1_ON			GpioDataRegs.GPBCLEAR.bit.GPIO59 = 1
#define LED_GREEN1_OFF			GpioDataRegs.GPBSET.bit.GPIO59 = 1
#define LED_GREEN1_TOGGLE		GpioDataRegs.GPBTOGGLE.bit.GPIO59 = 1
// (зелёный "Работа")
#define LED_GREEN2_ON			GpioDataRegs.GPBCLEAR.bit.GPIO60 = 1
#define LED_GREEN2_OFF			GpioDataRegs.GPBSET.bit.GPIO60 = 1
#define LED_GREEN2_TOGGLE		GpioDataRegs.GPBTOGGLE.bit.GPIO60 = 1
// (красный "Авария")
#define LED_RED_ON				GpioDataRegs.GPBCLEAR.bit.GPIO61 = 1
#define LED_RED_OFF				GpioDataRegs.GPBSET.bit.GPIO61 = 1
#define LED_RED_TOGGLE			GpioDataRegs.GPBTOGGLE.bit.GPIO61 = 1
// ... не используется
#define DO_GPIO63_SET			GpioDataRegs.GPBSET.bit.GPIO63 = 1
#define DO_GPIO63_CLEAR			GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1
//-------------------------------------------------------------------------
// Дискретные входы/выходы (end)


#include "DSP2833x_Device.h"
#include "math.h"
#include "C28x_FPU_FastRTS.h"


// структура для регуляторов тока (см. control_current())
struct Cc {
	short once;
	float KpOrig;
	float KiOrig;
	float Kp;
	float Ki;
	float K1;
	float K2;
	float K3;
	float Xyff;
	float yffAux2;
	float yffAux3;
	float del;
	float kYlim;
	float yd1P;
	float yd1I;
	float yd1FF;
	float yd1;
	float yq1P;
	float yq1I;
	float yq1FF;
	float yq1;
	float y1;
	float yd2P;
	float yd2I;
	float yd2FF;
	float yd2;
	float yq2P;
	float yq2I;
	float yq2FF;
	float yq2;
	float y2;
	short y1LimFlag;
	short y2LimFlag;
}; //Cc


// структура для регулятора потока (см. control_flux())
struct Cf {
	short once;
	float KpOrig;
	float KiOrig;
	float Kp;
	float Ki;
	float IdLim;
	float IdLimNeg;
	float del;
	float idP;
	float idI;
	float idFF;
	short idLimFlag;
}; //Cf


// структура для регуляторов скорости и мощности (см. control_speed_power())
struct Csp {
	short once;
	float KpOrig;
	float KiOrig;
	float Kp;
	float Ki;
	float kMeNom;
	float del;
	float iqP;
	float iqI;
	float iqFF;
	float IlimIncr;
	float iqLimAux;
	float iqLimZi;
	float IqLim;
	float IqLimNeg;
	float iqLim;
	float iqLimNeg;
	float delWmAbs;
	float KizIncr;
	float pmZiRampDown;
	float wmLimZi;
	float pmLimZi;
	short iqLimFlag;
}; //Csp


// структура для записи в EEPROM всякого
struct Eprom {
	short writeRequestNumber;
	short readFaultNo;
}; //Eprom


// структура для запоминания величин в момент срабатывания защиты
struct Emerg {
	float udc1;
	float udc2;
	float iac1;
	float iac2;
	float me;
	float wm;
	float pm;
}; //Emerg


// структура для inverse park (см. ipark())
struct Ip {
	float yx1Aux;
	float yy1Aux;
	float yx2Aux;
	float yy2Aux;
	float theta;
	float sinTheta;
	float cosTheta;
	float yx1;
	float yy1;
	float yx2;
	float yy2;
}; //Ip


// структура для indirect vector control (см. indirect_vector_control())
struct Ivc {
	short once;
	float im;
	float wr;
	float wsNf;
	float ws;
	float sinTheta;
	float cosTheta;
	float id1;
	float iq1;
	float psi;
	float id2;
	float iq2;
}; //Ivc


// структура для данных, полученных с ВУ
struct Mst {
	short pzMode;
	short faultReset;
	short start;
	float wmZz;
	float pmZz;
	float wmLim;
	float pmLim;
	float pIncrMaxTy;
	float pDecrMaxTy;
}; //Mst


// структура для смещений нуля датчиков
struct Offset {
	short Udc1;
	short Udc2;
	short Ic1;
	short Ic2;
	short Ia1;
	short Ia2;
	short Ib1;
	short Ib2;
}; //Offset


// структура для вывода
struct Out {
	float K;
	float udc1;
	float udc2;
	float iac1;
	float iac2;
	float me;
	float wm;
	float pm;
}; //Out


// структура для защит
struct Protect {
	short IacMax;
	short IacMin;
	unsigned short Tdi24VSource;
	volatile unsigned short tDI24VSource;
	unsigned short TudcMin;
	volatile unsigned short tUdc1Min;
	volatile unsigned short tUdc2Min;
	unsigned short TwmMax;
	volatile unsigned short tWmMax;
	float UdcMin;
	float UdcMax;
	float WmMax;
}; //Protect


// структура для результатов АЦП
struct Result {
	short udc1;
	short udc2;
	short ic1;
	short ic2;
	short ia1;
	short ia2;
	short ib1;
	short ib2;
}; //Result


// структура для заданного потока (см. reference_flux())
struct Rf {
	short once;
	float PsiZ;
	float PsizIncr;
	float psiZi;
	float psiZCorr;
	float psiSub;
	float psiZCorr2;
	float psiZ;
	float KpsiSub;
	float Kpsiz;
	float WmNomPsi;
	float YlimPsi;
	float pPsiZ;
	float psiZPrev1;
	float psiZPrev2;
	float psiZPrev3;
}; //Rf


// структура для заданной мощности (см. reference_power())
struct Rp {
	short once;
	float pmZz;
	float pmZi;
	float pmZ;
	float Kpmz;
	float PlimIncr;
	float KpIncrDecr;
	volatile float pmEqv;
}; //Rp


// структура для заданной скорости (см. reference_speed())
struct Rs {
	short once;
	float wmZz;
	float wmZi;
	float wmZ;
	float Kwmz;
	float WlimIncr;
	float wzIncrNf;
	float wzIncr;
	float pWmZ;
	float wmZPrev1;
	float wmZPrev2;
	float wmZPrev3;
	short tPwmZ;
}; //Rs


// структура для параметров ГЭД
struct SgmPar {
	float Rs;
	float Lls;
	float Rr;
	float Llr;
	float Lm;
	float Ls;
	float Lr;
	float SigmaLs;
	float LmInv;
	float LrInv;
	float Tr;
	float TrInv;
	float Kl;
	float KlInv;
}; //SgmPar

#endif //DEF
