Selaa lähdekoodia

Merge branch 'enc_err_det' into torque_lut

kevin 2 vuotta sitten
vanhempi
commit
95aacdb9c7

+ 0 - 1270
Applications/foc/core/PMSM_FOC_Core.c

@@ -1,1270 +0,0 @@
-#include "arm_math.h"
-#include "PMSM_FOC_Core.h"
-#include "foc/foc_config.h"
-#include "foc/mc_config.h"
-#include "foc/motor/motor_param.h"
-#include "foc/core/e_ctrl.h"
-#include "foc/core/etcs.h"
-#include "math/fix_math.h"
-#include "math/fast_math.h"
-#include "foc/motor/current.h"
-#include "foc/motor/motor.h"
-#include "foc/core/svpwm.h"
-#include "foc/core/thro_torque.h"
-#include "foc/core/foc_observer.h"
-#include "foc/core/F_Calc.h"
-#include "foc/samples.h"
-#include "foc/limit.h"
-#include "foc/mc_error.h"
-#include "app/nv_storage.h"
-#include "bsp/bsp_driver.h"
-#include "libs/logger.h"
-#include "math/fir.h"
-
-#define _DEBUG(fmt, args...) sys_debug(fmt, ##args)
-
-PMSM_FOC_Ctrl gFoc_Ctrl;
-static bool g_focinit = false;
-
-static __INLINE void RevPark(DQ_t *dq, float angle, AB_t *alpha_beta) {
-	float c,s;
-#if 0
-	arm_sin_cos(angle, &s, &c);
-#else
-	s = gFoc_Ctrl.out.sin;
-	c = gFoc_Ctrl.out.cos;
-#endif
-
-	alpha_beta->a = dq->d * c - dq->q * s;
-	alpha_beta->b = dq->d * s + dq->q * c;
-}
-
-static __INLINE void RevClark(AB_t *alpha_beta, float *ABC){
-	ABC[0] = alpha_beta->a;
-	ABC[1] = -alpha_beta->a * 0.5f + alpha_beta->b * SQRT3_BY_2;
-	ABC[2] = -alpha_beta->a * 0.5f - alpha_beta->b * SQRT3_BY_2;
-}
-
-static __INLINE void Clark(float A, float B, float C, AB_t *alpha_beta){
-	alpha_beta->a = A;
-	alpha_beta->b = ONE_BY_SQRT3 * (B - C);
-}
-
-static __INLINE void Park(AB_t *alpha_beta, float angle, DQ_t *dq) {
-	float c,s;
-#if 0
-	arm_sin_cos(angle, &s, &c);
-#else
-	s = gFoc_Ctrl.out.sin;
-	c = gFoc_Ctrl.out.cos;
-#endif
-	dq->d = alpha_beta->a * c + alpha_beta->b * s;
-	dq->q = -alpha_beta->a * s + alpha_beta->b * c;
-}
-
-void PMSM_FOC_ABC2Dq(float a, float b, float c, float *d, float *q) {
-	AB_t ab;
-	DQ_t dq;
-	Clark(a, b, c, &ab);
-	Park(&ab, 0, &dq);
-	*d = dq.d;
-	*q = dq.q;
-}
-
-
-static __INLINE void FOC_Set_DqRamp(dq_Rctrl *c, float target, int time) {	
-	float cp = c->s_Cp;
-	c->s_FinalTgt = target; 
-	c->s_Step = (c->s_FinalTgt - cp) / (float)time;
-}
-
-static __INLINE float FOC_Get_DqRamp(dq_Rctrl *c) {
-	if (++c->n_StepCount == c->n_CtrlCount) {
-		c->s_Cp += c->s_Step;
-		if (c->s_Step < 0) {
-			if (c->s_Cp < c->s_FinalTgt) {
-				c->s_Cp = c->s_FinalTgt;
-			}
-		}else {
-			if (c->s_Cp > c->s_FinalTgt) {
-				c->s_Cp = c->s_FinalTgt;
-			}
-		}
-		c->n_StepCount = 0;
-	}
-	return c->s_Cp;
-}
-
-static __INLINE void FOC_DqRamp_init(dq_Rctrl *c, int count) {
-	c->n_CtrlCount = count;
-	c->n_StepCount = 0;
-	c->s_Cp = 0;
-	c->s_FinalTgt = 0;
-	c->s_Step = 0;
-}
-
-static __INLINE void FOC_Set_iDqRamp(dq_Rctrl *c, float target) {
-	FOC_Set_DqRamp(c, target, (/*CONFIG_IDQ_CTRL_TS/CONFIG_SPD_CTRL_TS - 1*/CURRENT_LOOP_RAMP_COUNT));
-}
-
-static __INLINE void FOC_Set_vDqRamp(dq_Rctrl *c, float target) {
-	FOC_Set_DqRamp(c, target, (CONFIG_FOC_VDQ_RAMP_FINAL_TIME/1000*((CONFIG_IDQ_CTRL_TS/CONFIG_FOC_VDQ_RAMP_TS))));
-}
-
-
-static void PMSM_FOC_Reset_PID(void) {
-	PI_Controller_Reset(&gFoc_Ctrl.pi_id, 0);
-	PI_Controller_Reset(&gFoc_Ctrl.pi_iq, 0);
-	PI_Controller_Reset(&gFoc_Ctrl.pi_lock, 0);
-	PI_Controller_Reset(&gFoc_Ctrl.pi_power, 0);
-#ifdef CONFIG_SPEED_LADRC
-	ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, 0, 0);
-	ladrc_reset(&gFoc_Ctrl.vel_adrc, 0, 0);
-#else
-	PI_Controller_Reset(&gFoc_Ctrl.pi_vel, 0);
-	PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, 0);
-#endif
-}
-
-static void PMSM_FOC_Conf_PID(void) {
-	float slow_ctrl_ts = (1.0f/(float)CONFIG_SPD_CTRL_TS);
-	gFoc_Ctrl.pi_id.kp = mc_conf()->c.pid[PID_ID_ID].kp;
-	gFoc_Ctrl.pi_id.ki = mc_conf()->c.pid[PID_ID_ID].ki;
-	gFoc_Ctrl.pi_id.kd = mc_conf()->c.pid[PID_ID_ID].kd;
-	gFoc_Ctrl.pi_id.ts = (1.0f/(float)CONFIG_IDQ_CTRL_TS);
-
-	gFoc_Ctrl.pi_iq.kp = mc_conf()->c.pid[PID_IQ_ID].kp;
-	gFoc_Ctrl.pi_iq.ki = mc_conf()->c.pid[PID_IQ_ID].ki;
-	gFoc_Ctrl.pi_iq.kd = mc_conf()->c.pid[PID_IQ_ID].kd;
-	gFoc_Ctrl.pi_iq.ts = (1.0f/(float)CONFIG_IDQ_CTRL_TS);
-
-	gFoc_Ctrl.pi_power.kp = mc_conf()->c.pid[PID_IDCLim_ID].kp;
-	gFoc_Ctrl.pi_power.ki = mc_conf()->c.pid[PID_IDCLim_ID].ki;
-	gFoc_Ctrl.pi_power.kd = mc_conf()->c.pid[PID_IDCLim_ID].kd;
-	gFoc_Ctrl.pi_power.ts = slow_ctrl_ts;
-
-	gFoc_Ctrl.pi_lock.kp = mc_conf()->c.pid[PID_AutoHold_ID].kp;
-	gFoc_Ctrl.pi_lock.ki = mc_conf()->c.pid[PID_AutoHold_ID].ki;
-	gFoc_Ctrl.pi_lock.kd = mc_conf()->c.pid[PID_AutoHold_ID].kd;
-	gFoc_Ctrl.pi_lock.ts = slow_ctrl_ts;
-
-#ifdef CONFIG_SPEED_LADRC
-	ladrc_init(&gFoc_Ctrl.vel_lim_adrc, slow_ctrl_ts, nv_get_foc_params()->f_adrc_vel_lim_Wo, nv_get_foc_params()->f_adrc_vel_lim_Wcv, nv_get_foc_params()->f_adrc_vel_lim_B0);
-	ladrc_init(&gFoc_Ctrl.vel_adrc, slow_ctrl_ts, nv_get_foc_params()->f_adrc_vel_Wo, nv_get_foc_params()->f_adrc_vel_Wcv, nv_get_foc_params()->f_adrc_vel_B0);
-#else
-	gFoc_Ctrl.pi_vel_lim.kp = mc_conf()->c.pid[PID_VelLim_ID].kp;
-	gFoc_Ctrl.pi_vel_lim.ki = mc_conf()->c.pid[PID_VelLim_ID].ki;
-	gFoc_Ctrl.pi_vel_lim.kd = mc_conf()->c.pid[PID_VelLim_ID].kd;
-	gFoc_Ctrl.pi_vel_lim.ts = slow_ctrl_ts;
-	gFoc_Ctrl.pi_vel.kp = mc_conf()->c.pid[PID_Vel_ID].kp;
-	gFoc_Ctrl.pi_vel.ki = mc_conf()->c.pid[PID_Vel_ID].ki;
-	gFoc_Ctrl.pi_vel.kd = mc_conf()->c.pid[PID_Vel_ID].kd;
-	gFoc_Ctrl.pi_vel.ts = slow_ctrl_ts;
-#endif
-}
-
-static void PMSM_FOC_UserInit(void) {
-	memset(&gFoc_Ctrl.userLim, 0, sizeof(gFoc_Ctrl.userLim));
-	gFoc_Ctrl.userLim.s_iDCLim = min(mc_conf()->c.max_idc, gFoc_Ctrl.hwLim.s_iDCMax);
-	gFoc_Ctrl.userLim.s_motRPMLim = min(mc_conf()->c.max_rpm, gFoc_Ctrl.hwLim.s_motRPMMax);
-	gFoc_Ctrl.userLim.s_torqueLim = mc_conf()->c.max_torque;//MAX_TORQUE;
-	gFoc_Ctrl.userLim.s_PhaseCurrLim = min(mc_conf()->c.max_phase_curr, gFoc_Ctrl.hwLim.s_PhaseCurrMax);
-	gFoc_Ctrl.userLim.s_vDCMaxLim = mc_conf()->c.max_dc_vol;
-	gFoc_Ctrl.userLim.s_vDCMinLim = mc_conf()->c.min_dc_vol;
-	gFoc_Ctrl.userLim.s_iDCeBrkLim = 0xFF;
-	gFoc_Ctrl.userLim.s_PhaseVoleBrkLim = gFoc_Ctrl.hwLim.s_PhaseVolMax;
-}
-
-void PMSM_FOC_RT_LimInit(void) {
-	gFoc_Ctrl.protLim.s_iDCLim = HW_LIMIT_NONE;
-	gFoc_Ctrl.protLim.s_TorqueLim = HW_LIMIT_NONE;
-
-	eRamp_init_target2(&gFoc_Ctrl.rtLim.rpmLimRamp, gFoc_Ctrl.userLim.s_motRPMLim, CONFIG_LIMIT_RAMP_TIME);
-	eRamp_init_target2(&gFoc_Ctrl.rtLim.torqueLimRamp, gFoc_Ctrl.userLim.s_torqueLim, CONFIG_LIMIT_RAMP_TIME);
-	eRamp_init_target2(&gFoc_Ctrl.rtLim.DCCurrLimRamp, gFoc_Ctrl.userLim.s_iDCLim, CONFIG_LIMIT_RAMP_TIME);
-}
-
-void PMSM_FOC_CoreInit(void) {
-
-	PMSM_FOC_Conf_PID();
-	
-	memset(&gFoc_Ctrl.in, 0, sizeof(FOC_InP));
-	memset(&gFoc_Ctrl.out, 0, sizeof(FOC_OutP));
-	
-	gFoc_Ctrl.hwLim.s_iDCMax = CONFIG_HW_MAX_DC_CURRENT;
-	gFoc_Ctrl.hwLim.s_motRPMMax = CONFIG_HW_MAX_MOTOR_RPM;
-	gFoc_Ctrl.hwLim.s_PhaseCurrMax = CONFIG_HW_MAX_PHASE_CURR;
-	gFoc_Ctrl.hwLim.s_PhaseVolMax = CONFIG_HW_MAX_PHASE_VOL;
-	gFoc_Ctrl.hwLim.s_vDCMax      = CONFIG_HW_MAX_DC_VOLTAGE;
-	gFoc_Ctrl.hwLim.s_torqueMax  = mc_conf()->m.max_torque; //电机的最大扭矩
-	gFoc_Ctrl.hwLim.s_FWDCurrMax = mc_conf()->m.max_fw_id;  //电池能支持的最大弱磁电流
-	if (!g_focinit) {
-		PMSM_FOC_UserInit();
-		PMSM_FOC_RT_LimInit();
-		g_focinit = true;
-		//_DEBUG("User Limit:\n");
-		//_DEBUG("dc %f, rpm %f, torque %f, phase %f, vDCmax %f, vDCmin %f, ebrk %f\n", gFoc_Ctrl.userLim.s_iDCLim, gFoc_Ctrl.userLim.s_motRPMLim, gFoc_Ctrl.userLim.s_torqueLim,
-		//	gFoc_Ctrl.userLim.s_PhaseCurrLim, gFoc_Ctrl.userLim.s_vDCMaxLim, gFoc_Ctrl.userLim.s_vDCMinLim, gFoc_Ctrl.userLim.s_TorqueBrkLim);
-		//_DEBUG("Hw Limit:\n");
-		//_DEBUG("dc %f, rpm %f, torque %f, phase %f\n", gFoc_Ctrl.hwLim.s_iDCMax, gFoc_Ctrl.hwLim.s_motRPMMax, gFoc_Ctrl.hwLim.s_torqueMax, gFoc_Ctrl.hwLim.s_PhaseCurrMax);
-	}
-	gFoc_Ctrl.userLim.s_TorqueBrkLim = mc_get_ebrk_torque();
-	gFoc_Ctrl.params.n_modulation = CONFIG_SVM_MODULATION;//SVM_Modulation;
-	gFoc_Ctrl.params.n_poles = mc_conf()->m.poles;//MOTOR_POLES;
-	gFoc_Ctrl.params.lq = mc_conf()->m.lq;
-	gFoc_Ctrl.params.ld = mc_conf()->m.lq;
-	gFoc_Ctrl.params.flux = mc_conf()->m.flux;
-	gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
-	gFoc_Ctrl.in.s_dqAngle     = INVALID_ANGLE;
-	gFoc_Ctrl.in.s_vDC = sample_vbus_raw();
-	gFoc_Ctrl.in.s_angleLast = INVALID_ANGLE;
-	gFoc_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
-	gFoc_Ctrl.out.f_vdqRation = 0;
-
-	eRamp_init_target2(&gFoc_Ctrl.in.cruiseRpmRamp, 0, CONFIG_CRUISE_RAMP_TIME);
-
-	FOC_DqRamp_init(&gFoc_Ctrl.idq_ctl[0], 1);
-	FOC_DqRamp_init(&gFoc_Ctrl.idq_ctl[1], 1);
-
-	FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[0], (CONFIG_FOC_VDQ_RAMP_TS));
-	FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[1], (CONFIG_FOC_VDQ_RAMP_TS));	
-	PMSM_FOC_Reset_PID();
-
-	foc_observer_init();
-
-	gFoc_Ctrl.plot_type = Plot_None;
-}
-
-
-#define CONFIG_PEAK_CNT 3 //计算经过的电周期内的最大值(peak 峰值)
-#define CONFIG_PHASE_UNBALANCE_THROLD 4.0F
-#define CONFIG_PHASE_UNBALANCE_R      0.1F
-static float phase_unbalance_r = 0.0f;
-static float phase_a_max, phase_b_max, phase_c_max;
-static u32 phase_unbalance_cnt;
-static __INLINE void PMSM_FOC_Phase_Unbalance(void) {
-	static u32 _cycle_cnt = 0, _last_mod_cnt = 0;
-	static float a_max = 0, b_max = 0, c_max = 0;
-	static u32 _unbalance_cnt = 0;
-	static u32 _unbalance_time = 0;
-	float lowpass = gFoc_Ctrl.in.s_motVelRadusPers * FOC_CTRL_US / 2.0f;
-	if (lowpass > 1.0f) {
-		lowpass = 1.0f;
-	}
-	LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[0], gFoc_Ctrl.in.s_iABC[0], lowpass);
-	LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[1], gFoc_Ctrl.in.s_iABC[1], lowpass);
-	gFoc_Ctrl.in.s_iABCFilter[2] = -(gFoc_Ctrl.in.s_iABCFilter[0] + gFoc_Ctrl.in.s_iABCFilter[1]);
-	if ((gFoc_Ctrl.in.s_angleLast == INVALID_ANGLE) || (gFoc_Ctrl.in.s_motVelRadusPers < 100)) {
-		gFoc_Ctrl.in.s_angleLast = gFoc_Ctrl.in.s_motAngle;
-		a_max = b_max = c_max = 0;
-		_unbalance_cnt = 0;
-		_unbalance_time = get_tick_ms();
-		_cycle_cnt = 0;
-		_last_mod_cnt = 0;
-		phase_unbalance_r = 0;
-		return;
-	}
-	float delta_angle = gFoc_Ctrl.in.s_motAngle - gFoc_Ctrl.in.s_angleLast;
-	if (delta_angle > 200 || delta_angle < -200) { //one cycle
-		_cycle_cnt ++;
-	}
-	gFoc_Ctrl.in.s_angleLast = gFoc_Ctrl.in.s_motAngle;
-	u32 mod_cnt = _cycle_cnt % CONFIG_PEAK_CNT;
-	bool trigger = false;
-	if ((mod_cnt == 0) && (_last_mod_cnt != mod_cnt)) {
-		trigger = true;
-	}
-	_last_mod_cnt = mod_cnt;
-
-	a_max = MAX(a_max, gFoc_Ctrl.in.s_iABCFilter[0] * (2.2f));
-	b_max = MAX(b_max, gFoc_Ctrl.in.s_iABCFilter[1] * (2.2f));
-	c_max = MAX(c_max, gFoc_Ctrl.in.s_iABCFilter[2] * (2.2f));
-	if (trigger) { //经过CONFIG_PEAK_CNT个周期,已经得到peak值
-		float i_min = 1000.0f, i_max = 0;
-		if (a_max > i_max) {
-			i_max = a_max;
-		}
-		if (a_max < i_min) {
-			i_min = a_max;
-		}
-		if (b_max > i_max) {
-			i_max = b_max;
-		}
-		if (b_max < i_min) {
-			i_min = b_max;
-		}
-		if (c_max > i_max) {
-			i_max = c_max;
-		}
-		if (c_max < i_min) {
-			i_min = c_max;
-		}
-		float unbalance_r = (i_max - i_min - CONFIG_PHASE_UNBALANCE_THROLD)/(i_max + 1e-8f);
-		if (unbalance_r >= CONFIG_PHASE_UNBALANCE_R) {
-			if ((_unbalance_cnt++ >= 500) || (get_delta_ms(_unbalance_time) >= 1000*10)) {
-				if (mc_set_critical_error(FOC_CRIT_PHASE_UNBalance_Err)) {
-					mc_crit_err_add(FOC_CRIT_PHASE_UNBalance_Err, (s16)i_max, (s16)i_min);
-				}
-			}
-		}else {
-			_unbalance_cnt = 0;
-			_unbalance_time = get_tick_ms();
-		}
-		phase_unbalance_r = unbalance_r;
-		phase_a_max = a_max;
-		phase_b_max = b_max;
-		phase_c_max = c_max;
-		phase_unbalance_cnt = _unbalance_cnt;
-		a_max = b_max = c_max = 0;
-	}
-}
-
-/* 死区补偿 */
-static  __INLINE void PMSM_FOC_DeadTime_Compensate(s32 PWM_Half_Period) {
-#ifdef CONFIG_START_LINE_DTC_CURRENT
-	float deadTime = (float)CONFIG_HW_DeadTime/2.0f;
-	s32 dutyDTCA = 0;
-	s32 dutyDTCB = 0;
-	s32 dutyDTCC = 0;
-	float r, delta;
-	float iabs = ABS(gFoc_Ctrl.in.s_iABC_DT[0]);
-	if (iabs > CONFIG_START_LINE_DTC_CURRENT) {
-		delta = iabs - CONFIG_START_LINE_DTC_CURRENT;
-		r = delta / (CONFIG_END_LINE_DTC_CURRENT - CONFIG_START_LINE_DTC_CURRENT);
-		if (r > 1.0f) {
-			r = 1.0f;
-		}
-		if (gFoc_Ctrl.in.s_iABC_DT[0] < 0) {
-			r = -r;
-		}
-		dutyDTCA = (s32)(r * deadTime);
-	}
-	iabs = ABS(gFoc_Ctrl.in.s_iABC_DT[1]);
-	if (iabs > CONFIG_START_LINE_DTC_CURRENT) {
-		delta = iabs - CONFIG_START_LINE_DTC_CURRENT;
-		r = delta / (CONFIG_END_LINE_DTC_CURRENT - CONFIG_START_LINE_DTC_CURRENT);
-		if (r > 1.0f) {
-			r = 1.0f;
-		}
-		if (gFoc_Ctrl.in.s_iABC_DT[1] < 0) {
-			r = -r;
-		}
-		dutyDTCB = (s32)(r * deadTime);
-	}
-	iabs = ABS(gFoc_Ctrl.in.s_iABC_DT[2]);
-	if (iabs > CONFIG_START_LINE_DTC_CURRENT) {
-		delta = iabs - CONFIG_START_LINE_DTC_CURRENT;
-		r = delta / (CONFIG_END_LINE_DTC_CURRENT - CONFIG_START_LINE_DTC_CURRENT);
-		if (r > 1.0f) {
-			r = 1.0f;
-		}
-		if (gFoc_Ctrl.in.s_iABC_DT[2] < 0) {
-			r = -r;
-		}
-		dutyDTCC = (s32)(r * deadTime);
-	}
-	s32 dutyA = (s32)gFoc_Ctrl.out.n_Duty[0] + dutyDTCA;
-	s32 dutyB = (s32)gFoc_Ctrl.out.n_Duty[1] + dutyDTCB;
-	s32 dutyC = (s32)gFoc_Ctrl.out.n_Duty[2] + dutyDTCC;
-	gFoc_Ctrl.out.n_Duty[0] = sclamp(dutyA, 0, PWM_Half_Period);
-	gFoc_Ctrl.out.n_Duty[1] = sclamp(dutyB, 0, PWM_Half_Period);
-	gFoc_Ctrl.out.n_Duty[2] = sclamp(dutyC, 0, PWM_Half_Period);
-#endif
-}
-
-static __INLINE void Phase_Voltage_update(float lowpass) {
-	float v_ABC[3];
-	get_uvw_phases_raw(v_ABC);
-	LowPass_Filter(gFoc_Ctrl.in.s_SamplePhaseV[0], v_ABC[0], lowpass);
-	LowPass_Filter(gFoc_Ctrl.in.s_SamplePhaseV[1], v_ABC[1], lowpass);
-	LowPass_Filter(gFoc_Ctrl.in.s_SamplePhaseV[2], v_ABC[2], lowpass);
-	/* phase voltage = phase-phase voltage / sqrt(3), 1.4是滤波器幅值补偿系数 */
-	float phase_vAN = (gFoc_Ctrl.in.s_SamplePhaseV[0] - gFoc_Ctrl.in.s_SamplePhaseV[1]) * ONE_BY_SQRT3 * 1.4f;
-	float phase_vBN = (gFoc_Ctrl.in.s_SamplePhaseV[1] - gFoc_Ctrl.in.s_SamplePhaseV[2]) * ONE_BY_SQRT3 * 1.4f;
-	float phase_vCN = (gFoc_Ctrl.in.s_SamplePhaseV[2] - gFoc_Ctrl.in.s_SamplePhaseV[0]) * ONE_BY_SQRT3 * 1.4f;
-	Clark(phase_vAN, phase_vBN, phase_vCN, &gFoc_Ctrl.out.s_SampleAB);
-	Park(&gFoc_Ctrl.out.s_SampleAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_SamplevDQ);
-}
-
-//#define UPDATE_Lq_By_iq   /* Q轴电感 通过Iq电流补偿 */
-#define CONFIG_Volvec_Delay_Comp /* 电压矢量角度补偿 */
-#define CONFIG_Volvec_Delay_Comp_Start_Vel 500 // rpm
-static float encoder_angle,obser_angle, obser_vel = 111111;
-static __INLINE bool PMSM_FOC_Update_Input(void) {
-	AB_t iAB;
-	float *iabc = gFoc_Ctrl.in.s_iABC;
-
-	phase_current_get(iabc);
-
-	Clark(iabc[0], iabc[1], iabc[2], &iAB);
-
-	foc_observer_update(gFoc_Ctrl.out.s_OutVAB.a * TWO_BY_THREE, gFoc_Ctrl.out.s_OutVAB.b * TWO_BY_THREE, iAB.a, iAB.b);
-
-	float enc_angle = motor_encoder_get_angle();
-	float enc_vel = motor_encoder_get_speed();
-	if (!foc_observer_diagnostic(enc_angle, enc_vel)){
-		/* detect encoder angle error, do something here */
-		if (!foc_observer_sensorless_stable()) {
-			gFoc_Ctrl.in.s_motVelocity = 0;
-			return false;
-		}
-		if (obser_vel == 111111) {
-			obser_vel = foc_observer_sensorless_speed();
-			obser_angle = foc_observer_sensorless_angle();
-			encoder_angle = enc_angle;
-		}
-		enc_angle = foc_observer_sensorless_angle();
-		enc_vel = foc_observer_sensorless_speed();
-
-	}
-	
-	if (!gFoc_Ctrl.in.b_MTPA_calibrate && (gFoc_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
-		gFoc_Ctrl.in.s_motAngle = gFoc_Ctrl.in.s_manualAngle;
-	}else {
-		gFoc_Ctrl.in.s_motAngle = enc_angle;
-	}
-	gFoc_Ctrl.in.s_motVelocity = enc_vel;
-	LowPass_Filter(gFoc_Ctrl.in.s_motVelocityFiltered, gFoc_Ctrl.in.s_motVelocity, 0.01f);
-	gFoc_Ctrl.in.s_motVelRadusPers = gFoc_Ctrl.in.s_motVelocityFiltered / 30.0f * PI * gFoc_Ctrl.params.n_poles;
-
-	PMSM_FOC_Phase_Unbalance();
-
-#ifdef CONFIG_DQ_STEP_RESPONSE
-	gFoc_Ctrl.in.s_motAngle = 0;
-#endif
-
-	gFoc_Ctrl.in.s_vDC = get_vbus_float();
-	
-	arm_sin_cos(gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.sin, &gFoc_Ctrl.out.cos);
-	Park(&iAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_RealIdq);
-
-	float lowpass = gFoc_Ctrl.in.s_motVelRadusPers * FOC_CTRL_US;
-	float iqLowPass = lowpass * 2.0f;
-	if (iqLowPass > 1.0f) {
-		iqLowPass = 1.0f;
-	}else if (iqLowPass <= 0.0001f) {
-		iqLowPass = 0.001f;
-	}
-	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, iqLowPass);
-	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, iqLowPass);
-	/* 使用低通后的dq电流重新变换得到abc电流,给死区补偿使用 */
-	RevPark(&gFoc_Ctrl.out.s_FilterIdq, gFoc_Ctrl.in.s_motAngle, &iAB);
-	RevClark(&iAB, gFoc_Ctrl.in.s_iABC_DT);
-	
-	Phase_Voltage_update(lowpass);
-
-#ifdef CONFIG_START_LINE_DTC_CURRENT
-	gFoc_Ctrl.out.s_OutVdqDTC.d = 0;
-	gFoc_Ctrl.out.s_OutVdqDTC.q = 0;
-#else
-	AB_t vAB;
-	vAB.a = (1.0f / 3.0f) * (2.0f * SIGN(gFoc_Ctrl.in.s_iABC_DT[0]) - SIGN(gFoc_Ctrl.in.s_iABC_DT[1]) - SIGN(gFoc_Ctrl.in.s_iABC_DT[2]));
-	vAB.b = ONE_BY_SQRT3 * (SIGN(gFoc_Ctrl.in.s_iABC_DT[1]) - SIGN(gFoc_Ctrl.in.s_iABC_DT[2]));
-	float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * gFoc_Ctrl.in.s_vDC;
-	vAB.a = vAB.a * dtc;
-	vAB.b = vAB.b * dtc;
-	Park(&vAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_OutVdqDTC); //used for vbus current calc
-#endif
-#ifdef CONFIG_Volvec_Delay_Comp
-	if (gFoc_Ctrl.in.s_motVelocityFiltered >= CONFIG_Volvec_Delay_Comp_Start_Vel) {
-		float next_angle = gFoc_Ctrl.in.s_motAngle + gFoc_Ctrl.in.s_motVelRadusPers / PI * 180.0f * (FOC_CTRL_US * 0.8f);
-		rand_angle(next_angle);
-		arm_sin_cos(next_angle, &gFoc_Ctrl.out.sin, &gFoc_Ctrl.out.cos);
-	}
-#endif
-	return true;
-}
-
-static __INLINE float id_feedforward(float eW) {
-#ifdef CONFIG_CURRENT_LOOP_DECOUPE
-	return -(gFoc_Ctrl.params.lq * gFoc_Ctrl.out.s_RealIdq.q * eW);
-#else
-	return 0;
-#endif
-}
-
-static __INLINE float iq_feedforward(float eW) {
-#ifdef CONFIG_CURRENT_LOOP_DECOUPE
-	return (gFoc_Ctrl.params.ld * gFoc_Ctrl.out.s_RealIdq.d + gFoc_Ctrl.params.flux) * eW;
-#else
-	return 0;
-#endif
-}
-
-bool PMSM_FOC_Schedule(void) {
-
-	gFoc_Ctrl.ctrl_count++;
-
-	if (!PMSM_FOC_Update_Input()){
-		return false;
-	}
-	
-	if (gFoc_Ctrl.out.n_RunMode != CTRL_MODE_OPEN) {
-
-		float max_Vdc = gFoc_Ctrl.in.s_vDC * CONFIG_SVM_MODULATION;
-		float max_vd = max_Vdc * SQRT3_BY_2;
-
-		/* limiter Vd output for PI controller */
-		gFoc_Ctrl.pi_id.max = max_vd;
-		gFoc_Ctrl.pi_id.min = -max_vd;
-	#ifndef CONFIG_DQ_STEP_RESPONSE
-		float target_d = FOC_Get_DqRamp(&gFoc_Ctrl.idq_ctl[0]);
-	#endif
-		float err = target_d - gFoc_Ctrl.out.s_RealIdq.d;
-		float id_ff = id_feedforward(gFoc_Ctrl.in.s_motVelRadusPers);
-		gFoc_Ctrl.in.s_targetVdq.d = PI_Controller_Current(&gFoc_Ctrl.pi_id, err, id_ff);
-#ifdef UPDATE_Lq_By_iq
-		/* update kp&ki from lq for iq PI controller */
-		float lq = motor_get_lq_from_iq((s16)gFoc_Ctrl.out.s_FilterIdq.q);
-		LowPass_Filter(gFoc_Ctrl.params.lq, lq, 0.01f);
-		gFoc_Ctrl.pi_iq.kp = ((float)nv_get_foc_params()->n_currentBand * gFoc_Ctrl.params.lq);
-		gFoc_Ctrl.pi_iq.ki = (nv_get_motor_params()->r/gFoc_Ctrl.params.lq);
-#endif
-		/* limiter Vq output for PI controller */
-		float max_vq = sqrtf(SQ(max_vd) - SQ(gFoc_Ctrl.in.s_targetVdq.d));
-		gFoc_Ctrl.pi_iq.max = max_vq;
-		gFoc_Ctrl.pi_iq.min = -max_vq;
-	#ifndef CONFIG_DQ_STEP_RESPONSE
-		float target_q = FOC_Get_DqRamp(&gFoc_Ctrl.idq_ctl[1]);
-	#endif
-		err = target_q - gFoc_Ctrl.out.s_RealIdq.q;
-		float iq_ff = iq_feedforward(gFoc_Ctrl.in.s_motVelRadusPers);
-		gFoc_Ctrl.in.s_targetVdq.q = PI_Controller_Current(&gFoc_Ctrl.pi_iq, err, iq_ff);
-	}else {
-		float max_Vdc = gFoc_Ctrl.in.s_vDC * CONFIG_SVM_MODULATION;
-		float max_vd = max_Vdc * SQRT3_BY_2;
-		float vd_ref = FOC_Get_DqRamp(&gFoc_Ctrl.vdq_ctl[0]);
-		gFoc_Ctrl.in.s_targetVdq.d = fclamp(vd_ref, -max_vd, max_vd);
-	
-		float max_vq = sqrtf(SQ(max_vd) - SQ(gFoc_Ctrl.in.s_targetVdq.d));
-		float vq_ref = FOC_Get_DqRamp(&gFoc_Ctrl.vdq_ctl[1]);
-		gFoc_Ctrl.in.s_targetVdq.q = fclamp(vq_ref, -max_vq, max_vq);
-	}
-
-	gFoc_Ctrl.out.s_OutVdq.d = gFoc_Ctrl.in.s_targetVdq.d;
-	gFoc_Ctrl.out.s_OutVdq.q = gFoc_Ctrl.in.s_targetVdq.q;
-
-	RevPark(&gFoc_Ctrl.out.s_OutVdq, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_OutVAB);
-	
-	SVM_Duty_Fix(&gFoc_Ctrl.out.s_OutVAB, gFoc_Ctrl.in.s_vDC, FOC_PWM_Half_Period, &gFoc_Ctrl.out);
-
-	PMSM_FOC_DeadTime_Compensate((s32)FOC_PWM_Half_Period);
-
-	phase_current_point(&gFoc_Ctrl.out);
-	
-	pwm_update_duty(gFoc_Ctrl.out.n_Duty[0], gFoc_Ctrl.out.n_Duty[1], gFoc_Ctrl.out.n_Duty[2]);
-	pwm_update_sample(gFoc_Ctrl.out.n_Sample1, gFoc_Ctrl.out.n_Sample2, gFoc_Ctrl.out.n_CPhases);
-
-	return true;
-}
-
-void PMSM_FOC_LogDebug(void) {
-	sys_debug("DC curr %f --- %f,  %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_FilteriDC, gFoc_Ctrl.out.s_CalciDC2);
-	sys_debug("%s\n", gFoc_Ctrl.out.empty_load?"NoLoad Running":"Load Runing");
-	sys_debug("unbalance: %d, %f, %f, %f, %f\n", phase_unbalance_cnt, phase_unbalance_r, phase_a_max, phase_b_max, phase_c_max);
-	if (obser_vel != 111111) {
-		sys_debug("AB error: %f,%f,%f\n", obser_angle, encoder_angle, obser_vel);
-	}
-}
-
-/*called in media task */
-u8 PMSM_FOC_CtrlMode(void) {
-	u8 preMode = gFoc_Ctrl.out.n_RunMode;
-
-	if (!gFoc_Ctrl.in.b_motEnable) {
-		gFoc_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
-	}else if (gFoc_Ctrl.in.n_ctlMode == CTRL_MODE_OPEN) {
-		gFoc_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
-	}else if (gFoc_Ctrl.in.n_ctlMode == CTRL_MODE_SPD || gFoc_Ctrl.in.b_cruiseEna){
-		gFoc_Ctrl.out.n_RunMode = CTRL_MODE_SPD;
-	}else if (gFoc_Ctrl.in.n_ctlMode == CTRL_MODE_CURRENT) {
-		gFoc_Ctrl.out.n_RunMode = CTRL_MODE_CURRENT;
-	}else if (gFoc_Ctrl.in.n_ctlMode == CTRL_MODE_EBRAKE) {
-		gFoc_Ctrl.out.n_RunMode = CTRL_MODE_EBRAKE;
-	}else {
-		if (!gFoc_Ctrl.in.b_cruiseEna) {
-			gFoc_Ctrl.out.n_RunMode = CTRL_MODE_TRQ;
-		}
-	}
-	if (preMode != gFoc_Ctrl.out.n_RunMode) {
-		if ((preMode == CTRL_MODE_SPD) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ)) {
-#ifdef CONFIG_SPEED_LADRC
-			//ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, gFoc_Ctrl.in.s_motVelocity, gFoc_Ctrl.in.s_targetTorque);
-			ladrc_copy(&gFoc_Ctrl.vel_lim_adrc, &gFoc_Ctrl.vel_adrc);
-#else
-			PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, gFoc_Ctrl.in.s_targetTorque);
-#endif
-		}else if ((preMode == CTRL_MODE_TRQ) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
-#ifdef CONFIG_SPEED_LADRC
-			ladrc_copy(&gFoc_Ctrl.vel_adrc, &gFoc_Ctrl.vel_lim_adrc);
-#else
-			PI_Controller_Reset(&gFoc_Ctrl.pi_vel, gFoc_Ctrl.in.s_targetTorque);
-#endif
-		}else if ((preMode == CTRL_MODE_CURRENT) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ)) {
-#ifdef CONFIG_SPEED_LADRC
-			ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, gFoc_Ctrl.in.s_motVelocity, gFoc_Ctrl.in.s_targetTorque);
-#else
-			PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, gFoc_Ctrl.in.s_targetTorque);
-#endif
-		}else if ((preMode != gFoc_Ctrl.out.n_RunMode) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_EBRAKE)) {
-			eCtrl_reset_Torque(gFoc_Ctrl.in.s_targetTorque);
-			eCtrl_set_TgtTorque(motor_get_ebreak_toruqe(gFoc_Ctrl.in.s_motVelocity));
-		}else if ((preMode == CTRL_MODE_EBRAKE) && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
-#ifdef CONFIG_SPEED_LADRC
-			ladrc_reset(&gFoc_Ctrl.vel_adrc, 0, F_get_air());
-#else
-			PI_Controller_Reset(&gFoc_Ctrl.pi_vel, F_get_air());
-#endif
-		}
-	}
-	
-	return gFoc_Ctrl.out.n_RunMode;
-}
-
-static void crosszero_step_towards(float *value, float target) {
-	static float no_cro_step = CONFIG_CrossZero_NorStep;
-	float v_now = *value;
-	bool cross_zero = false;
-	float nor_step = mc_conf()->cz.normal_step;
-	float min_step = mc_conf()->cz.min_step;
-	float min_ramp_torque = mc_conf()->cz.low;
-	float high_ramp_torque = mc_conf()->cz.high;
-	if (target > 0) {
-		if (v_now < -min_ramp_torque) {
-			step_towards(value, -min_ramp_torque + 0.001f, nor_step);
-			cross_zero = true;
-		}else if (v_now >= -min_ramp_torque && v_now <= high_ramp_torque) {
-			step_towards(value, target, min_step);
-			cross_zero = true;
-		}
-	}else if (target == 0) {
-		if (v_now > high_ramp_torque) {
-			step_towards(value, high_ramp_torque - 0.001f, nor_step);
-			cross_zero = true;
-		}else if (v_now >= min_ramp_torque && v_now <= high_ramp_torque) {
-			step_towards(value, target, min_step);
-			cross_zero = true;
-		}
-	}else {
-		if (v_now > high_ramp_torque) {
-			step_towards(value, high_ramp_torque - 0.001f, nor_step);
-			cross_zero = true;
-		}else if (v_now >= -min_ramp_torque && v_now <= high_ramp_torque) {
-			step_towards(value, target, min_step);
-			cross_zero = true;
-		}
-	}
-	if (!cross_zero) {
-		step_towards(&no_cro_step, nor_step, 0.1f);
-		step_towards(value, target, no_cro_step);
-	}else {
-		no_cro_step = 0.5f;
-	}
-}
-
-
-/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
-static __INLINE float PMSM_FOC_Limit_iDC(float maxTrq) {
-#if 1
-	gFoc_Ctrl.pi_power.max = maxTrq;
-	float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.DCCurrLimRamp) - (gFoc_Ctrl.out.s_FilteriDC);
-	return PI_Controller_Run(&gFoc_Ctrl.pi_power, errRef);
-#else
-	return maxTrq;
-#endif
-}
-
-static __INLINE float PMSM_FOC_Limit_Speed(float maxTrq) {
-#ifdef CONFIG_SPEED_LADRC
-	float lim = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp);
-	ladrc_set_range(&gFoc_Ctrl.vel_lim_adrc, 0, maxTrq);
-	return ladrc_run(&gFoc_Ctrl.vel_lim_adrc, lim, gFoc_Ctrl.in.s_motVelocity);
-#else
-	gFoc_Ctrl.pi_vel_lim.max = maxTrq;
-	gFoc_Ctrl.pi_vel_lim.min = 0;
-
-	float err = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motVelocity;
-	return PI_Controller_RunVel(&gFoc_Ctrl.pi_vel_lim, err);
-#endif
-}
-
-static __INLINE void PMSM_FOC_idq_Assign(void) {
-	if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT) {
-		if (gFoc_Ctrl.in.b_MTPA_calibrate && (gFoc_Ctrl.in.s_dqAngle != INVALID_ANGLE)) {
-			float s, c;
-			normal_sincosf(degree_2_pi(gFoc_Ctrl.in.s_dqAngle + 90.0f), &s, &c);
-			gFoc_Ctrl.in.s_targetIdq.d = gFoc_Ctrl.in.s_targetCurrent * c;
-			
-			if (gFoc_Ctrl.in.s_targetIdq.d > gFoc_Ctrl.hwLim.s_FWDCurrMax) {
-				gFoc_Ctrl.in.s_targetIdq.d = gFoc_Ctrl.hwLim.s_FWDCurrMax;
-			}else if (gFoc_Ctrl.in.s_targetIdq.d < -gFoc_Ctrl.hwLim.s_FWDCurrMax) {
-				gFoc_Ctrl.in.s_targetIdq.d = -gFoc_Ctrl.hwLim.s_FWDCurrMax;
-			}
-			gFoc_Ctrl.in.s_targetIdq.q = sqrtf(SQ(gFoc_Ctrl.in.s_targetCurrent) - SQ(gFoc_Ctrl.in.s_targetIdq.d));
-			if (s < 0) {
-				gFoc_Ctrl.in.s_targetIdq.q = -gFoc_Ctrl.in.s_targetIdq.q;
-			}
-		}else {
-			gFoc_Ctrl.in.s_targetIdq.d = 0;
-			gFoc_Ctrl.in.s_targetIdq.q = gFoc_Ctrl.in.s_targetCurrent;
-		}
-	}else if ((gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) || (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD) ||
-				(gFoc_Ctrl.out.n_RunMode == CTRL_MODE_EBRAKE)) {
-		motor_mpta_fw_lookup(gFoc_Ctrl.in.s_motVelocity, gFoc_Ctrl.in.s_targetTorque, &gFoc_Ctrl.in.s_targetIdq);
-	}
-	u32 mask = cpu_enter_critical();
-	FOC_Set_iDqRamp(&gFoc_Ctrl.idq_ctl[0], gFoc_Ctrl.in.s_targetIdq.d);
-	FOC_Set_iDqRamp(&gFoc_Ctrl.idq_ctl[1], gFoc_Ctrl.in.s_targetIdq.q);
-	cpu_exit_critical(mask);
-}
-
-/*called in media task */
-void PMSM_FOC_idqCalc(void) {
-	if (gFoc_Ctrl.in.b_AutoHold) {
-		float hold_torque = min(gFoc_Ctrl.protLim.s_TorqueLim, mc_conf()->c.max_autohold_torque);
-		gFoc_Ctrl.pi_lock.max = hold_torque;
-		gFoc_Ctrl.pi_lock.min = -hold_torque;
-		float vel_count = motor_encoder_get_vel_count();
-		float errRef = 0 - vel_count;
-		gFoc_Ctrl.in.s_targetTorque = PI_Controller_Run(&gFoc_Ctrl.pi_lock ,errRef);
-		PMSM_FOC_idq_Assign();
-		return;
-	}
-	if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT) {
-		gFoc_Ctrl.in.s_targetCurrent = eCtrl_get_RefCurrent();
-	}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_EBRAKE) {
-		float maxTrq = eCtrl_get_RefTorque();
-		if (eCtrl_get_FinalTorque() < 0.0001f && gFoc_Ctrl.in.s_motVelocity < CONFIG_MIN_RPM_EXIT_EBRAKE) {
-			maxTrq = 0;
-		}
-		crosszero_step_towards(&gFoc_Ctrl.in.s_targetTorque, maxTrq);
-	}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
-		float refTorque = min(eCtrl_get_RefTorque(), eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp));
-		float maxTrq = PMSM_FOC_Limit_Speed(refTorque);
-		maxTrq = PMSM_FOC_Limit_iDC(maxTrq);
-		crosszero_step_towards(&gFoc_Ctrl.in.s_targetTorque, maxTrq);
-	}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
-		float maxSpeed = eCtrl_get_FinalSpeed();
-		float refSpeed = eCtrl_get_RefSpeed();
-		if (gFoc_Ctrl.in.b_cruiseEna) {
-			maxSpeed = eRamp_get_target(&gFoc_Ctrl.in.cruiseRpmRamp);
-			refSpeed = eRamp_get_intepolation(&gFoc_Ctrl.in.cruiseRpmRamp);//gFoc_Ctrl.in.s_cruiseRPM;
-		}
-#ifdef CONFIG_SPEED_LADRC
-		if (maxSpeed >= 0) {
-			ladrc_set_range(&gFoc_Ctrl.vel_adrc, -CONFIG_MAX_NEG_TORQUE, eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp));
-		}else if (maxSpeed < 0) {
-			ladrc_set_range(&gFoc_Ctrl.vel_adrc, -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp), CONFIG_MAX_NEG_TORQUE);
-		}
-
-		if ((maxSpeed == 0) && (gFoc_Ctrl.in.s_motVelocity < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
-			ladrc_set_range(&gFoc_Ctrl.vel_adrc, 0, 0);
-		}
-		gFoc_Ctrl.in.s_targetRPM = refSpeed;
-		float maxTrq = ladrc_run(&gFoc_Ctrl.vel_adrc, refSpeed, gFoc_Ctrl.in.s_motVelocity);
-#else
-		if (maxSpeed >= 0) {
-			gFoc_Ctrl.pi_vel.max = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);
-#ifdef CONFIG_SERVO_MOTOR
-			gFoc_Ctrl.pi_vel.min = -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);
-#else
-			gFoc_Ctrl.pi_vel.min = -CONFIG_MAX_NEG_TORQUE;
-#endif
-		}else if (maxSpeed < 0) {
-			gFoc_Ctrl.pi_vel.min = -eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);
-#ifdef CONFIG_SERVO_MOTOR
-			gFoc_Ctrl.pi_vel.max = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.torqueLimRamp);
-#else
-			gFoc_Ctrl.pi_vel.max = CONFIG_MAX_NEG_TORQUE;
-#endif
-		}
-
-		if ((maxSpeed == 0) && (gFoc_Ctrl.in.s_motVelocity < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
-			gFoc_Ctrl.pi_vel.max = 0;
-			gFoc_Ctrl.pi_vel.min = 0; //防止倒转
-		}
-		gFoc_Ctrl.in.s_targetRPM = refSpeed;
-		float errRef = refSpeed - gFoc_Ctrl.in.s_motVelocity;
-		float maxTrq = PI_Controller_RunVel(&gFoc_Ctrl.pi_vel, errRef);
-#endif
-		maxTrq = PMSM_FOC_Limit_iDC(maxTrq);
-		crosszero_step_towards(&gFoc_Ctrl.in.s_targetTorque, maxTrq);
-	}
-
-	PMSM_FOC_idq_Assign();
-}
-
-u8 PMSM_FOC_RunTime_Limit(void) {
-	u8 changed = FOC_LIM_NO_CHANGE;
-	float dc_lim = (float)vbus_under_vol_limit();
-	float torque_lim = (float)min(mos_temp_high_limit(), motor_temp_high_limit());
-
-	if (gFoc_Ctrl.protLim.s_iDCLim != dc_lim || gFoc_Ctrl.protLim.s_TorqueLim != torque_lim) {
-		if ((dc_lim > gFoc_Ctrl.protLim.s_iDCLim) || (torque_lim > gFoc_Ctrl.protLim.s_TorqueLim)) {
-			changed = FOC_LIM_CHANGE_H;
-		}else {
-			changed = FOC_LIM_CHANGE_L;
-		}
-		gFoc_Ctrl.protLim.s_iDCLim = dc_lim;
-		gFoc_Ctrl.protLim.s_TorqueLim = torque_lim;
-	}
-	return changed;
-}
-
-
-bool PMSM_FOC_iDC_is_Limited(void) {
-	return (gFoc_Ctrl.protLim.s_iDCLim != HW_LIMIT_NONE);
-}
-
-bool PMSM_FOC_Torque_is_Limited(void) {
-	return (gFoc_Ctrl.protLim.s_TorqueLim != HW_LIMIT_NONE);
-}
-
-void PMSM_FOC_Slow_Task(void) {
-	eRamp_running(&gFoc_Ctrl.rtLim.torqueLimRamp);
-	eRamp_running(&gFoc_Ctrl.rtLim.DCCurrLimRamp);
-	eRamp_running(&gFoc_Ctrl.rtLim.rpmLimRamp);
-	eRamp_running(&gFoc_Ctrl.in.cruiseRpmRamp);
-	PMSM_FOC_idqCalc();
-}
-
-void PMSM_FOC_Change_VelLoop_Params(float wcv, float b0) {
-#ifdef CONFIG_SPEED_LADRC
-	ladrc_change_b0(&gFoc_Ctrl.vel_adrc, b0);
-	ladrc_change_K(&gFoc_Ctrl.vel_adrc, wcv);
-#else
-	PI_Controller_Change_Kpi(&gFoc_Ctrl.pi_vel, wcv, b0);
-#endif
-}
-
-void PMSM_FOC_Change_TrqLoop_Params(float wcv, float b0) {
-#ifdef CONFIG_SPEED_LADRC
-	ladrc_change_b0(&gFoc_Ctrl.vel_lim_adrc, b0);
-	ladrc_change_K(&gFoc_Ctrl.vel_lim_adrc, wcv);
-#else
-	PI_Controller_Change_Kpi(&gFoc_Ctrl.pi_vel_lim, wcv, b0);
-#endif
-}
-
-
-float PMSM_FOC_Get_Real_dqVector(void) {
-	if (gFoc_Ctrl.out.s_RealCurrentFiltered == 0) {
-		gFoc_Ctrl.out.s_RealCurrentFiltered = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));
-	}
-	return gFoc_Ctrl.out.s_RealCurrentFiltered;
-}
-
-PMSM_FOC_Ctrl *PMSM_FOC_Get(void) {
-	return &gFoc_Ctrl;
-}
-
-void PMSM_FOC_Start(u8 nCtrlMode) {
-	if (gFoc_Ctrl.in.b_motEnable) {
-		return;
-	}
-	PMSM_FOC_CoreInit();
-	eCtrl_Reset();
-	gFoc_Ctrl.in.n_ctlMode = nCtrlMode;
-	gFoc_Ctrl.in.b_motEnable = true;
-}
-
-void PMSM_FOC_Stop(void) {
-	if (!gFoc_Ctrl.in.b_motEnable) {
-		return;
-	}
-	PMSM_FOC_CoreInit();
-	gFoc_Ctrl.in.b_motEnable = false;
-}
-
-bool PMSM_FOC_Is_Start(void) {
-	return gFoc_Ctrl.in.b_motEnable;
-}
-
-void PMSM_FOC_DCCurrLimit(float ibusLimit) {
-	if (ibusLimit > gFoc_Ctrl.hwLim.s_iDCMax) {
-		ibusLimit = gFoc_Ctrl.hwLim.s_iDCMax;
-	}
-	if (gFoc_Ctrl.protLim.s_iDCLim != HW_LIMIT_NONE) {
-		ibusLimit = min(ibusLimit, gFoc_Ctrl.protLim.s_iDCLim);
-	}
-	gFoc_Ctrl.userLim.s_iDCLim = ibusLimit;
-
-	if (ABS(gFoc_Ctrl.in.s_motVelocity) <= CONFIG_ZERO_SPEED_RPM){
-		eRamp_reset_target(&gFoc_Ctrl.rtLim.DCCurrLimRamp, ibusLimit);
-	}else {
-		eRamp_set_step_target(&gFoc_Ctrl.rtLim.DCCurrLimRamp, ibusLimit, CONFIG_eCTRL_STEP_TS);
-	}
-}
-
-float PMSM_FOC_GetDCCurrLimit(void) {
-	return gFoc_Ctrl.userLim.s_iDCLim;
-}
-
-void PMSM_FOC_SpeedRampLimit(float speedLimit, float speed) {
-	if (speedLimit > gFoc_Ctrl.hwLim.s_motRPMMax) {
-		speedLimit = gFoc_Ctrl.hwLim.s_motRPMMax;
-	}
-	gFoc_Ctrl.userLim.s_motRPMLim = (speedLimit);
-	if (ABS(speed) <= CONFIG_ZERO_SPEED_RPM) {
-		eRamp_reset_target(&gFoc_Ctrl.rtLim.rpmLimRamp, speedLimit);
-	}else {
-		eRamp_set_step_target(&gFoc_Ctrl.rtLim.rpmLimRamp, speedLimit, CONFIG_eCTRL_STEP_TS);
-	}
-}
-
-void PMSM_FOC_SpeedLimit(float speedLimit) {
-	PMSM_FOC_SpeedRampLimit(speedLimit, gFoc_Ctrl.in.s_motVelocity);
-}
-
-void PMSM_FOC_SpeedDirectLimit(float limit) {
-	PMSM_FOC_SpeedRampLimit(limit, 0);
-}
-
-
-float PMSM_FOC_GetSpeedLimit(void) {
-	return gFoc_Ctrl.userLim.s_motRPMLim;
-}
-
-void PMSM_FOC_TorqueLimit(float torqueLimit) {
-	if (torqueLimit > gFoc_Ctrl.hwLim.s_torqueMax) {
-		torqueLimit = gFoc_Ctrl.hwLim.s_torqueMax;
-	}
-
-	if (gFoc_Ctrl.protLim.s_TorqueLim != HW_LIMIT_NONE) {
-		torqueLimit = min(torqueLimit, gFoc_Ctrl.protLim.s_TorqueLim);
-	}
-
-	gFoc_Ctrl.userLim.s_torqueLim = torqueLimit;
-
-	if (ABS(gFoc_Ctrl.in.s_motVelocity) <= CONFIG_ZERO_SPEED_RPM){
-		eRamp_reset_target(&gFoc_Ctrl.rtLim.torqueLimRamp, torqueLimit);
-	}else {
-		eRamp_set_step_target(&gFoc_Ctrl.rtLim.torqueLimRamp, torqueLimit, CONFIG_eCTRL_STEP_TS);
-	}
-}
-float PMSM_FOC_GetTorqueLimit(void) {
-	return gFoc_Ctrl.userLim.s_torqueLim;
-}
-
-void PMSM_FOC_SetEbrkTorque(s16 torque) {
-	gFoc_Ctrl.userLim.s_TorqueBrkLim = (float)torque;
-	//gFoc_Ctrl.userLim.s_iDCeBrkLim = fclamp(dc_curr, 0, nv_get_foc_params()->s_iDCeBrkLim);
-}
-
-float PMSM_FOC_GetEbrkTorque(void) {
-	if (!foc_observer_is_encoder()) {
-		return 0; //无感运行关闭能量回收
-	}
-	return gFoc_Ctrl.userLim.s_TorqueBrkLim;
-}
-
-float PMSM_FOC_GetVbusVoltage(void) {
-	return gFoc_Ctrl.in.s_vDC;
-}
-
-float PMSM_FOC_GetVbusCurrent(void) {
-	return gFoc_Ctrl.out.s_FilteriDC;
-}
-
-DQ_t* PMSM_FOC_GetDQCurrent(void) {
-	return &gFoc_Ctrl.out.s_RealIdq;
-}
-
-bool PMSM_FOC_SetCtrlMode(u8 mode) {
-	if (mode > CTRL_MODE_EBRAKE) {
-		PMSM_FOC_SetErrCode(FOC_Param_Err);
-		return false;
-	}
-	gFoc_Ctrl.in.n_ctlMode = mode;
-	return true;
-}
-
-
-u8 PMSM_FOC_GetCtrlMode(void) {
-	return gFoc_Ctrl.in.n_ctlMode;
-}
-
-void PMSM_FOC_PhaseCurrLim(float lim) {
-	if (lim > gFoc_Ctrl.hwLim.s_PhaseCurrMax) {
-		lim = gFoc_Ctrl.hwLim.s_PhaseCurrMax;
-	}
-	gFoc_Ctrl.userLim.s_PhaseCurrLim = lim;
-}
-
-void PMSM_FOC_RT_PhaseCurrLim(float lim) {
-	if (lim > gFoc_Ctrl.hwLim.s_PhaseCurrMax) {
-		lim = gFoc_Ctrl.hwLim.s_PhaseCurrMax;
-	}
-	eRamp_init_target2(&gFoc_Ctrl.rtLim.torqueLimRamp, lim, CONFIG_LIMIT_RAMP_TIME);
-}
-
-float PMSM_FOC_GetPhaseCurrLim(void) {
-	return gFoc_Ctrl.userLim.s_PhaseCurrLim;
-}
-
-void PMSM_FOC_SetOpenVdq(float vd, float vq) {
-	FOC_Set_vDqRamp(&gFoc_Ctrl.vdq_ctl[0], vd);
-	FOC_Set_vDqRamp(&gFoc_Ctrl.vdq_ctl[1], vq);
-}
-
-void PMSM_FOC_SetOpenVdq_Immediate(float vd, float vq) {
-	gFoc_Ctrl.vdq_ctl[0].s_Step = 0;
-	gFoc_Ctrl.vdq_ctl[0].s_FinalTgt = vd;
-	gFoc_Ctrl.vdq_ctl[0].s_Cp = vd;
-
-	gFoc_Ctrl.vdq_ctl[1].s_Step = 0;
-	gFoc_Ctrl.vdq_ctl[1].s_FinalTgt = vq;
-	gFoc_Ctrl.vdq_ctl[1].s_Cp = vq;
-}
-
-bool PMSM_FOC_EnableCruise(bool enable) {
-	if (enable != gFoc_Ctrl.in.b_cruiseEna) {
-		float motSpd = PMSM_FOC_GetSpeed();
-		if (enable && (motSpd < CONFIG_MIN_CRUISE_RPM)) { //
-			PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
-			return false;
-		}
-		eRamp_reset_target(&gFoc_Ctrl.in.cruiseRpmRamp, motSpd);
-		gFoc_Ctrl.in.s_cruiseRPM = motSpd;
-		gFoc_Ctrl.in.b_cruiseEna = enable;
-	}
-	
-	return true;
-}
-
-bool PMSM_FOC_PauseCruise(void) {
-	gFoc_Ctrl.in.b_cruiseEna = false;
-	return true;
-}
-
-bool PMSM_FOC_ResumeCruise(void) {
-	gFoc_Ctrl.in.b_cruiseEna = true;
-	eRamp_init_target2(&gFoc_Ctrl.in.cruiseRpmRamp, PMSM_FOC_GetSpeed(), CONFIG_CRUISE_RAMP_TIME);
-	eRamp_set_step_target(&gFoc_Ctrl.in.cruiseRpmRamp, gFoc_Ctrl.in.s_cruiseRPM, CONFIG_eCTRL_STEP_TS);
-	return true;
-}
-
-bool PMSM_FOC_Is_CruiseEnabled(void) {
-	return (gFoc_Ctrl.in.b_cruiseEna && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD));
-}
-
-bool PMSM_FOC_Set_TgtSpeed(float rpm) {
-	if (gFoc_Ctrl.in.b_cruiseEna) {
-		return false;
-	}
-	eCtrl_set_TgtSpeed(min(ABS(rpm), gFoc_Ctrl.userLim.s_motRPMLim)*SIGN(rpm));
-	return true;
-}
-
-
-bool PMSM_FOC_Set_Current(float is) {
-	if (is > gFoc_Ctrl.userLim.s_PhaseCurrLim) {
-		is = gFoc_Ctrl.userLim.s_PhaseCurrLim;
-	}else if (is < -gFoc_Ctrl.userLim.s_PhaseCurrLim) {
-		is = -gFoc_Ctrl.userLim.s_PhaseCurrLim;
-	}
-	eCtrl_set_TgtCurrent(is);
-	return true;
-}
-
-bool PMSM_FOC_Set_Torque(float trq) {
-	if (trq > gFoc_Ctrl.userLim.s_torqueLim) {
-		trq = gFoc_Ctrl.userLim.s_torqueLim;
-	}else if (trq < -gFoc_Ctrl.userLim.s_torqueLim) {
-		trq = -gFoc_Ctrl.userLim.s_torqueLim;
-	}
-	eCtrl_set_TgtTorque(trq);
-	return true;
-}
-
-void PMSM_FOC_Reset_Torque(void) {
-	float real_trq = PMSM_FOC_Get_Real_dqVector();
-	eCtrl_reset_Torque(real_trq);
-}
-
-bool PMSM_FOC_Set_CruiseSpeed(float rpm) {
-	if (PMSM_FOC_Is_CruiseEnabled()) {
-		if (rpm < CONFIG_MIN_CRUISE_RPM) {
-			rpm = CONFIG_MIN_CRUISE_RPM;
-		}
-		gFoc_Ctrl.in.s_cruiseRPM = min(ABS(rpm), gFoc_Ctrl.userLim.s_motRPMLim)*SIGN(rpm);
-		eRamp_set_step_target(&gFoc_Ctrl.in.cruiseRpmRamp, gFoc_Ctrl.in.s_cruiseRPM, CONFIG_eCTRL_STEP_TS);
-		return true;
-	}
-	PMSM_FOC_SetErrCode(FOC_NotCruiseMode);
-	return false;
-}
-
-void PMSM_FOC_MTPA_Calibrate(bool enable) {
-	if (enable) {
-		gFoc_Ctrl.in.b_MTPA_calibrate = true;
-		gFoc_Ctrl.in.s_dqAngle = 0;
-	}else {
-		gFoc_Ctrl.in.s_dqAngle = INVALID_ANGLE;
-		gFoc_Ctrl.in.b_MTPA_calibrate = false;
-	}
-}
-
-void PMSM_FOC_Set_MotAngle(float angle) {
-	gFoc_Ctrl.in.s_manualAngle = (angle);
-}
-
-void PMSM_FOC_Set_Dq_Angle(float angle) {
-	gFoc_Ctrl.in.s_dqAngle = (angle);
-}
-
-void PMSM_FOC_Get_TgtIDQ(DQ_t * dq) {
-	dq->d = gFoc_Ctrl.in.s_targetIdq.d;
-	dq->q = gFoc_Ctrl.in.s_targetIdq.q;
-}
-
-float PMSM_FOC_GetSpeed(void) {
-	float speed = gFoc_Ctrl.in.s_motVelocity;
-	if (!gFoc_Ctrl.in.b_motEnable || foc_observer_is_encoder()) {
-		speed = motor_encoder_get_speed();
-	}else {
-		if (foc_observer_sensorless_stable()) {
-			speed = foc_observer_sensorless_speed();
-		}else {
-			speed = 0;
-		}
-	}
-	return speed;
-}
-
-
-void PMSM_FOC_AutoHold(bool lock) {
-	if (gFoc_Ctrl.in.b_AutoHold != lock) {
-		motor_encoder_lock_pos(lock);
-		PI_Controller_Reset(&gFoc_Ctrl.pi_lock, 0);
-		if (!lock) {
-			float hold_torque = gFoc_Ctrl.in.s_targetTorque * 1.1f;
-			if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
-#ifdef CONFIG_SPEED_LADRC
-				ladrc_reset(&gFoc_Ctrl.vel_lim_adrc, 0, hold_torque);
-#else
-				PI_Controller_Reset(&gFoc_Ctrl.pi_vel_lim, hold_torque);
-#endif
-			}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD) {
-#ifdef CONFIG_SPEED_LADRC
-				ladrc_reset(&gFoc_Ctrl.vel_adrc, 0, hold_torque);
-#else
-				PI_Controller_Reset(&gFoc_Ctrl.pi_vel, hold_torque);
-#endif
-			}
-			etcs_reset_torque(hold_torque);
-			gFoc_Ctrl.out.f_autohold_trq = hold_torque;
-		}else {
-			gFoc_Ctrl.out.f_autohold_trq = 0;
-		}
-		gFoc_Ctrl.in.b_AutoHold = lock;
-	}
-}
-
-
-bool PMSM_FOC_AutoHoldding(void) {
-	return gFoc_Ctrl.in.b_AutoHold;
-}
-
-static PI_Controller *_pid(u8 id) {
-	PI_Controller *pi = NULL;
-	if (id == PID_ID_ID) {
-		pi = &gFoc_Ctrl.pi_id;
-	}else if (id == PID_IQ_ID) {
-		pi = &gFoc_Ctrl.pi_iq;
-	}else if (id == PID_VelLim_ID) {
-#ifndef CONFIG_SPEED_LADRC
-		pi = &gFoc_Ctrl.pi_vel_lim;
-#endif
-	}else if (id == PID_Vel_ID) {
-#ifndef CONFIG_SPEED_LADRC
-		pi = &gFoc_Ctrl.pi_vel;
-#endif
-	}else if (id == PID_AutoHold_ID) {
-		pi = &gFoc_Ctrl.pi_lock;
-	}
-	return pi;
-}
-
-void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kd) {
-	if (id > PID_Max_ID) {
-		return;
-	}
-	PI_Controller *pi = _pid(id);
-	if (pi != NULL) {
-		pi->kp = kp;
-		pi->ki = ki;
-		pi->kd = kd;
-	}
-}
-
-void PMSM_FOC_GetPid(u8 id, float *kp, float *ki, float *kd) {
-	if (id > PID_Max_ID) {
-		return;
-	}
-	PI_Controller *pi = _pid(id);
-	if (pi != NULL) {
-		*kp = pi->kp;
-		*ki = pi->ki;
-		*kd = pi->kd;
-	}
-}
-
-void PMSM_FOC_SetErrCode(u8 error) {
-	if (gFoc_Ctrl.out.n_Error != error) {
-		gFoc_Ctrl.out.n_Error = error;
-	}
-}
-
-u8 PMSM_FOC_GetErrCode(void) {
-	return gFoc_Ctrl.out.n_Error;
-}
-
-
-void PMSM_FOC_Set_PlotType(Plot_t t) {
-	gFoc_Ctrl.plot_type = t;
-}
-//获取母线电流和实际输出电流矢量大小
-void PMSM_FOC_Calc_Current(void) {
-	float vd = gFoc_Ctrl.out.s_OutVdq.d - gFoc_Ctrl.out.s_OutVdqDTC.d * TWO_BY_THREE;
-	float vq = gFoc_Ctrl.out.s_OutVdq.q - gFoc_Ctrl.out.s_OutVdqDTC.q * TWO_BY_THREE;
-
-	float id = gFoc_Ctrl.out.s_FilterIdq.d;
-	float iq = gFoc_Ctrl.out.s_FilterIdq.q;
-    /*
-		根据公式(等幅值变换,功率不等):
-		iDC x vDC = 3/2(iq x vq + id x vd);
-	*/
-	float m_pow = (vd * id + vq * iq);
-	float raw_idc = 0.0f;
-	float v_dc = get_vbus_float();
-	if (v_dc != 0.0f) {
-		raw_idc = m_pow / v_dc;
-	}
-	LowPass_Filter(gFoc_Ctrl.out.s_CalciDC, raw_idc, 0.02f);
-
-	m_pow = (gFoc_Ctrl.out.s_SamplevDQ.d * id + gFoc_Ctrl.out.s_SamplevDQ.q * iq) * 1.5f;
-	if (v_dc != 0.0f) {
-		raw_idc = m_pow / v_dc;
-	}
-	LowPass_Filter(gFoc_Ctrl.out.s_CalciDC2, raw_idc, 0.02f);
-
-	raw_idc = get_vbus_current();
-	if (raw_idc != NO_VALID_CURRENT) {
-		LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.05f);
-	}else {
-		gFoc_Ctrl.out.s_FilteriDC = gFoc_Ctrl.out.s_CalciDC;
-	}
-
-	gFoc_Ctrl.out.s_RealCurrentFiltered = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));
-
-}
-
-void PMSM_FOC_Brake(bool brake) {
-	gFoc_Ctrl.in.b_eBrake = brake;
-	if (gFoc_Ctrl.in.b_eBrake & gFoc_Ctrl.in.b_cruiseEna) {
-		gFoc_Ctrl.in.b_cruiseEna = false;
-	}
-	eCtrl_brake_signal(brake);
-}
-

