#ifndef _FOC_CORE_H__ #define _FOC_CORE_H__ #include "math/fix_math.h" typedef struct { u8 n_poles; s16q5_t s_maxIdq; s16q5_t s_maxiDC; s16 s_maxRPM; s16q5_t s_iABC[3]; s16 s_motRPM; //from hall or encoder s16q5_t s_motAngle; //from hall or encoder s16 s_targetRPM; s16q5_t s_targetIdq; s16q5_t s_targetVdq; u8 n_ctlMode; bool b_motEnable; s16q5_t s_manualAngle; //mainly used when calibrate hall }FOC_InP; typedef struct { u16 n_Duty[3]; u8 n_Sector; u8 n_RunMode; u8 s_RealVdq; u8 s_RealIdq; }FOC_OutP; typedef struct { PI_Controller id_ctl; PI_Controller iq_ctl; PI_Controller spd_ctl; PI_Controller fw_crl; FOC_InP in; FOC_OutP out; }PMSM_FOC_Ctrl; void PMSM_FOC_CoreInit(void); void PMSM_FOC_Schedule(void); void PMSM_FOC_Start(u8 nCtrlMode); void PMSM_FOC_Stop(void); void PMSM_FOC_iBusLimit(s16q5_t ibusLimit); void PMSM_FOC_SpeedLimit(s32q4_t speedLimit); float PMSM_FOC_GetSpeedLimit(void); void PMSM_FOC_VbusVoltage(s16q5_t vbusVol); void PMSM_FOC_SetCtrlMode(uint8_T mode); void PMSM_FOC_SetOpenVdq(s16q5_t vd, s16q5_t vq); bool PMSM_FOC_EnableCruise(boolean_T enable); bool PMSM_FOC_Set_Speed(float rpm); bool PMSM_FOC_Set_Current(float current); bool PMSM_FOC_Set_CruiseSpeed(float rpm); void PMSM_FOC_HallCalibrate(boolean_T b_caliHall, s16q5_t open_vd); float PMSM_FOC_GetSpeed(void); void PMSM_FOC_SetErrCode(u8 code); u8 PMSM_FOC_GetErrCode(void); bool PMSM_FOC_Lock_Motor(bool lock); void PMSM_FOC_Brake(bool brake); float PMSM_FOC_Get_iDC(void); void PMSM_FOC_LockMotor(bool lock); void PMSM_FOC_SetSpdPid(float kp, float ki, float kb); void PMSM_FOC_SetIDPid(float kp, float ki, float kb); void PMSM_FOC_SetIQPid(float kp, float ki, float kb); void PMSM_FOC_SetTrqPid(float kp, float ki, float kb); void PMSM_FOC_SetFW_I(float ki, float kb); s16 PMSM_FOC_Add_Hall_Offset(s16 offset); void PMSM_FOC_Set_Angle(s16 angle); bool PMSM_FOC_Is_Start(void); void PMSM_FOC_Set_Vdq(s16 vd, s16 vq); #endif /* _FOC_CORE_H__ */