Ver código fonte

加入D轴最大电流的限制

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

+ 1 - 0
Applications/bsp/board_mc_v1.h

@@ -23,6 +23,7 @@
 #define CONFIG_UNDER_VOL_RPM     1000
 #define CONFIG_UNDER_VOL_RPM     1000
 #define CONFIG_UNDER_VOL_PHASE_CURR 100.0F
 #define CONFIG_UNDER_VOL_PHASE_CURR 100.0F
 #define CONFIG_UNDER_VOL_DC_CURR 15.0F
 #define CONFIG_UNDER_VOL_DC_CURR 15.0F
+#define CONFIG_MAX_FW_D_CURR     100.0F //d轴最大的退磁电流
 
 
 #define SCHED_TIMER TIMER5
 #define SCHED_TIMER TIMER5
 #define SCHED_TIMER_RCU RCU_TIMER5
 #define SCHED_TIMER_RCU RCU_TIMER5

+ 1 - 0
Applications/foc/commands.h

@@ -33,6 +33,7 @@ typedef enum {
 	Foc_Report_Power,
 	Foc_Report_Power,
 	Foc_Report_Pid,
 	Foc_Report_Pid,
 	Foc_Report_Status,
 	Foc_Report_Status,
+	Foc_Report_MTPA_DQ_Angle,
 	Foc_Cmd_Max
 	Foc_Cmd_Max
 }foc_cmd_t;
 }foc_cmd_t;
 #define CMD_2_CAN_KEY(cmd) ((u16)(((u16)cmd) | (CAN_MY_ADDRESS<<8)))
 #define CMD_2_CAN_KEY(cmd) ((u16)(((u16)cmd) | (CAN_MY_ADDRESS<<8)))

+ 11 - 2
Applications/foc/core/PMSM_FOC_Core.c

@@ -201,7 +201,7 @@ void PMSM_FOC_CoreInit(void) {
 	gFoc_Ctrl.hwLim.s_PhaseVolMax = CONFIG_MAX_PHASE_VOL;
 	gFoc_Ctrl.hwLim.s_PhaseVolMax = CONFIG_MAX_PHASE_VOL;
 	gFoc_Ctrl.hwLim.s_vDCMax      = CONFIG_MAX_DC_VOL;
 	gFoc_Ctrl.hwLim.s_vDCMax      = CONFIG_MAX_DC_VOL;
 	gFoc_Ctrl.hwLim.s_torqueMax  = CONFIG_MAX_TORQUE;
 	gFoc_Ctrl.hwLim.s_torqueMax  = CONFIG_MAX_TORQUE;
-
+	gFoc_Ctrl.hwLim.s_FWDCurrMax = CONFIG_MAX_FW_D_CURR;
 	if (!g_focinit) {
 	if (!g_focinit) {
 		PMSM_FOC_UserInit();
 		PMSM_FOC_UserInit();
 		shark_task_create(PMSM_FOC_Debug_Task, NULL);
 		shark_task_create(PMSM_FOC_Debug_Task, NULL);
@@ -415,7 +415,16 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
 			float s, c;
 			float s, c;
 			normal_sincosf(degree_2_pi(gFoc_Ctrl.in.s_manualAngle + 90.0f), &s, &c);
 			normal_sincosf(degree_2_pi(gFoc_Ctrl.in.s_manualAngle + 90.0f), &s, &c);
 			gFoc_Ctrl.in.s_targetIdq.d = gFoc_Ctrl.in.s_targetCurrent * c;
 			gFoc_Ctrl.in.s_targetIdq.d = gFoc_Ctrl.in.s_targetCurrent * c;
-			gFoc_Ctrl.in.s_targetIdq.q = gFoc_Ctrl.in.s_targetCurrent * s;
+			
+			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));
+			}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));
+			}else {
+				gFoc_Ctrl.in.s_targetIdq.q = gFoc_Ctrl.in.s_targetCurrent * s;
+			}
 		}else {
 		}else {
 			gFoc_Ctrl.in.s_targetIdq.d = 0;
 			gFoc_Ctrl.in.s_targetIdq.d = 0;
 			gFoc_Ctrl.in.s_targetIdq.q = gFoc_Ctrl.in.s_targetCurrent;
 			gFoc_Ctrl.in.s_targetIdq.q = gFoc_Ctrl.in.s_targetCurrent;

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

@@ -74,6 +74,7 @@ typedef struct {
 	float s_motRPMMax;
 	float s_motRPMMax;
 	float s_PhaseCurrMax;
 	float s_PhaseCurrMax;
 	float s_PhaseVolMax;
 	float s_PhaseVolMax;
+	float s_FWDCurrMax; //D轴最大退磁电流
 	float s_iDCMax;
 	float s_iDCMax;
 	float s_vDCMax;
 	float s_vDCMax;
 	float s_torqueMax;
 	float s_torqueMax;

+ 13 - 0
Applications/prot/can_foc_msg.c

@@ -87,3 +87,16 @@ void can_report_foc_status(u8 can) {
 	encode_u32(data + 7, shark_get_seconds());
 	encode_u32(data + 7, shark_get_seconds());
 	can_send_message(get_indicator_can_id(can), data, sizeof(data), 0);
 	can_send_message(get_indicator_can_id(can), data, sizeof(data), 0);
 }
 }
+
+
+void can_report_mpta_values(u8 can) {
+	u8 data[14];
+	if (!PMSM_FOC_Get()->in.b_MTPA_calibrate) {
+		return;
+	}
+	encoder_can_key(data, CMD_2_CAN_KEY(Foc_Report_MTPA_DQ_Angle));
+	encode_float(data + 2, PMSM_FOC_Get()->in.s_targetCurrent);
+	encode_float(data + 6, PMSM_FOC_Get()->in.s_targetIdq.d);
+	encode_float(data + 10, PMSM_FOC_Get()->in.s_targetIdq.q);
+	can_send_message(get_indicator_can_id(can), data, sizeof(data), 0);
+}

BIN
Simulink/ADRC.slx.autosave


BIN
Simulink/fir_new3.fda