+ 0 - 320
Applications/foc/core/PMSM_FOC_Core_unused.h

@@ -1,320 +0,0 @@
-#ifndef _PMSM_FOC_Core_H__
-#define _PMSM_FOC_Core_H__
-#include "math/fix_math.h"
-#include "foc/core/PI_Controller.h"
-#include "foc/core/e_ctrl.h"
-#include "foc/core/adrc.h"
-
-typedef struct {
-	float a;
-	float b;
-}AB_t;
-
-typedef struct {
-	float d;
-	float q;
-}DQ_t;
-
-typedef enum {
-	EPM_Dir_None,
-	EPM_Dir_Back,
-	EPM_Dir_Forward,
-}EPM_Dir_t;
-
-typedef enum {
-	Plot_None,
-	Plot_Phase_curr,
-	Plot_DQ_Curr,
-	Plot_Phase_vol,
-	Plot_Spd_flow,
-	Plot_D_flow,
-	Plot_Q_flow,
-	Plot_D_Step,
-	Plot_Q_Step,
-	Plot_SMO_OBS,
-	Plot_t_Max,
-}Plot_t;
-
-typedef enum {
-	FOC_Success = 0,
-	FOC_NotAllowed = 1,
-	FOC_Have_CritiCal_Err,
-	FOC_Throttle_Err, //ready的时候检测到转把信号
-	FOC_NowAllowed_With_Speed,
-	FOC_Speed_TooLow,
-	FOC_NotCruiseMode,
-	FOC_Param_Err,
-	FOC_MEM_Err,
-	FOC_CRC_Err,
-	FOC_Unknow_Cmd,
-}FOC_ErrCode_t;
-
-typedef enum {
-	FOC_CRIT_OV_Vol_Err,
-	FOC_CRIT_UN_Vol_Err,
-	FOC_CRIT_ACC_OV_Err,
-	FOC_CRIT_ACC_Un_Err,
-	FOC_CRIT_Phase_Err,
-	FOC_CRIT_Encoder_Err, /* 编码器错误,可能还是可以骑行,取决无感是否稳定 */
-	FOC_CRIT_Angle_Err, /* FOC 角度错误,一般发生在编码器错误,同时无感没有稳定的情况下,必须要停机 */
-	FOC_CRIT_CURR_OFF_Err,
-	FOC_CRIT_H_MOS_Err,
-	FOC_CRIT_L_MOS_Err,
-	FOC_CRIT_Phase_Conn_Err,
-	FOC_CRIT_MOTOR_TEMP_Lim,
-	FOC_CRIT_MOS_TEMP_Lim,
-	FOC_CRIT_Fan_Err,
-	FOC_CRIT_IDC_OV,
-	FOC_CRIT_THRO_Err,
-	FOC_CRIT_ENC_AB_Err,
-	FOC_CRIT_Vol_HW_Err, //17
-	FOC_CRIT_PHASE_UNBalance_Err, /* 三相不平衡错误,比如相线螺丝松了 */
-	FOC_CRIT_THRO2_Err,
-	FOC_CRIT_MOT_TEMP_Sensor,
-	FOC_CRIT_MOS_TEMP_Sensor,  //21
-	FOC_CRIT_BRK_Err,
-	FOC_CRIT_Err_Max = 32,
-}FOC_CritiCal_Ebit_t;
-
-typedef enum {
-	FOC_EV_MOT_Limit_L=FOC_CRIT_Err_Max + 1,
-	FOC_EV_MOS_Limit_L,
-	FOC_EV_THRO_START_V,
-	FOC_START_Err_Code,
-}FOC_EVENT_R_t;
-
-#define FOC_Cri_Err_Mask(err) (1<<(err))
-
-typedef struct {
-	u8 	  n_poles;
-	float n_modulation;
-	float lq;
-	float ld;
-	float flux;
-}FOC_Params;
-
-typedef struct {
-	float 	s_iABC[3];
-	float 	s_iABCFilter[3];
-	float   s_iABC_DT[3]; //abc phase current for deadtime compesition
-	float   s_SamplePhaseV[3]; //相对地电压
-	float   s_motVelocity;   //from hall or encoder
-	float 	s_motAngle; //from hall or encoder
-	float   s_angleLast;
-	float   s_targetRPM;
-	float   s_cruiseRPM;
-	e_Ramp  cruiseRpmRamp;
-	float 	s_targetCurrent;
-	DQ_t    s_targetIdq;
-	DQ_t    s_targetVdq;
-	float   s_targetTorque; //限速后的实际扭矩
-	float 	s_vDC;
-	u8      n_ctlMode;
-	bool    b_motEnable;
-	bool    b_cruiseEna;
-	bool    b_AutoHold;
-	bool    b_eBrake;
-	bool    b_epmMode;
-	bool    b_fwEnable;
-	float   s_motVelocityFiltered; //电机滤波后的转速
-	float   s_motVelRadusPers; //电机的电角速度
-	volatile bool    b_MTPA_calibrate;
-	float   s_manualAngle; //mainly used when calibrate hall/mtpa.
-	float   s_dqAngle; //D轴电流超前角
-}FOC_InP;
-
-typedef struct {
-	float s_motRPMLim;
-	float s_torqueLim;
-	float s_iDCLim;
-	float s_PhaseCurrLim; //最大相电流
-	float s_iDCeBrkLim; //最大母线回收电流
-	float s_TorqueBrkLim;
-	float s_PhaseVoleBrkLim;
-	float s_vDCMinLim;
-	float s_vDCMaxLim;
-}FOC_UserLimit;
-
-typedef struct {
-	e_Ramp rpmLimRamp;
-	e_Ramp torqueLimRamp;
-	e_Ramp DCCurrLimRamp;
-}FOC_RTLimit;
-
-typedef struct {
-	float s_motRPMMax;
-	float s_PhaseCurrMax;
-	float s_PhaseVolMax;
-	float s_FWDCurrMax; //D轴最大退磁电流
-	float s_iDCMax;
-	float s_vDCMax;
-	float s_torqueMax;
-}FOC_HwLimit;
-
-typedef struct {
-	float s_iDCLim;
-	float s_TorqueLim;
-}FOC_ProtLimit;
-
-typedef struct {
-	u16   n_Duty[3];
-	u16   n_lowDuty;
-	u16   n_midDuty;
-	u8    n_Sector;
-	u8    n_CPhases;
-	u16   n_Sample1;
-	u16   n_Sample2;
-	u8    n_RunMode;
-	DQ_t  s_OutVdq;
-	DQ_t  s_OutVdqDTC;
-	AB_t  s_OutVAB;
-	DQ_t  s_RealIdq;
-	DQ_t  s_RealVdq;
-	DQ_t  s_FilterIdq;
-	AB_t  s_SampleAB;
-	DQ_t  s_SamplevDQ;
-	float s_FilteriDC;
-	float s_CalciDC;
-	float s_CalciDC2;
-	float s_RealCurrentFiltered;
-	float f_vdqRation;
-	float f_autohold_trq;
-	s16   test_sample;
-	float sin;
-	float cos;
-	u8    n_Error;
-	bool  empty_load; //空载运行
-}FOC_OutP;
-
-typedef struct {
-	float s_FinalTgt;
-	float s_Cp;
-	float s_Step;
-	int      n_CtrlCount;
-	int      n_StepCount;
-}dq_Rctrl; //dq ramp ctrl
-
-typedef struct {
-	PI_Controller pi_id;
-	PI_Controller pi_iq;
-	PI_Controller pi_lock;
-	PI_Controller pi_power;
-#ifdef CONFIG_SPEED_LADRC
-	ladrc_t        vel_lim_adrc;
-	ladrc_t        vel_adrc;
-#else
-	PI_Controller pi_vel_lim;
-	PI_Controller pi_vel;
-#endif
-	dq_Rctrl      idq_ctl[2];
-	dq_Rctrl      vdq_ctl[2];	
-	FOC_InP       in;
-	FOC_OutP      out;
-	FOC_Params    params;
-	FOC_UserLimit userLim;
-	FOC_HwLimit   hwLim;
-	FOC_ProtLimit protLim;
-	FOC_RTLimit   rtLim;
-	Plot_t        plot_type;
-	int           ctrl_count;
-}PMSM_FOC_Ctrl;
-
-#define CTRL_MODE_OPEN                      ((u8)0U)
-#define CTRL_MODE_SPD                       ((u8)1U)
-#define CTRL_MODE_TRQ                       ((u8)2U)
-#define CTRL_MODE_CURRENT                   ((u8)3U)
-#define CTRL_MODE_EBRAKE               ((u8)4U)
-
-#define FOC_CALIMOD_HALL               ((u8) 1U)
-#define FOC_CALIMOD_MTPA               ((u8) 2U)
-
-#define FOC_LIM_NO_CHANGE  0
-#define FOC_LIM_CHANGE_H   1
-#define FOC_LIM_CHANGE_L   2
-
-#if 1
-#define SECTOR_1  0u
-#define SECTOR_2  1u
-#define SECTOR_3  2u
-#define SECTOR_4  3u
-#define SECTOR_5  4u
-#define SECTOR_6  5u
-#define SECTOR_UKNOW 0xFF
-#else
-#define SECTOR_1  3u
-#define SECTOR_2  4u
-#define SECTOR_3  5u
-#define SECTOR_4  0u
-#define SECTOR_5  1u
-#define SECTOR_6  2u
-#endif
-
-PMSM_FOC_Ctrl *PMSM_FOC_Get(void);
-void PMSM_FOC_CoreInit(void);
-bool PMSM_FOC_Schedule(void);
-u8 PMSM_FOC_CtrlMode(void);
-void PMSM_FOC_idqCalc(void);
-void PMSM_FOC_Start(u8 nCtrlMode);
-void PMSM_FOC_Stop(void);
-void PMSM_FOC_DCCurrLimit(float ibusLimit);
-void PMSM_FOC_SpeedLimit(float speedLimit);
-float PMSM_FOC_GetSpeedLimit(void);
-float PMSM_FOC_GetVbusVoltage(void);
-float PMSM_FOC_GetVbusCurrent(void);
-DQ_t  *PMSM_FOC_GetDQCurrent(void);
-bool PMSM_FOC_SetCtrlMode(u8 mode);
-u8 PMSM_FOC_GetCtrlMode(void);
-void PMSM_FOC_SetOpenVdq(float vd, float vq);
-void PMSM_FOC_SetOpenVdq_Immediate(float vd, float vq);
-bool PMSM_FOC_EnableCruise(bool enable);
-bool PMSM_FOC_Set_TgtSpeed(float rpm);
-bool PMSM_FOC_Set_Torque(float trque);
-bool PMSM_FOC_Set_Current(float current);
-bool PMSM_FOC_Set_CruiseSpeed(float rpm);
-float PMSM_FOC_GetSpeed(void);
-bool PMSM_FOC_Lock_Motor(bool lock);
-void PMSM_FOC_Brake(bool brake);
-void PMSM_FOC_Calc_Current(void);
-void PMSM_FOC_AutoHold(bool lock);
-void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kd);
-void PMSM_FOC_Set_MotAngle(float angle);
-void PMSM_FOC_Set_Dq_Angle(float angle);
-bool PMSM_FOC_Is_Start(void);
-void PMSM_FOC_SetErrCode(u8 error);
-u8 PMSM_FOC_GetErrCode(void);
-void PMSM_FOC_MTPA_Calibrate(bool enable);
-void PMSM_FOC_Get_TgtIDQ(DQ_t * dq);
-void PMSM_FOC_TorqueLimit(float torqueLimit);
-float PMSM_FOC_GetTorqueLimit(void);
-bool PMSM_FOC_Set_epmMode(bool epm);
-bool PMSM_FOC_is_epmMode(void);
-bool PMSM_FOC_Start_epmMove(bool move, EPM_Dir_t dir);
-EPM_Dir_t PMSM_FOC_Get_epmDir(void);
-void PMSM_FOC_SetEbrkTorque(s16 torque);
-float PMSM_FOC_GetEbrkTorque(void);
-void PMSM_FOC_PhaseCurrLim(float lim);
-float PMSM_FOC_GetPhaseCurrLim(void);
-float PMSM_FOC_GetDCCurrLimit(void);
-void PMSM_FOC_GetRunningStatus(u8 *data);
-bool PMSM_FOC_Is_CruiseEnabled(void);
-void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kd);
-void PMSM_FOC_GetPid(u8 id, float *kp, float *ki, float *kd);
-bool PMSM_FOC_AutoHoldding(void);
-void PMSM_FOC_Slow_Task(void);
-void PMSM_FOC_Set_PlotType(Plot_t t);
-u8   PMSM_FOC_RunTime_Limit(void);
-void PMSM_FOC_RT_PhaseCurrLim(float lim);
-void PMSM_FOC_RT_LimInit(void);
-float PMSM_FOC_Get_Real_dqVector(void);
-void PMSM_FOC_Reset_Torque(void);
-void PMSM_FOC_SpeedDirectLimit(float limit);
-bool PMSM_FOC_iDC_is_Limited(void);
-bool PMSM_FOC_Torque_is_Limited(void);
-bool PMSM_FOC_PauseCruise(void);
-bool PMSM_FOC_ResumeCruise(void);
-void PMSM_FOC_Change_VelLoop_Params(float wcv, float b0);
-void PMSM_FOC_Change_TrqLoop_Params(float wcv, float b0);
-void PMSM_FOC_ABC2Dq(float a, float b, float c, float *d, float *q);
-
-#endif /* _PMSM_FOC_Core_H__ */
-

