/* =================================================================================
File name:       CUR_LOOP.H  (IQ version)
                    
Originator:	Digital Control Systems Group
			Texas Instruments

Description: 
Header file containing constants, data type definitions, and 
function prototypes for the CURDQ.
=====================================================================================
 History:
-------------------------------------------------------------------------------------
 03-13-2019	Version 2.01
------------------------------------------------------------------------------*/
#ifndef __CURDQ_H__
#define __CURDQ_H__


typedef struct{
	_iq			Is_ref;					// Input: 外部电流给定
	_iq			I_back;					// Input: 外部电流检测反馈
	_iq 		Is_ud_next;				// Input: 下溢中断预测下一个的下溢中断电流设定预测值
	_iq 		IM_pd_befor;			// Input: 下溢中断计算电压反馈值时用到的上一个的周期中断电流反馈值
	_iq 		IM_ud;					// Input: 下溢中断采样到的电流反馈值
	_iq 		Vud_pd;					// Input: 下溢中断时需要的下溢到周期的电压平均值，即上一个周期中断时刻的电压预测计算值
	_iq			VC_ud;					// Output: 下溢中断时刻计算全周期电压平均计算值
	_iq 		Vpd_ud_next;			// Output: 下溢中断算出下一个下溢到此次周期的电压平均值，也是下溢中断更新的vDQ值
	_iq 		Vpd_ud_next_before;		// inner: 下溢中断计算电压反馈需要前0.25T的电压值，即前一个周期Vpd_ud_next
	_iq 		Eud;					// Output: 下溢中断时刻估算的反电动势平均值,即为-0.25T时刻值
	_iq 		Vfdb_ud;				// Output: 下溢中断时刻估算的全周期内的电压平均值（根据反馈电流的变化计算），为-0.25T时刻值
	_iq  		Is_pd_next;				// Input:周期中断预测下一个周期中断的电流设定预测值
	_iq  		IM_ud_next;				// Input:周期中断预测下一个下溢中断时刻的电流反馈值				_iq  Is_ud_next;	// Variable:周期中断预测下一个的下溢中断电流设定预测值
	_iq  		Idelta;					// inner:周期中断预测下一个下溢中断时刻的电流反馈值时用的补偿量
	_iq  		IM_pd;					// Input:周期中断采样到的电流反馈值:
	_iq  		Is_pd;					// Input:周期中断时刻电流设定值
	_iq 		VC_pd;					// Output: 周期中断计算的电压值，更新PWM影子寄存器，于下一下溢中断更新比较器值。
	_iq 		VC_pd_before;			// inner: 周期中断计算的电压反馈值需要的0.25T时刻的电压给定值
	_iq 		Epd;					// Output: 周期中断时刻估算的下一个下溢到下一个周期时刻之间的反电动势平均值
	_iq 		Vfdb_pd;				// inner: 周期中断时刻估算的下一个下溢到下一个周期时刻之间（根据反馈电流的变化计算)
	_iq 		E;						// Output: new Back EMF
	_iq 		E1;						// Output: Back EMF after first filter
	_iq 		E2;						// Output: Back EMF after second filter
	_iq			E3;						// Output: Back EMF after commp
	_iq 		Vout;					// Output: 电压输出
} CUR_VAR;



typedef struct {  CUR_VAR  D;   		// struct: D shaft
				  CUR_VAR  Q;   		// struct: Q shaft
				  Uint16   ISR_flag;    // 中断和AD标志
				  Uint16   Vsat_flag;	// 电压饱和标志
				  _iq	   dleta_coef;	// 补偿系数
				  Uint16   Vfdb_select; //
				  float32  Rs;			// Variable: Motor Resistance
				  float32  LDs;			// Variable: Motor Inductance
				  float32  LQs;			// Variable: Motor Inductance
				  float32  LRs;			// Variable: Motor Inductance
				  float32  LDTs;
				  float32  LQTs;
				  float32  Ib; 			// Input: Base phase current (amp)
				  float32  Vb;			// Input: Base phase voltage (volt)
				  float32  Ts;			// Input: Sampling period in sec
				  float32  Theta;		// Output:
				  float32  Efliter_K2;	// Parameter: Constant for low-pass filter (pu) for E
				  float32  Efliter_K3;  // Parameter: Constant for low-pass filter (pu) for E
				  _iq  A;				// Input: 反电动势滤波增益补偿
				  _iq  thetacomm;		// Input: 反电动势滤波+延迟角度补偿
				  _iq  OutMax;		    // Parameter: Maximum output 
				  _iq  OutMin;	    	// Parameter: Minimum output
		 	 	  void  (*init)();	  	// Pointer to calculation function
		 	 	  void  (*calc)();	  	// Pointer to calculation function
				 } CURDQ;

typedef CURDQ *CURDQ_handle;
/*-----------------------------------------------------------------------------
Default initalizer for the CURDQ object.
-----------------------------------------------------------------------------*/                     
#define CURDQ_DEFAULTS { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, \
						 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, \
                           0, \
                           0, \
                           _IQ(0.5), \
                           0, \
                           0, \
                           0, \
                           0, \
						   0, \
                           0, \
                           0, \
                           0, \
                           0, \
                           0, \
                           0, \
                           0, \
                           0, \
                           _IQ(1), \
                           0, \
                           _IQ(0.99), \
                           _IQ(-0.99), \
              			  (void (*)(Uint32))Cur_DQ_init,\
  	  	  	  	  	  	  (void (*)(Uint32))Cur_DQ_calc }

/*------------------------------------------------------------------------------
Prototypes for the functions in PIDREG3.C
------------------------------------------------------------------------------*/
void Cur_DQ_init(CURDQ_handle);
void Cur_DQ_calc(CURDQ_handle);

#endif
