Ver Fonte

过温和欠压保护

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui há 3 anos atrás
pai
commit
1e8596b420

+ 0 - 1
Applications/app/app.c

@@ -18,7 +18,6 @@ static u32 _app_report_task(void *args);
 extern void PMSM_FOC_LogDebug(void);
 extern measure_time_t g_meas_hall;
 extern measure_time_t g_meas_foc;
-extern measure_time_t g_meas_timeup;
 
 #ifdef JTAG_DEBUG
 int jtag_cmd = 0;

+ 35 - 33
Applications/foc/core/PMSM_FOC_Core.c

@@ -9,6 +9,7 @@
 #include "foc/core/svpwm.h"
 #include "foc/core/torque.h"
 #include "foc/samples.h"
+#include "foc/limit.h"
 #include "app/nv_storage.h"
 #include "bsp/pwm.h"
 #include "libs/logger.h"
@@ -174,6 +175,8 @@ static void PMSM_FOC_UserInit(void) {
 	gFoc_Ctrl.userLim.s_iDCeBrkLim = nv_get_foc_params()->s_iDCeBrkLim;
 	gFoc_Ctrl.userLim.s_PhaseCurreBrkLim = nv_get_foc_params()->s_PhaseCurreBrkLim;
 	gFoc_Ctrl.userLim.s_PhaseVoleBrkLim = gFoc_Ctrl.hwLim.s_PhaseVolMax;
+	gFoc_Ctrl.protLim.s_iDCLim = gFoc_Ctrl.userLim.s_iDCLim;
+	gFoc_Ctrl.protLim.s_PhaseCurrLim = gFoc_Ctrl.userLim.s_PhaseCurrLim;
 	eRamp_init_target(&gFoc_Ctrl.userLim.rpmLimRamp, gFoc_Ctrl.userLim.s_motRPMLim);
 	eRamp_init_target(&gFoc_Ctrl.userLim.phaseCurrLimRamp, gFoc_Ctrl.userLim.s_PhaseCurrLim);
 	eRamp_init_target(&gFoc_Ctrl.userLim.DCCurrLimRamp, gFoc_Ctrl.userLim.s_iDCLim);
@@ -418,11 +421,12 @@ u8 PMSM_FOC_CtrlMode(void) {
 			
 		}	
 	}