+ 0 - 255
Applications/foc/core/e_ctrl_unused.h

@@ -1,255 +0,0 @@
-#ifndef EBRAKE_CTRL_H__
-#define EBRAKE_CTRL_H__
-#include "os/os_types.h"
-#include "foc/core/ramp_ctrl.h"
-#include "foc/foc_config.h"
-#include "math/fast_math.h"
-#include "math/fix_math.h"
-
-typedef struct {
-	float start;
-	float target;
-	float interpolation;
-	float step_val;
-	float first_target;
-	float first_step;
-	float A;
-	float acct;
-	float dect;
-	float time;
-}e_Ramp;
-
-typedef struct {
-	u16  ebrk_time; //能量回收,时间越短,刹车性能或者回收越好
-	u16  accl_time; //加速时间(ms),时间越短,加速性能越好
-	u16  dec_time;  //降速时间
-	bool hw_brake;
-	bool is_ebrake;
-	u32  brake_ts;//检测到刹车开始时间
-	e_Ramp current;
-	e_Ramp torque;
-	e_Ramp speed;
-	u16  ebrk_time_shadow;
-	u16  accl_time_shadow;
-	u16  dec_time_shadow;
-	float ebrake_current;
-	float current_shadow;
-	float torque_shadow;
-	float speed_shadow;
-}e_Ctrl;
-
-static void eRamp_init(e_Ramp *r, u32 acc, u32 dec) {
-	r->start = 0;
-	r->target = 0;
-	r->first_target = 0;
-	r->interpolation = 0;
-	r->step_val = 0;
-	r->first_step = 0;
-	r->acct = (float)acc;
-	r->dect = (float)dec;
-}
-
-static void eRamp_init_target(e_Ramp *r, float target, u32 acc, u32 dec) {
-	r->start = target;
-	r->target = target;
-	r->first_target = target;
-	r->interpolation = target;
-	r->step_val = 0;
-	r->first_step = 0;
-	r->acct = (float)acc;
-	r->dect = (float)dec;
-}
-
-static void eRamp_init_target2(e_Ramp *r, float target, u32 time) {
-	eRamp_init_target(r, target, time, time);
-} 
-
-
-static void eRamp_reset_target(e_Ramp *r, float target) {
-	r->start = target;
-	r->target = target;
-	r->first_target = target;
-	r->interpolation = target;
-	r->step_val = 0;
-	r->first_step = 0;
-}
-static void eRamp_set_time(e_Ramp *r, u32 acc, u32 dec) {
-	r->acct = (float)acc;
-	r->dect = (float)dec;
-}
-
-static void eRamp_set_target(e_Ramp *r, float target) {
-	r->target = target;
-}
-static void eRamp_set_step(e_Ramp *r, float step) {
-	r->step_val = step;
-}
-
-static void eRamp_running(e_Ramp *r) {
-	float target = r->interpolation + r->step_val;
-	if (r->step_val < 0) {
-		if (target < r->target) {
-			target = r->target;
-		}
-	}else {
-		if (target > r->target) {
-			target = r->target;
-		}
-	}
-	r->interpolation = target;	
-}
-
-static float eRamp_get_intepolation(e_Ramp *r) {
-	return r->interpolation;
-}
-
-static float eRamp_get_target(e_Ramp *r) {
-	return r->target;
-}
-
-static void eRamp_set_step_target(e_Ramp *ramp, float c, u32 intval) {
-	float c_now = eRamp_get_intepolation(ramp);
-	float step_val = 0;
-	float delta = c - c_now;
-	float step_ms = intval;
-
-	if (delta >= 0) {
-		step_val = (delta)/(ramp->acct/step_ms);
-	}else {
-		step_val = (delta)/(ramp->dect/step_ms);
-	}
-	eRamp_set_target(ramp, c);
-	eRamp_set_step(ramp, step_val);
-}
-
-#if 0
-extern float PMSM_FOC_GetSpeed(void);
-static void eRamp_X2_running(e_Ramp *r) {
-#if 1
-	float target = r->target;
-	float v_now = r->interpolation;
-	bool cross_zero = false;
-	if (target > 0) {
-		if (v_now >= -CONFIG_RAMP_SECOND_TARGET && v_now <= CONFIG_RAMP_SECOND_TARGET * 1.5f) {
-			if (PMSM_FOC_GetSpeed() <= 20.0f) {
-				step_towards(&r->interpolation, target, 0.02f);
-			}else {
-				step_towards(&r->interpolation, target, 0.04f);
-			}
-			cross_zero = true;
-		}
-	}else if (target == 0) {
-		if (v_now >= 0 && v_now <= CONFIG_RAMP_SECOND_TARGET) {
-			step_towards(&r->interpolation, target, 0.01f);
-			cross_zero = true;
-		}
-	}else {
-		if (v_now >= -CONFIG_RAMP_SECOND_TARGET && v_now <= CONFIG_RAMP_SECOND_TARGET) {
-			step_towards(&r->interpolation, target, 0.01f);
-			cross_zero = true;
-		}
-	}
-	if (!cross_zero) {
-		step_towards(&r->interpolation, target, 1.0f);
-	}
-#else
-	if (r->first_step != 0) {
-		float interpolation = r->interpolation + r->first_step;
-		if ((r->first_step > 0) && (interpolation >= r->first_target)) {
-			interpolation = r->first_target;
-			r->first_step = r->first_target = 0;
-		}else if ((r->first_step < 0) && (interpolation <= r->first_target)) {
-			interpolation = r->first_target;
-			r->first_step = r->first_target = 0;
-		}
-		r->interpolation = interpolation;
-		return;
-	}
-	
-	eRamp_running(r);
-#endif
-}
-#else
-static void eRamp_X2_running(e_Ramp *r) {
-	eRamp_running(r);
-}
-#endif
-
-#if 0
-static void eRamp_set_X2_target(e_Ramp *r, float c) {
-#if 1
-	eRamp_set_target(r, c);
-#else
-	float c_now = eRamp_get_intepolation(ramp);
-	float step_val = 0;
-	float delta = c - c_now;
-
-	float step_ms = CONFIG_eCTRL_STEP_TS;	
-	if (delta > 0) {
-		step_val = (delta)/(ramp->acct/step_ms);
-		if (step_val > CONFIG_RAMP_SECOND_STEP) {
-			float first_delta = min(delta, CONFIG_RAMP_SECOND_TARGET);
-			ramp->first_target = c_now + first_delta;
-			ramp->first_step = CONFIG_RAMP_SECOND_STEP;
-			delta -= first_delta;
-			step_val = (delta)/(ramp->acct/step_ms);
-		}else {
-			ramp->first_target = ramp->first_step = 0.0f;
-		}
-	}else if (delta < 0){
-		step_val = (delta)/(ramp->dect/step_ms);
-		if (ABS(step_val) > CONFIG_RAMP_SECOND_STEP) {
-			float first_delta = MAX(delta, -CONFIG_RAMP_SECOND_TARGET);
-			ramp->first_target = c_now + first_delta;
-			ramp->first_step = -CONFIG_RAMP_SECOND_STEP;
-			delta -= first_delta;
-			step_val = (delta)/(ramp->dect/step_ms);
-		}else {
-			ramp->first_target = ramp->first_step = 0.0f;
-		}
-	}else {
-		step_val = 0;
-		ramp->first_step = ramp->first_target = 0;
-	}
-	eRamp_set_target(ramp, c);
-	eRamp_set_step(ramp, step_val);
-
-#endif
-}
-#else
-static void eRamp_set_X2_target(e_Ramp *r, float c) {
-	eRamp_set_step_target(r, c, CONFIG_eCTRL_STEP_TS);
-}
-
-#endif
-extern e_Ctrl g_eCtrl;
-static u16 eCtrl_get_torque_acc_time(void) {
-	return (u16)g_eCtrl.torque.acct;
-}
-
-static void eCtrl_Set_eBrk_RampTime(u16 t) {
-	g_eCtrl.ebrk_time_shadow = t;
-}
-
-//y=Ax^2;
-void eCtrl_init(u16 accl_time, u16 dec_time);
-void eCtrl_brake_signal(bool hw_brake);
-bool eCtrl_is_eBrk_Running(void);
-void eCtrl_set_TgtCurrent(float c);
-void eCtrl_set_TgtTorque(float t);
-void eCtrl_set_TgtSpeed(float s);
-bool eCtrl_enable_eBrake(bool enable);
-float eCtrl_get_RefSpeed(void);
-float eCtrl_get_RefCurrent(void);
-float eCtrl_get_RefTorque(void);
-float eCtrl_get_FinalSpeed(void);
-float eCtrl_get_FinalCurrent(void);
-float eCtrl_get_FinalTorque(void);
-void eCtrl_Running(void);
-void eCtrl_Reset(void);
-void eCtrl_reset_Torque(float init_trq);
-void eCtrl_reset_Current(float init_curr);
-void eCtrl_set_accl_time(u16 time);
-
-#endif /* EBRAKE_CTRL_H__ */
-

