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

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

#ifndef DEF
#define DEF

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

#define SIMULINK_SEQUENCE	V_PWM24_PHASE_SEQ_REVERS_BAC
/*		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"

#endif //DEF