+	
 	return gFoc_Ctrl.out.n_RunMode;
 }
 
 /* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
-static __INLINE float PMSM_FOC_Limit_Power(float maxTrq) {
+static __INLINE float PMSM_FOC_Limit_iDC(float maxTrq) {
 #if 1
 	PI_Ctrl_Power.max = maxTrq;
 	float errRef = eRamp_get_intepolation(&gFoc_Ctrl.userLim.DCCurrLimRamp) - gFoc_Ctrl.out.s_FilteriDC;
@@ -476,7 +480,7 @@ void PMSM_FOC_idqCalc(void) {
 			}
 		}
 	}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
-		float refTorque = eCtrl_get_FinalTorque();
+		float refTorque = min(eCtrl_get_FinalTorque(), eRamp_get_intepolation(&gFoc_Ctrl.userLim.phaseCurrLimRamp));
 		if (refTorque > 0) {
 			gFoc_Ctrl.pi_torque->max = refTorque;
 			gFoc_Ctrl.pi_torque->min = -gFoc_Ctrl.userLim.s_PhaseCurreBrkLim;
@@ -490,7 +494,7 @@ void PMSM_FOC_idqCalc(void) {
 		}
 		float errRef = eRamp_get_intepolation(&gFoc_Ctrl.userLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
 		float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
-		gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
+		gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_iDC(maxTrq);
 	}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
 		float maxSpeed = eCtrl_get_FinalSpeed();
 		float refSpeed = eCtrl_get_RefSpeed();
@@ -512,29 +516,37 @@ void PMSM_FOC_idqCalc(void) {
 		gFoc_Ctrl.in.s_targetRPM = refSpeed;
 		float errRef = refSpeed - gFoc_Ctrl.in.s_motRPM;
 		float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_speed, errRef);
-		gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
+		gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_iDC(maxTrq);
 	}
 
 	PMSM_FOC_idq_Assign();
 }
 
+void PMSM_FOC_RunTime_Limit(void) {
+	float dclim = (float)vbus_current_vol_lower_limit();
+	float phaselim = (float)phase_current_temp_high_limit();
+
+	dclim = (dclim!=CURRENT_LIMIT_NONE)?dclim:gFoc_Ctrl.userLim.s_iDCLim;
+	phaselim = (phaselim!=CURRENT_LIMIT_NONE)?phaselim:gFoc_Ctrl.userLim.s_PhaseCurrLim;
+
+	dclim = min(dclim, gFoc_Ctrl.userLim.s_iDCLim);
+	phaselim = min(phaselim, gFoc_Ctrl.userLim.s_PhaseCurrLim);
+
+	if (phaselim != gFoc_Ctrl.userLim.phaseCurrLimRamp.target) {
+		eRamp_set_step_target(&gFoc_Ctrl.userLim.phaseCurrLimRamp, phaselim, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
+	}
+	if (dclim != gFoc_Ctrl.userLim.DCCurrLimRamp.target) {
+		eRamp_set_step_target(&gFoc_Ctrl.userLim.DCCurrLimRamp, dclim, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
+	}
+	gFoc_Ctrl.protLim.s_iDCLim = dclim;
+	gFoc_Ctrl.protLim.s_PhaseCurrLim = phaselim;
+}
+
 void PMSM_FOC_Slow_Task(void) {
 	eRamp_running(&gFoc_Ctrl.userLim.phaseCurrLimRamp);
 	eRamp_running(&gFoc_Ctrl.userLim.rpmLimRamp);
 	eRamp_running(&gFoc_Ctrl.userLim.DCCurrLimRamp);
 
-	if (gFoc_Ctrl.out.n_CritiCalErrMask != gFoc_Ctrl.out.n_CritiCalErrPrev) {
-		/* 欠压降速,限制相电流 */
-		if (!(gFoc_Ctrl.out.n_CritiCalErrPrev & gFoc_Ctrl.out.n_CritiCalErrMask) && (FOC_CRIT_UN_Vol_Err & gFoc_Ctrl.out.n_CritiCalErrMask)) {
-			if (gFoc_Ctrl.userLim.s_motRPMLim > CONFIG_UNDER_VOL_RPM) {
-				PMSM_FOC_SpeedLimit(CONFIG_UNDER_VOL_RPM);
-			}
-			if (gFoc_Ctrl.userLim.s_iDCLim > CONFIG_UNDER_VOL_DC_CURR) {
-				PMSM_FOC_DCCurrLimit(CONFIG_UNDER_VOL_DC_CURR);
-			}
-		}
-		gFoc_Ctrl.out.n_CritiCalErrPrev = gFoc_Ctrl.out.n_CritiCalErrMask;
-	}
 	PMSM_FOC_idqCalc();
 }
 