+ 0 - 52
Applications/foc/core/foc_wapper.c

@@ -1,52 +0,0 @@
-/*
- *	参考 ert_main.c, 对Simulink生成的代码做一次封装
- */
-
-#include <stddef.h>
-#include <stdio.h>              /* This ert_main.c example uses printf/fflush */
-#include "PMSM_Controller.h"           /* Model's header file */
-#include "rtwtypes.h"
-#include "zero_crossing_types.h"
-
-static RT_MODEL rtM_;
-static RT_MODEL *const rtMPtr = &rtM_; /* Real-time model */
-static DW rtDW;                        /* Observable states */
-static PrevZCX rtPrevZCX;              /* Triggered events */
-static ExtU rtU;                       /* External inputs */
-static ExtY rtY;                       /* External outputs */
-
-
-
-void PMSM_FOC_Init(void) {
-	RT_MODEL *const rtM = rtMPtr;	
-	/* Pack model data into RTM */
-	rtM->dwork = &rtDW;
-	rtM->prevZCSigState = &rtPrevZCX;
-	rtM->inputs = &rtU;
-	rtM->outputs = &rtY;
-
-
-	/* Initialize model */
-	PMSM_Controller_initialize(rtM);
-}
-
-
-
-ExtU *PMSM_FOC_GetInputs(void) {
-	return rtMPtr->inputs;
-}
-
-ExtY *PMSM_FOC_GetOutputs(void) {
-	return rtMPtr->outputs;
-}
-
-P *PMSM_FOC_GetParams(void) {
-	return &rtP;
-}
-
-void PMSM_FOC_Step(void) {
-	
-	PMSM_Controller_step(rtMPtr);
-}
-
-

+ 0 - 253
Applications/foc/core/thro_torque.c

@@ -1,253 +0,0 @@
-#include "foc/core/thro_torque.h"
-#include "foc/foc_config.h"
-#include "foc/motor/motor.h"
-#include "foc/motor/motor_param.h"
-#include "foc/core/e_ctrl.h"
-#include "foc/core/PMSM_FOC_Core.h"
-#include "app/nv_storage.h"
-#include "libs/logger.h"
-#include "prot/can_foc_msg.h"
-#include "foc/core/etcs.h"
-#include "foc/motor/throttle.h"
-
-static thro_torque_t _torque;
-
-void thro_torque_reset(void) {
-	_torque.accl = false;
-	_torque.thro_filted = 0.0f;
-	_torque.throttle_opening = _torque.throttle_opening_last = 0.0f;
-	_torque.torque_req = _torque.torque_real = _torque.torque_acc_ = 0.0f;
-	_torque.gear = mc_get_internal_gear();
-}
-
-void thro_torque_init(void) {
-	thro_torque_reset();
-	_torque.spd_filted = 0.0f;
-}
-
-static __INLINE float gear_rpm_torque(u8 torque, s16 max) {
-	return (float)torque/100.0f * max;
-}
-
-float thro_torque_gear_map(s16 rpm, u8 gear) {
-	gear_t *_current_gear = mc_gear_conf_by_gear(gear);
-	if (_current_gear == NULL) {
-		return 0;
-	}
-
-	if (rpm > _current_gear->max_speed) {
-		rpm = _current_gear->max_speed;
-	}
-	if (rpm <= 1000) {
-		return gear_rpm_torque(_current_gear->torque[0], _current_gear->max_torque);
-	}
-
-	for (int i = 1; i < CONFIG_GEAR_SPEED_TRQ_NUM; i++) {
-		if (rpm <= 1000 * (i + 1)) { //线性插值
-			float trq1 = gear_rpm_torque(_current_gear->torque[i-1], _current_gear->max_torque);
-			float min_rpm = (i * 1000);
-			float trq2 = gear_rpm_torque(_current_gear->torque[i], _current_gear->max_torque);
-			float max_rpm = (i + 1) * 1000;
-			return f_map((float)rpm, min_rpm, max_rpm, trq1, trq2);
-		}
-	}
-	return gear_rpm_torque(_current_gear->torque[CONFIG_GEAR_SPEED_TRQ_NUM-1], _current_gear->max_torque);
-}
-
-/* 获取油门开度 */
-float get_throttle_ration(float f_throttle) {
-	if (f_throttle <= throttle_start_vol()) {
-		return 0;
-	}
-	float delta = f_throttle - throttle_start_vol();
-	int ration = (delta * 100.0f) / throttle_vol_range();
-	return ((float)ration)/100.0f;
-}
-
-float thro_ration_to_voltage(float r) {
-	if (r == 0) {
-		return 0;
-	}
-	float vol = throttle_start_vol() + r * throttle_vol_range();
-	return fclamp(vol, 0, throttle_end_vol());
-}
-
-static float _thro_torque_for_accelerate(float ration) {
-	float max_torque = thro_torque_gear_map((s16)_torque.spd_filted, _torque.gear);
-	float thro_torque = max_torque * ration;
-
-	float acc_r = 1.0f;
-	if (_torque.throttle_opening_last < 1.0f) {
-		acc_r = (ration - _torque.throttle_opening_last)/ (1.0f - _torque.throttle_opening_last);
-	}
-	acc_r = fclamp(acc_r, 0, 1.0f);
-	float acc_torque = _torque.torque_real + acc_r * (max_torque - _torque.torque_real);
-	if (acc_torque < 0) {
-		acc_torque = 0;
-	}
-	/*
-	   直接获取油门开度对应的加速扭矩thro_torque 不小于间接计算得到的 acc_torque
-	*/
-	float torque_acc_ = thro_torque - acc_torque;
-	float step = 0.0f;
-	if (torque_acc_ > 0) {
-		float acc_t = mc_gear_conf()->accl_time;
-		step = torque_acc_ / (acc_t + 0.00001f);
-	}else {
-		torque_acc_ = 0;
-	}
-	step_towards(&_torque.torque_acc_, torque_acc_, step);
-	return (acc_torque + _torque.torque_acc_);
-}
-
-
-static float thro_torque_for_accelerate(void) {
-	return _thro_torque_for_accelerate(_torque.throttle_opening);
-}
-
-static float thro_torque_for_decelerate(void) {
-	if (_torque.throttle_opening_last == 0.0f) {
-		return 0;
-	}
-	float dec_r = _torque.throttle_opening / _torque.throttle_opening_last;
-	dec_r = fclamp(dec_r, 0.0f, 1.0f);
-	return dec_r * _torque.torque_real;
-}
-
-static void thro_torque_request(void) {
-#ifdef CONFIG_CRUISE_ENABLE_ACCL
-	if (mc_is_cruise_enabled() && mc_throttle_released()) {
-		return;
-	}
-#endif
-	if (mc_throttle_released() && eCtrl_enable_eBrake(true)) {
-		return;
-	}
-	if (!mc_throttle_released()) {
-		float curr_rpm = PMSM_FOC_GetSpeed();
-		if (_torque.accl) { //加速需求
-			float ref_torque = thro_torque_for_accelerate();
-			float hold_torque = PMSM_FOC_Get()->out.f_autohold_trq;
-			if (hold_torque < 0) { //下坡驻车,最小给0扭矩
-				hold_torque = 0;
-			}
-			ref_torque	= MAX(hold_torque, ref_torque);
-			if (curr_rpm <= CONFIG_ZERO_SPEED_RPM) {//从静止开始加速
-				if (_torque.torque_req < hold_torque) {
-					_torque.torque_req = hold_torque;
-					eCtrl_reset_Torque(hold_torque);
-				}
-			}else {
-				PMSM_FOC_Get()->out.f_autohold_trq = 0;
-			}
-			/* 处理加速ramp时间的变化,需要缓慢变小,变大可以立即处理,
-			*  加速时间缓慢变小可以防止突然大扭矩加速
-			*/
-			u16 now_ramp_time = eCtrl_get_torque_acc_time();
-			u16 next_ramp_time = mc_gear_conf()->accl_time;
-			if (curr_rpm < CONFIG_ZERO_SPEED_RAMP_RMP) {
-				next_ramp_time = mc_gear_conf()->zero_accl;
-			}
-			if (next_ramp_time == 0) {
-				next_ramp_time = 100;
-			}
-			if (now_ramp_time != next_ramp_time) {
-				if (next_ramp_time > now_ramp_time) {
-					eCtrl_set_accl_time(next_ramp_time);
-				}else {
-					float f_now = (float)now_ramp_time;
-					float f_next = (float)next_ramp_time;
-					step_towards(&f_now, f_next, 0.5f);
-					if (f_now <= 10) {
-						f_now = 10;
-					}
-					eCtrl_set_accl_time((u16)f_now);
-				}
-			}
-			_torque.torque_req = ref_torque;
-		}else {
-			float ref_torque = thro_torque_for_decelerate();
-			/* autohold 启动的情况下,转把在0位置附近小幅抖动 */
-			if (curr_rpm <= CONFIG_ZERO_SPEED_RPM) {
-				float hold_torque = PMSM_FOC_Get()->out.f_autohold_trq;
-				ref_torque = MAX(hold_torque, ref_torque);
-			}
-			_torque.torque_req = ref_torque;
-		}
-		etcs_set_torque(_torque.torque_req);
-	}else if (mc_throttle_released() && eCtrl_get_FinalTorque() != 0){
-		_torque.torque_req = 0.0f;
-		etcs_set_torque(_torque.torque_req);
-	}
-}
-
-#define THRO_RPM_LP_CEOF 0.01f
-void thro_torque_process(u8 run_mode, float f_throttle) {
-
-	float thro_r = get_throttle_ration(f_throttle);
-	_torque.gear = mc_get_internal_gear();
-	LowPass_Filter(_torque.spd_filted, PMSM_FOC_GetSpeed(), THRO_RPM_LP_CEOF);
-
-	if (thro_r > _torque.throttle_opening) {
-		if (!_torque.accl) {
-			_torque.throttle_opening_last = _torque.throttle_opening;
-			_torque.torque_real = PMSM_FOC_Get()->in.s_targetTorque;
-			if (_torque.torque_real < 0) { //电子刹车的时候,扭矩可能为负
-				_torque.torque_real = 0;
-			}
-			_torque.torque_acc_ = 0;
-		}
-		_torque.accl = true;
-	}else if (thro_r < _torque.throttle_opening) {
-		if (_torque.accl) {
-			_torque.throttle_opening_last = _torque.throttle_opening;
-			_torque.torque_real = PMSM_FOC_Get()->in.s_targetTorque;
-			if (_torque.torque_real < 0) { //电子刹车的时候,扭矩可能为负
-				_torque.torque_real = 0;
-			}
-		}
-		_torque.accl = false;
-	}
-
-	_torque.throttle_opening = thro_r;
-	if (run_mode == CTRL_MODE_TRQ) {
-		thro_torque_request();
-	}else if (run_mode == CTRL_MODE_SPD) {
-		if (!mc_is_cruise_enabled()) {
-			float speed_Ref = PMSM_FOC_GetSpeedLimit() * _torque.throttle_opening;
-			PMSM_FOC_Set_TgtSpeed(speed_Ref);
-		}
-	}else if (run_mode == CTRL_MODE_EBRAKE) {
-		float vel = PMSM_FOC_GetSpeed();
-		float ebrk_trq = motor_get_ebreak_toruqe(vel);
-
-		if (ebrk_trq >= -PMSM_FOC_GetEbrkTorque()/2){
-			eCtrl_Set_eBrk_RampTime(1);
-		}
-		if (ebrk_trq != 0) {
-			eCtrl_set_TgtTorque(ebrk_trq);
-		}
-
-		if (eCtrl_get_FinalTorque() < 0.0001f && vel < CONFIG_MIN_RPM_EXIT_EBRAKE) {
-			eCtrl_enable_eBrake(false);
-			thro_torque_reset();
-		}
-		if (!mc_throttle_released() || (mc_throttle_released() && (vel == 0.0f))) {
-			eCtrl_enable_eBrake(false);
-			thro_torque_reset();
-		}
-	}
-}
-
-/* 定速巡航需要判断是否需要加速 */
-float get_user_request_torque(void) {
-	if (_torque.accl) {
-		return thro_torque_for_accelerate();
-	}
-	return thro_torque_for_decelerate();
-}
-
-void thro_torque_log(void) {
-	sys_debug("accl %d, real %f, req %f\n", _torque.accl, _torque.torque_real, _torque.torque_req);
-	sys_debug("ration %f - %f - %f - %d\n", _torque.throttle_opening, _torque.throttle_opening_last, thro_torque_for_accelerate(), _torque.gear);
-}