@@ -567,13 +579,10 @@ void PMSM_FOC_DCCurrLimit(float ibusLimit) {
 	if (ibusLimit > gFoc_Ctrl.hwLim.s_iDCMax) {
 		ibusLimit = gFoc_Ctrl.hwLim.s_iDCMax;
 	}
-	if (gFoc_Ctrl.out.n_CritiCalErrMask & FOC_CRIT_UN_Vol_Err) {
-		if (ibusLimit > CONFIG_UNDER_VOL_DC_CURR) {
-			ibusLimit = CONFIG_UNDER_VOL_DC_CURR;
-		}
-	}
 	gFoc_Ctrl.userLim.s_iDCLim = (ibusLimit);
-	eRamp_set_step_target(&gFoc_Ctrl.userLim.DCCurrLimRamp, ibusLimit, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
+	if (ibusLimit <= gFoc_Ctrl.protLim.s_iDCLim) {
+		eRamp_set_step_target(&gFoc_Ctrl.userLim.DCCurrLimRamp, ibusLimit, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
+	}
 }
 
 float PMSM_FOC_GetDCCurrLimit(void) {
@@ -584,11 +593,6 @@ void PMSM_FOC_SpeedLimit(float speedLimit) {
 	if (speedLimit > gFoc_Ctrl.hwLim.s_motRPMMax) {
 		speedLimit = gFoc_Ctrl.hwLim.s_motRPMMax;
 	}
-	if (gFoc_Ctrl.out.n_CritiCalErrMask & FOC_CRIT_UN_Vol_Err) {
-		if (speedLimit > CONFIG_UNDER_VOL_RPM) {
-			speedLimit = CONFIG_UNDER_VOL_RPM;
-		}
-	}
 	gFoc_Ctrl.userLim.s_motRPMLim = (speedLimit);
 	eRamp_set_step_target(&gFoc_Ctrl.userLim.rpmLimRamp, speedLimit, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
 }
@@ -645,13 +649,11 @@ void PMSM_FOC_PhaseCurrLim(float lim) {
 	if (lim > gFoc_Ctrl.hwLim.s_PhaseCurrMax) {
 		lim = gFoc_Ctrl.hwLim.s_PhaseCurrMax;
 	}
-	if (gFoc_Ctrl.out.n_CritiCalErrMask & FOC_CRIT_UN_Vol_Err) {
-		if (lim > CONFIG_UNDER_VOL_PHASE_CURR) {
-			lim = CONFIG_UNDER_VOL_PHASE_CURR;
-		}
-	}
 	gFoc_Ctrl.userLim.s_PhaseCurrLim = lim;
-	eRamp_set_step_target(&gFoc_Ctrl.userLim.phaseCurrLimRamp, lim, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
+	
+	if (lim <= gFoc_Ctrl.protLim.s_PhaseCurrLim) {
+		eRamp_set_step_target(&gFoc_Ctrl.userLim.phaseCurrLimRamp, lim, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
+	}
 }
 
 float PMSM_FOC_GetPhaseCurrLim(void) {

+ 6 - 0
Applications/foc/core/PMSM_FOC_Core.h

@@ -122,6 +122,10 @@ typedef struct {
 	float s_torqueMax;
 }FOC_HwLimit;
 
+typedef struct {
+	float s_iDCLim;
+	float s_PhaseCurrLim;
+}FOC_ProtLimit;
 
 typedef struct {
 	u16   n_Duty[3];
@@ -173,6 +177,7 @@ typedef struct {
 	FOC_Params    params;
 	FOC_UserLimit userLim;
 	FOC_HwLimit   hwLim;
+	FOC_ProtLimit protLim;
 	Plot_t        plot_type;
 	int           ctrl_count;
 }PMSM_FOC_Ctrl;
@@ -268,6 +273,7 @@ void PMSM_FOC_GetPid(u8 id, float *kp, float *ki, float *kb);
 bool PMSM_FOC_MotorLocking(void);
 void PMSM_FOC_Slow_Task(void);
 void PMSM_FOC_Set_PlotType(Plot_t t);
+void PMSM_FOC_RunTime_Limit(void);
 
 #endif /* _PMSM_FOC_Core_H__ */
 

+ 2 - 2
Applications/foc/foc_config.h

@@ -2,8 +2,8 @@
 #define _FOC_CONFIG_H__
 
 #define CONFIG_DEFAULT_IDC_LIM 100
-#define CONFIG_DEFAULT_PHASE_CURR_LIM 120
-#define CONFIG_DEFAULT_RPM_LIM       2000
+#define CONFIG_DEFAULT_PHASE_CURR_LIM 300
+#define CONFIG_DEFAULT_RPM_LIM       3000
 
 #define CONFIG_DEFAULT_EPM_PHASE_CURR 50
 #define CONFIG_DEFAULT_EPM_RPM        200

+ 129 - 0
Applications/foc/limit.c

@@ -0,0 +1,129 @@
+#include "foc/limit.h"
+#include "foc/core/PMSM_FOC_Core.h"
+#include "foc/samples.h"
+
+static limter_t motor_temp_lim[] = {//电机过温限流,限制相电流
+	{.enter_pointer = 110, .exit_pointer = 100, .limit_value = 0},
+	{.enter_pointer = 100, .exit_pointer = 90, .limit_value = 40},
+	{.enter_pointer = 90, .exit_pointer = 80, .limit_value = 80},
+	{.enter_pointer = 80, .exit_pointer = 70, .limit_value = 100},
+}; 
+static limter_t mos_temp_lim[] = { //mos过温限流,限制相电流
+	{.enter_pointer = 120, .exit_pointer = 110, .limit_value = 0},
+	{.enter_pointer = 110, .exit_pointer = 90, .limit_value = 40},
+	{.enter_pointer = 90, .exit_pointer = 80, .limit_value = 80},
+	{.enter_pointer = 80, .exit_pointer = 70, .limit_value = 100},
+};  
+static limter_t vol_under_lim[] = { //欠压限流,限制母线
+	{.enter_pointer = 40, .exit_pointer = 44, .limit_value = 20},
+	{.enter_pointer = 44, .exit_pointer = 46, .limit_value = 40},
+};  
+
+
+static u16 _temp_limiter(s16 temp, limter_t *lim) {
+	if (!lim->is_limit) {
+		if (temp < lim->enter_pointer) {
+			lim->ticks = 0;
+			return CURRENT_LIMIT_NONE;
+		}
+		if (lim->ticks == 0) {
+			lim->ticks = get_tick_ms();
+		}else if (get_delta_ms(lim->ticks) >= 5000){
+			lim->is_limit = true;
+			lim->ticks = 0;
+			return lim->limit_value;
+		}
+		return CURRENT_LIMIT_NONE;
+	}else {
+		if (temp >= lim->exit_pointer) {
+			lim->ticks = 0;
+			return lim->limit_value;
+		}
+		if (lim->ticks == 0) {
+			lim->ticks = get_tick_ms();
+		}else if (get_delta_ms(lim->ticks) >= 5000) {
+			lim->is_limit = false;
+			lim->ticks = 0;
+			return CURRENT_LIMIT_NONE;
+		}
+		return lim->limit_value;
+	}
+}
+
+static u16 _vol_limiter(s16 vol, limter_t *lim) {
+	if (!lim->is_limit) {
+		if (vol > lim->enter_pointer) {
+			lim->ticks = 0;
+			return CURRENT_LIMIT_NONE;
+		}
+		if (lim->ticks == 0) {
+			lim->ticks = get_tick_ms();
+		}else if (get_delta_ms(lim->ticks) >= 1000){
+			lim->is_limit = true;
+			lim->ticks = 0;
+			return lim->limit_value;
+		}
+		return CURRENT_LIMIT_NONE;
+	}else {
+		if (vol <= lim->exit_pointer) {
+			lim->ticks = 0;
+			return lim->limit_value;
+		}
+		if (lim->ticks == 0) {
+			lim->ticks = get_tick_ms();
+		}else if (get_delta_ms(lim->ticks) >= 1000) {
+			lim->is_limit = false;
+			lim->ticks = 0;
+			return CURRENT_LIMIT_NONE;
+		}
+		return lim->limit_value;
+	}
+}
+
+static u16 _motor_limit(void) {
+	s16 temp = get_motor_temp();
+	for(int i = 0; i < ARRAY_SIZE(motor_temp_lim); i++) {
+		limter_t *lim = motor_temp_lim + i;
+		u16 lim_value = _temp_limiter(temp, lim);
+		if (lim_value != CURRENT_LIMIT_NONE) {
+			PMSM_FOC_SetCriticalError(FOC_CRIT_MOTOR_TEMP_Err);
+			return lim_value;
+		}
+	}
+	PMSM_FOC_ClrCriticalError(FOC_CRIT_MOTOR_TEMP_Err);
+	return CURRENT_LIMIT_NONE;
+}
+
+static u16 _mos_limit(void) {
+	s16 temp = get_mos_temp();
+	for(int i = 0; i < ARRAY_SIZE(mos_temp_lim); i++) {
+		limter_t *lim = mos_temp_lim + i;
+		u16 lim_value = _temp_limiter(temp, lim);
+		if (lim_value != CURRENT_LIMIT_NONE) {
+			PMSM_FOC_SetCriticalError(FOC_CRIT_MOS_TEMP_Err);
+			return lim_value;
+		}
+	}
+	PMSM_FOC_ClrCriticalError(FOC_CRIT_MOS_TEMP_Err);
+	return CURRENT_LIMIT_NONE;
+}
+
+u16 phase_current_temp_high_limit(void) {
+	u16 motor_lim = _motor_limit();
+	u16 mos_lim   = _mos_limit();
+	return min(motor_lim, mos_lim);
+}
+
+u16 vbus_current_vol_lower_limit(void) {
+	s16 vol = get_vbus_int();
+	for(int i = 0; i < ARRAY_SIZE(vol_under_lim); i++) {
+		limter_t *lim = vol_under_lim + i;
+		u16 lim_value = _vol_limiter(vol, lim);
+		if (lim_value != CURRENT_LIMIT_NONE) {
+			PMSM_FOC_SetCriticalError(FOC_CRIT_UN_Vol_Err);
+			return lim_value;
+		}
+	}
+	PMSM_FOC_ClrCriticalError(FOC_CRIT_UN_Vol_Err);
+	return CURRENT_LIMIT_NONE;
+}

+ 18 - 0
Applications/foc/limit.h

@@ -0,0 +1,18 @@
+#ifndef _Limit_H__
+#define _Limit_H__
+#include "os/os_types.h"
+
+#define CURRENT_LIMIT_NONE ((u16)0xFFFF)
+typedef struct {
+	u16 limit_value;
+	s16 enter_pointer;
+	s16 exit_pointer;
+	u32 ticks;
+	bool is_limit;
+}limter_t;
+
+u16 phase_current_temp_high_limit(void);
+u16 vbus_current_vol_lower_limit(void);
+
+#endif /* _Limit_H__ */
+

+ 10 - 15
Applications/foc/motor/motor.c

@@ -53,19 +53,14 @@ static void MC_Check_MosVbusThrottle(void) {
 	gpio_phase_u_detect(false);
 	float abc[3];
 	get_phase_vols(abc);
-	if (abc[0] > 10 || abc[1] > 10 || abc[2] > 10) {
+	int vbus_vol = get_vbus_int();
+	if (abc[0] > vbus_vol/2 || abc[1] > vbus_vol/2 || abc[2] > vbus_vol/2) {
 		PMSM_FOC_SetCriticalError(FOC_CRIT_H_MOS_Err);
 	}else if (abc[0] < 0.001f){
 		PMSM_FOC_SetCriticalError(FOC_CRIT_L_MOS_Err);
 	}else if ((abc[0] > 0.5f) && (abc[1] < 0.001f || abc[2] < 0.001f)) {
 		PMSM_FOC_SetCriticalError(FOC_CRIT_Phase_Conn_Err);
 	}
-	if (get_vbus_float() < nv_get_foc_params()->s_minDCVol) {
-		PMSM_FOC_SetCriticalError(FOC_CRIT_UN_Vol_Err);
-	}
-	if (get_vbus_float() > nv_get_foc_params()->s_maxDCVol) {
-		PMSM_FOC_SetCriticalError(FOC_CRIT_OV_Vol_Err);
-	}
 }
 
 static u32 _self_check_task(void *p) {
@@ -73,10 +68,6 @@ static u32 _self_check_task(void *p) {
 		err_add_record(FOC_CRIT_Encoder_Err, 0);
 		PMSM_FOC_SetCriticalError(FOC_CRIT_Encoder_Err);
 	}
-	if (get_vbus_float() < nv_get_foc_params()->s_minDCVol) {
-		PMSM_FOC_SetCriticalError(FOC_CRIT_UN_Vol_Err);
-	}
-
 	return 0;
 }
 
@@ -115,7 +106,7 @@ bool mc_start(u8 mode) {
 		PMSM_FOC_SetErrCode(FOC_Param_Err);
 		return false;
 	}
-	if (PMSM_FOC_GetSpeed() > 10.0f) {
+	if (motor_encoder_get_speed() > 10.0f) {
 		PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
 		return false;
 	}
@@ -159,7 +150,7 @@ bool mc_stop(void) {
 	if (!motor.b_start) {
 		return true;
 	}
-	if (PMSM_FOC_GetSpeed() > 10.0f) {
+	if (motor_encoder_get_speed() > 10.0f) {
 		PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
 		sys_debug("speed error\n");
 		return false;
@@ -479,9 +470,10 @@ void MC_Protect_IRQHandler(void){
 	PMSM_FOC_SetCriticalError(FOC_CRIT_Phase_Err);
 }
 
-measure_time_t g_meas_timeup = {.intval_max_time = 62, .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
 void TIMER_UP_IRQHandler(void){
-	motor_encoder_update();
+	if (!motor.b_start || !PMSM_FOC_Is_Start()) {
+		motor_encoder_update();
+	}
 }
 
 measure_time_t g_meas_foc = {.exec_max_time = 20, .intval_max_time = 62,  .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
@@ -545,8 +537,11 @@ void Sched_MC_mTask(void) {
 	time_measure_start(&g_meas_MCTask);
 	u8 runMode = PMSM_FOC_CtrlMode();
 
+	/*保护功能*/
+	PMSM_FOC_RunTime_Limit();
 	/* 母线电流计算 */
 	PMSM_FOC_Calc_iDC();
+
 	if (motor.b_calibrate || (motor.mode == CTRL_MODE_OPEN)) {
 		return;
 	}

+ 10 - 10
Applications/foc/ntc.c

@@ -11,7 +11,7 @@ static const u16 kty_table[] = {
 	1982, 2073, 2166, 2261, 2357, 2452, 2624 };
 
 #define NTC_TEMP_INTVAL 10
-#define NCT_TEMP_OFFSET 1
+#define NTC_TEMP_OFFSET 1
 static const u16 ntc_table[] = {
 	43117, 27493, 18015, 12100, 8300, 5825, 4160, 3023,  2232, 1672, 1270, 977, 599,  
 	476, 382, 310, 254, 210,  174,  146, 123, 105, 90, 77, 66, 58, 50, 44};
@@ -19,21 +19,21 @@ static const u16 ntc_table[] = {
 s16 ntc_get_mos_temp(u16 r) {
 	int i = 0;
 	for (; i < ARRAY_SIZE(ntc_table); i++) {
-		if (r <= ntc_table[i]) {
+		if (r >= ntc_table[i]) {
 			break;
 		}
 	}
 	if (i == 0) {
-		return -40;
+		return -10;
 	}else if (i >= ARRAY_SIZE(ntc_table)) {
 		return 251;
 	}else if (r == ntc_table[i]) {
-		return (s16)((i - KTY_TEMP_OFFSET) * KTY_TEMP_INTVAL);
+		return (s16)((i - NTC_TEMP_OFFSET) * NTC_TEMP_INTVAL);
 	}
-	int delta = ntc_table[i] - ntc_table[i - 1];
-	float detla_tmp = (float)KTY_TEMP_INTVAL / (float)delta * (float)(r - ntc_table[i-1]); //插值
+	int delta = ntc_table[i-1] - ntc_table[i];
+	float detla_tmp = (float)NTC_TEMP_INTVAL / (float)delta * (float)(r - ntc_table[i]); //插值
 
-	return (s16)((i-1-KTY_TEMP_OFFSET)*KTY_TEMP_INTVAL + detla_tmp);
+	return (s16)((i-NTC_TEMP_OFFSET)*NTC_TEMP_INTVAL - detla_tmp);
 
 }
 
@@ -49,10 +49,10 @@ s16 ntc_get_motor_temp(u16 r) {
 	}else if (i >= ARRAY_SIZE(kty_table)) {
 		return 301;
 	}else if (r == kty_table[i]) {
-		return (s16)((i - NCT_TEMP_OFFSET) * NTC_TEMP_INTVAL);
+		return (s16)((i - KTY_TEMP_OFFSET) * KTY_TEMP_INTVAL);
 	}
 	int delta = kty_table[i] - kty_table[i - 1];
-	float detla_tmp = (float)NTC_TEMP_INTVAL / (float)delta * (float)(r - kty_table[i-1]); //插值
+	float detla_tmp = (float)KTY_TEMP_INTVAL / (float)delta * (float)(r - kty_table[i-1]); //插值
 
-	return (s16)((i-1-NCT_TEMP_OFFSET)*NTC_TEMP_INTVAL + detla_tmp);
+	return (s16)((i-1-KTY_TEMP_OFFSET)*KTY_TEMP_INTVAL + detla_tmp);
 }

+ 2 - 2
Applications/foc/samples.c

@@ -144,9 +144,9 @@ void sample_motor_temp(void) {
 }
 
 void sample_mos_temp(void) {
-	u16 adc = adc_get_motor_temp();
+	u16 adc = adc_get_mos_temp();
 	u16 r = MOS_TEMP_R(adc);
-	mos_temp.value = ntc_get_motor_temp(r);
+	mos_temp.value = ntc_get_mos_temp(r);
 	LowPass_Filter(mos_temp.filted_value, mos_temp.value, mos_temp.lowpass);
 }
 

+ 1 - 1
Applications/prot/can_foc_msg.c

@@ -15,7 +15,7 @@ void can_report_speed(u8 can, s16 rpm) {
 
 void can_report_power(u8 can) {
 	u8 data[8];
-	s16 rpm = (s16)PMSM_FOC_GetSpeed();
+	s16 rpm = (s16)motor_encoder_get_speed();
 	float vDC = get_vbus_float();
 	float iDC = PMSM_FOC_GetVbusCurrent();	
 	s16 v = (s16)(vDC * 10.0f);

+ 68 - 56
Project/MC100.uvoptx

@@ -432,6 +432,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>12</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\foc\limit.c</PathWithFileName>
+      <FilenameWithoutPath>limit.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -442,7 +454,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -454,7 +466,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -466,7 +478,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -478,7 +490,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -490,7 +502,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -510,7 +522,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -522,7 +534,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -534,7 +546,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -546,7 +558,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -566,7 +578,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -578,7 +590,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -590,7 +602,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -602,7 +614,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -622,7 +634,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -634,7 +646,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -646,7 +658,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -658,7 +670,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -670,7 +682,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -682,7 +694,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -694,7 +706,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -706,7 +718,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -718,7 +730,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -730,7 +742,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -742,7 +754,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -754,7 +766,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -766,7 +778,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -778,7 +790,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -790,7 +802,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -802,7 +814,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -822,7 +834,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -834,7 +846,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -846,7 +858,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -858,7 +870,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -870,7 +882,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -882,7 +894,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -902,7 +914,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -914,7 +926,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -926,7 +938,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -946,7 +958,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -958,7 +970,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -970,7 +982,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -982,7 +994,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -994,7 +1006,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1006,7 +1018,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1018,7 +1030,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1030,7 +1042,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1042,7 +1054,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1054,7 +1066,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1066,7 +1078,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1078,7 +1090,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1090,7 +1102,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1102,7 +1114,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1114,7 +1126,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1126,7 +1138,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <FileNumber>66</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1146,7 +1158,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1158,7 +1170,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <FileNumber>68</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/MC100.uvprojx

@@ -443,6 +443,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\foc\mc_error.c</FilePath>
             </File>
+            <File>
+              <FileName>limit.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Applications\foc\limit.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>