+ 0 - 25
Applications/foc/core/thro_torque_unused.h

@@ -1,25 +0,0 @@
-#ifndef _THRO_TORQUE_H__
-#define _THRO_TORQUE_H__
-#include "os/os_types.h"
-#include "foc/core/PMSM_FOC_Core.h"
-typedef struct {
-	bool  accl;
-	float torque_req;
-	float torque_real;
-	float torque_acc_;
-	float thro_filted;
-	float spd_filted;
-	float throttle_opening;
-	float throttle_opening_last;
-	u8    gear;
-}thro_torque_t;
-
-void thro_torque_reset(void);
-void thro_torque_init(void);
-float thro_ration_to_voltage(float r);
-void thro_torque_process(u8 run_mode, float f_throttle);
-float get_user_request_torque(void);
-float thro_torque_gear_map(s16 rpm, u8 gear);
-float get_throttle_ration(float f_thro);
-#endif /* _THRO_TORQUE_H__ */
-

+ 0 - 175
Applications/foc/core/torque_unused.c

@@ -1,175 +0,0 @@
-#include "foc/core/torque.h"
-#include "foc/foc_config.h"
-#include "foc/motor/motor.h"
-#include "foc/motor/motor_param.h"
-#include "foc/core/e_ctrl.h"
-#include "foc/core/PMSM_FOC_Core.h"
-#include "app/nv_storage.h"
-#include "libs/logger.h"
-#include "prot/can_foc_msg.h"
-
-static motor_map_t gear_torques[5][5] = {
-	[0] = {{500,  100}, {1200, 100}, {1700, 80}, {2200, 75}, {2800, 50},},
-	[1] = {{800,  130}, {1600, 120}, {2400, 110}, {3200, 80}, {4300, 60},},
-	[2] = {{1200, 150}, {2200, 140}, {3200, 120}, {4200, 80}, {5300, 70},},
-	[3] = {{3000, 200}, {4740, 150}, {5050, 110}, {5200, 85}, {5300, 70},},
-	[4] = {{4500, 200}, {4740, 150}, {5050, 110}, {5200, 85}, {5300, 70},},
-};
-
-/*
-通过查表获取对应扭矩和速度时的Id和IQ的分配
-*/
-
-static torque_manager_t torque_ctrl;
-void torque_init(void) {
-	trq2dq_lookup_init();
-	torque_reset();
-}
-
-void torque_reset(void) {
-	memset(&torque_ctrl, 0, sizeof(torque_ctrl));
-}
-
-float torque_max_from_gear_rpm(void) {
-	u8 gear = mc_get_internal_gear();
-	if (gear > 4) {
-		gear = 0;
-	}
-	motor_map_t *map = &gear_torques[gear][0];
-	s16 rpm = (s16)torque_ctrl.spd_filted;
-	if (rpm <= map[0].rpm) {
-		return (float)map[0].torque;
-	}
-	int map_size = 5;
-	for (int i = 1; i < map_size; i++) {
-		if (rpm <= map[i].rpm) { //线性插值
-			float trq1 = map[i-1].torque;
-			float min_rpm = map[i-1].rpm;
-			float trq2 = map[i].torque;
-			float max_rpm = map[i].rpm;
-			return f_map((float)rpm, min_rpm, max_rpm, trq1, trq2);
-		}
-	}
-	return (float)map[map_size-1].torque;	
-}
-
-
-/* 获取油门开度 */
-static float throttle_ration(float f_throttle) {
-	if (f_throttle <= nv_get_foc_params()->n_startThroVol) {
-		return 0;
-	}
-	float delta = f_throttle - (nv_get_foc_params()->n_startThroVol);
-
-	int ration = (delta * 100.0f) / (nv_get_foc_params()->n_endThroVol - nv_get_foc_params()->n_startThroVol);
-	
-	return ((float)ration)/100.0f;
-}
-
-float throttle_to_speed(float f_throttle) {
-	return (PMSM_FOC_GetSpeedLimit() * throttle_ration(f_throttle));
-}
-
-float throttle_to_torque(float f_throttle) {
-	return PMSM_FOC_GetTorqueLimit() * throttle_ration(f_throttle);
-}
-
-#define FUNC_SEG1_X_END 0.5F
-#define FUNC_SEG1_Y_END 0.25F
-#define FUNC_SEG1_K    (FUNC_SEG1_Y_END/FUNC_SEG1_X_END)
-
-#define FUNC_SEG2_X_OFF FUNC_SEG1_X_END
-#define FUNC_SEG2_Y_OFF FUNC_SEG1_Y_END
-#define FUNC_SEG2_K ((1.0F-FUNC_SEG1_Y_END)/(1.0F - FUNC_SEG1_X_END))
-
-static float __INLINE unline_func(float x) {
-	if (x <= FUNC_SEG1_X_END) {
-		return x * FUNC_SEG1_K;
-	}
-
-	return (x - FUNC_SEG1_X_END) * FUNC_SEG2_K + FUNC_SEG2_Y_OFF;
-} 
-
-#define REAL_DQ_CEOF 0.9f
-#define FINAL_DQ_CEFO 1.1F
-
-static float get_throttle_torque(float trq_ration) {
-	float curr_rpm = PMSM_FOC_GetSpeed();
-	if (curr_rpm == 0) {
-		torque_ctrl.spd_filted = 0;
-	}else {
-		LowPass_Filter(torque_ctrl.spd_filted, curr_rpm, 0.01f);
-	}
-	float torque_map = torque_max_from_gear_rpm();// (float)motor_max_torque_for_rpm((s16)torque_ctrl.spd_filted);
-	float torque_lim = PMSM_FOC_GetTorqueLimit();
-	float max_torque = min(torque_map, torque_lim);
-
-	return max_torque * unline_func(trq_ration);
-}
-
-float get_thro_request_torque(void) {
-	return get_throttle_torque(torque_ctrl.throttle_opening);
-}
-
-void request_torque(float throttle_opening) {
-	float curr_rpm = PMSM_FOC_GetSpeed();
-	float ref_torque = get_throttle_torque(throttle_opening);
-#ifdef CONFIG_CRUISE_ENABLE_ACCL
-	if (mc_is_cruise_enabled() && mc_throttle_released()) {
-		return;
-	}
-#endif
-	if ((mc_throttle_released()) && eCtrl_enable_eBrake(true)) {
-		return;
-	}
-	
-	if (!mc_throttle_released()) {
-		if (curr_rpm <= CONFIG_ZERO_SPEED_RPM) {
-			torque_ctrl.torque_req = eCtrl_get_FinalTorque() * FINAL_DQ_CEFO;
-			ref_torque  = MAX(eCtrl_get_FinalTorque() * FINAL_DQ_CEFO, ref_torque);
-		}
-		if (ref_torque > torque_ctrl.torque_req) { //加扭矩step给定
-			step_towards(&torque_ctrl.torque_req, ref_torque, 1.0f);
-		}else { //减扭矩,直接给定
-			torque_ctrl.torque_req = ref_torque;
-		}
-		PMSM_FOC_Set_Torque(torque_ctrl.torque_req);
-	}else if (mc_throttle_released() && eCtrl_get_FinalTorque() != 0){
-		float real_trq = PMSM_FOC_Get_Real_dqVector() * REAL_DQ_CEOF;
-		float ref_now = min(real_trq, eCtrl_get_RefTorque());
-		eCtrl_reset_Torque(ref_now);
-		PMSM_FOC_Set_Torque(0);
-	}
-}
-
-void request_speed(float throttle_opening) {
-	if (!mc_is_cruise_enabled()) {
-		float speed_Ref = PMSM_FOC_GetSpeedLimit() * throttle_opening;
-		PMSM_FOC_Set_TgtSpeed(speed_Ref);
-	}
-}
-
-#define THRO_REF_LP_CEOF 0.2f
-void throttle_process(u8 run_mode, float f_throttle) {
-	if (mc_throttle_released()){
-		torque_ctrl.throttle_value = 0;
-		torque_ctrl.torque_req = 0;
-	}else {
-		LowPass_Filter(torque_ctrl.throttle_value, f_throttle, THRO_REF_LP_CEOF);
-	}
-	torque_ctrl.throttle_opening = throttle_ration(f_throttle);
-	if (run_mode == CTRL_MODE_TRQ) {
-		request_torque(torque_ctrl.throttle_opening);
-	}else if (run_mode == CTRL_MODE_SPD) {
-		request_speed(torque_ctrl.throttle_opening);
-	}else if (run_mode == CTRL_MODE_EBRAKE) {
-		eCtrl_reset_Torque(0);
-		if (eCtrl_get_FinalCurrent() < 0.0001f && PMSM_FOC_GetSpeed() < CONFIG_MIN_RPM_EXIT_EBRAKE) {
-			eCtrl_enable_eBrake(false);	
-		}
-		if (!mc_throttle_released() || (mc_throttle_released() && (PMSM_FOC_GetSpeed() == 0.0f))) {
-			eCtrl_enable_eBrake(false);
-		}
-	}
-}
-

+ 0 - 22
Applications/foc/core/torque_unused.h

@@ -1,22 +0,0 @@
-#ifndef _TORQUE_LUT_H__
-#define _TORQUE_LUT_H__
-#include "os/os_types.h"
-#include "foc/core/PMSM_FOC_Core.h"
-typedef struct {
-	bool  accl;
-	float torque_req;
-	float throttle_value;
-	float throttle_opening; //油门开度百分比
-	float spd_filted;
-	u32   count;
-}torque_manager_t;
-void torque_init(void);
-void torque_reset(void);
-void trq2dq_lookup(int rpm, float torque, DQ_t *dq_out);
-void throttle_process(u8 run_mode, float f_throttle);
-void request_torque(float throttle_opening);
-void trq2dq_lookup_init(void);
-float get_thro_request_torque(void);
-
-#endif /*_TORQUE_LUT_H__ */
-

+ 0 - 104
Applications/foc/core/trq2dq_table.c

@@ -1,104 +0,0 @@
-#include "os/os_types.h"
-#include "foc/core/PMSM_FOC_Core.h"
-#include "foc/motor/motor_param.h"
-#include "libs/logger.h"
-
-#define _DEBUG(fmt, args...) sys_debug(fmt, ##args)
-
-extern torque_map_t table_map[14][10];
-//x -> rpm
-//z -> torque
-static void intp_line2(float frac_x, s16 z, torque_map_t **map, float *d, float *q) {
-	float frac_z1 = 0; //对应x1索引的t_maps
-	float frac_z2 = 0; //对应x2索引的t_maps
-
-	_DEBUG("low --> %d %d\n", map[1]->torque, map[0]->torque);
-	if ((map[1]->torque != map[0]->torque)) {
-		frac_z1 = (float)(z - map[0]->torque)/(map[1]->torque - map[0]->torque);
-	}
-	_DEBUG("high --> %d %d\n", map[3]->torque, map[2]->torque);
-	if ((map[3]->torque != map[2]->torque)) {
-		frac_z2 = (float)(z - map[2]->torque)/(map[3]->torque - map[2]->torque);
-	}
-	
-	_DEBUG("%f -- %f -- %f\n", frac_x, frac_z1, frac_z2);
-
-	float c1 = (1.0f - frac_z1) * map[0]->d + frac_z1 * map[1]->d; //第一行插值
-	float c2 = (1.0f - frac_z2) * map[2]->d + frac_z2 * map[3]->d; //第二行插值
-	*d = c1 * (1.0f - frac_x) + c2 * frac_x;                //两行插值
-	
-	c1 = (1.0f - frac_z1) * map[0]->q + frac_z1 * map[1]->q;
-	c2 = (1.0f - frac_z2) * map[2]->q + frac_z2 * map[3]->q;
-	*q = c1 * (1.0f - frac_x) + c2 * frac_x;
-}
-
-static void get_torque_range(s16 z, int index, int max_index, int *left, int *right) {
-	int low_left = max_index - 1, low_right = max_index - 1;
-	if (z < table_map[index][0].torque) {
-		low_right = low_left = 0;
-		_DEBUG("---%d, %d--%d\n", z, table_map[index][0].torque, table_map[0][0].torque);
-	}else if (z > table_map[index][max_index - 1].torque) {
-		low_right = low_left = max_index - 1;
-	}else {
-		for (int i = 0; i < max_index; i++) {
-			//_DEBUG("index %d, trq %d\n", i, table_map[index][i].torque);
-			if (z >= table_map[index][i].torque) {
-				low_left = i;
-				low_right = i + 1;
-				if (i == max_index - 1) {
-					low_right = low_left;
-					break;
-				}
-			}
-		}
-	}
-	*left = low_left;
-	*right = low_right;
-}
-
-
-void trq2dq_lookup_init(void) {
-	//if (table_map == NULL) {
-		//table_map = get_torque2dq_maps();
-	//}
-}
-
-void trq2dq_lookup(int rpm, s16 torque, DQ_t *dq_out) {
-	//if (table_map == NULL) {
-	//	step_towards(&dq_out->d, 0, 10.0f);
-	//	dq_out->q = torque;
-	//	return;
-	//}
-	if (torque < 0.0f) {
-		dq_out->d = 0.0f;
-		dq_out->q = torque;
-		return;
-	}
-
-	int low = 0, high = 0;
-	s16 x1 = 0, x2 = 0;
-	rpm = motor_map_rpm_idx(rpm, &low, &high, &x1, &x2);
-
-	_DEBUG("speed %d-%d, %d-%d\n", low, high, x1, x2);
-	int max_trq_idx = motor_map_torque_max_count();
-	int low_left = max_trq_idx - 1, low_right = max_trq_idx - 1;
-	get_torque_range(torque, low, max_trq_idx, &low_left, &low_right);
-	_DEBUG("low speed torque %d-%d\n", low_left, low_right);
-	
-	int high_left = max_trq_idx - 1, high_right = max_trq_idx - 1;
-	get_torque_range(torque, high, max_trq_idx, &high_left, &high_right);
-	_DEBUG("high speed torque %d-%d\n", high_left, high_right);
-	torque_map_t *maps[4];
-	maps[0] = &table_map[low][low_left];
-	maps[1] = &table_map[low][low_right];
-	maps[2] = &table_map[high][high_left];
-	maps[3] = &table_map[high][high_right];
-	float frac_x = 0, d = 0, q = 0;
-	if (x1 != x2) {
-		frac_x = (float)(rpm - x1)/(x2 - x1);
-	}
-	intp_line2(frac_x, torque, maps, &d, &q);
-	//step_towards(&dq_out->d, d, 10.0f);
-	dq_out->d = d;
-	dq_out->q = q;
-}