Переглянути джерело

修改变量

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 роки тому
батько
коміт
20028a70e1

+ 1 - 0
Applications/app/nv_storage.h

@@ -5,6 +5,7 @@
 #pragma  pack (push,1)
 
 typedef struct {
+	float s_PhaseCurrLim;
 	float s_maxIdq;
 	float s_minIdq;
 	float s_maxiDC;

+ 7 - 0
Applications/bsp/board_mc_v1.h

@@ -25,6 +25,13 @@
 
 #define ADC_REFERENCE_VOLTAGE  (3.3F)
 #define ADC_FULL_MAX          (4096.0F)
+
+#define CONFIG_MAX_VBUS_CURRENT 45.0f
+#define CONFIG_MAX_MOT_RPM      8000.0f
+#define CONFIG_MAX_PHASE_CURR   180.0F
+#define CONFIG_MAX_PHASE_VOL    140.0F
+#define CONFIG_MAX_VBUS_VOLTAGE 100.0F
+#define CONFIG_MAX_TORQUE       50.0F
 /* MOS驱动 */
 #define pwm_timer TIMER0
 #define PWM_MODE TIMER_OC_MODE_PWM0

+ 42 - 28
Applications/foc/core/PMSM_FOC_Core.c

@@ -138,26 +138,33 @@ void PMSM_FOC_CoreInit(void) {
 	_gFOC_Ctrl.pi_ctl_power = &PI_Ctrl_Power;
 	memset(&_gFOC_Ctrl.in, 0, sizeof(_gFOC_Ctrl.in));
 	memset(&_gFOC_Ctrl.out, 0, sizeof(_gFOC_Ctrl.out));
-	_gFOC_Ctrl.params.s_maxiDC = nv_get_foc_params()->s_maxiDC;//(MAX_iDQ);
-	_gFOC_Ctrl.params.s_maxRPM = nv_get_foc_params()->s_maxRPM;//(MAX_SPEED);
-	_gFOC_Ctrl.params.s_maxTorque = nv_get_foc_params()->s_maxTorque;//MAX_TORQUE;
-	_gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
-	_gFOC_Ctrl.params.maxvDQ.d = _gFOC_Ctrl.in.s_vDC;//MAX_vDC;
-	_gFOC_Ctrl.params.minvDQ.d = -_gFOC_Ctrl.in.s_vDC;//MAX_vDC;
-	_gFOC_Ctrl.params.maxvDQ.q = _gFOC_Ctrl.in.s_vDC;//MAX_vDC;
-	_gFOC_Ctrl.params.minvDQ.q = -_gFOC_Ctrl.in.s_vDC;//MAX_vDC;
-	_gFOC_Ctrl.params.s_maxIdq = nv_get_foc_params()->s_maxIdq;//MAX_iDQ;
-	_gFOC_Ctrl.params.s_minIdq = nv_get_foc_params()->s_minIdq;//-MAX_iDQ;	
+	memset(&_gFOC_Ctrl.userLim, 0, sizeof(_gFOC_Ctrl.userLim));
+
+	_gFOC_Ctrl.hwLim.s_iDCMax = CONFIG_MAX_VBUS_CURRENT;
+	_gFOC_Ctrl.hwLim.s_motRPMMax = CONFIG_MAX_MOT_RPM;
+	_gFOC_Ctrl.hwLim.s_PhaseCurrMax = CONFIG_MAX_PHASE_CURR;
+	_gFOC_Ctrl.hwLim.s_PhaseVolMax = CONFIG_MAX_PHASE_VOL;
+	_gFOC_Ctrl.hwLim.s_vDCMax      = CONFIG_MAX_VBUS_VOLTAGE;
+	_gFOC_Ctrl.hwLim.s_torqueMax  = CONFIG_MAX_TORQUE;
+	_gFOC_Ctrl.userLim.s_iDCLim = nv_get_foc_params()->s_maxiDC;
+	_gFOC_Ctrl.userLim.s_motRPMLim = nv_get_foc_params()->s_maxRPM;//(MAX_SPEED);
+	_gFOC_Ctrl.userLim.s_torqueLim = nv_get_foc_params()->s_maxTorque;//MAX_TORQUE;
+	_gFOC_Ctrl.userLim.s_PhaseCurrLim = nv_get_foc_params()->s_PhaseCurrLim;
+	_gFOC_Ctrl.userLim.s_vDCMaxLim = nv_get_foc_params()->s_maxvDC;
+	_gFOC_Ctrl.userLim.s_vDCMinLim = _gFOC_Ctrl.userLim.s_vDCMaxLim / 3;
+	_gFOC_Ctrl.userLim.s_iDCeBrkLim = nv_get_foc_params()->s_maxBrkCurrent;
+	_gFOC_Ctrl.userLim.s_PhaseeVoleBrkLim = _gFOC_Ctrl.hwLim.s_PhaseVolMax - 20;
+	
 	_gFOC_Ctrl.params.n_modulation = nv_get_foc_params()->n_modulation;//SVM_Modulation;
 	_gFOC_Ctrl.params.n_PhaseFilterCeof = nv_get_foc_params()->n_PhaseFilterCeof;//(0.2f);
 	_gFOC_Ctrl.params.n_TrqVelLimGain = nv_get_foc_params()->n_TrqVelLimGain;
 	_gFOC_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
-	_gFOC_Ctrl.in.s_LimitiDC = nv_get_foc_params()->s_LimitiDC;
+	_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
+	_gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
+
 	_gFOC_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
 	_gFOC_Ctrl.out.f_vdqRation = 0;
-	_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
-	
-	
+
 	FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
 	FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[1], 1);
 
@@ -347,7 +354,7 @@ u8 PMSM_FOC_CtrlMode(void) {
 /* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
 static __INLINE float PMSM_FOC_Limit_Power(float maxTrq) {
 	PI_Ctrl_Power.max = maxTrq;
-	float errRef = _gFOC_Ctrl.in.s_LimitiDC - _gFOC_Ctrl.out.s_FilteriDC;
+	float errRef = _gFOC_Ctrl.userLim.s_iDCLim - _gFOC_Ctrl.out.s_FilteriDC;
 	return PI_Controller_run(_gFOC_Ctrl.pi_ctl_power, errRef);
 }
 static __INLINE void PMSM_FOC_idq_Assign(void) {
@@ -394,12 +401,12 @@ void PMSM_FOC_idqCalc(void) {
 			_gFOC_Ctrl.pi_ctl_trq->max = 0;
 			_gFOC_Ctrl.pi_ctl_trq->min = 0; //防止倒转
 		}
-		float errRef = _gFOC_Ctrl.params.s_maxRPM - _gFOC_Ctrl.in.s_motRPM;
+		float errRef = _gFOC_Ctrl.userLim.s_motRPMLim - _gFOC_Ctrl.in.s_motRPM;
 		float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_trq, errRef, _gFOC_Ctrl.params.n_TrqVelLimGain);
 		_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
 	}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
-		_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.params.s_maxIdq;
-		_gFOC_Ctrl.pi_ctl_spd->min = _gFOC_Ctrl.params.s_minIdq;
+		_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.userLim.s_PhaseCurrLim;
+		_gFOC_Ctrl.pi_ctl_spd->min = -_gFOC_Ctrl.userLim.s_PhaseCurrLim;
 		float refSpeed = eCtrl_get_RefSpeed();
 		if (_gFOC_Ctrl.in.b_cruiseEna) {
 			refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
@@ -437,30 +444,37 @@ bool PMSM_FOC_Is_Start(void) {
 }
 
 void PMSM_FOC_iBusLimit(float ibusLimit) {
-	_gFOC_Ctrl.params.s_maxiDC = (ibusLimit);
+	_gFOC_Ctrl.userLim.s_iDCLim = (ibusLimit);
 }
 
 void PMSM_FOC_SpeedLimit(float speedLimit) {
-	if (speedLimit > MAX_SPEED) {
-		speedLimit = MAX_SPEED;
+	if (speedLimit > _gFOC_Ctrl.hwLim.s_motRPMMax) {
+		speedLimit = _gFOC_Ctrl.hwLim.s_motRPMMax;
 	}
-	_gFOC_Ctrl.params.s_maxRPM = (speedLimit);
+	_gFOC_Ctrl.userLim.s_motRPMLim = (speedLimit);
 }
 
 float PMSM_FOC_GetSpeedLimit(void) {
-	return _gFOC_Ctrl.params.s_maxRPM;
+	return _gFOC_Ctrl.userLim.s_motRPMLim;
 }
 
 void PMSM_FOC_TorqueLimit(float torqueLimit) {
-	if (torqueLimit > MAX_TORQUE) {
-		torqueLimit = MAX_TORQUE;
+	if (torqueLimit > _gFOC_Ctrl.hwLim.s_torqueMax) {
+		torqueLimit = _gFOC_Ctrl.hwLim.s_torqueMax;
 	}
-	_gFOC_Ctrl.params.s_maxTorque = torqueLimit;
+	_gFOC_Ctrl.userLim.s_torqueLim = torqueLimit;
 }
 float PMSM_FOC_GetTorqueLimit(void) {
-	return _gFOC_Ctrl.params.s_maxTorque;
+	return _gFOC_Ctrl.userLim.s_torqueLim;
+}
+
+void PMSM_FOC_SeteBrkPhaseCurrent(float curr) {
+	_gFOC_Ctrl.userLim.s_iDCeBrkLim = curr;
 }
 
+float PMSM_FOC_GeteBrkPhaseCurrent(void) {
+	return _gFOC_Ctrl.userLim.s_iDCeBrkLim ;
+}
 
 void PMSM_FOC_VbusVoltage(float vbusVol) {
 	_gFOC_Ctrl.in.s_vDC = vbusVol;
@@ -503,7 +517,7 @@ bool PMSM_FOC_Set_Speed(float rpm) {
 	if (_gFOC_Ctrl.in.b_cruiseEna) {
 		return false;
 	}
-	eCtrl_set_TgtSpeed(min(ABS(rpm), _gFOC_Ctrl.params.s_maxRPM)*SIGN(rpm));
+	eCtrl_set_TgtSpeed(min(ABS(rpm), _gFOC_Ctrl.userLim.s_motRPMLim)*SIGN(rpm));
 	return true;
 }
 

+ 27 - 9
Applications/foc/core/PMSM_FOC_Core.h

@@ -21,17 +21,11 @@ typedef enum {
 
 typedef struct {
 	u8 	  n_poles;
-	float s_maxIdq;
-	float s_minIdq;
-	float s_maxiDC;
-	float s_maxvDC;
-	DQ_t  maxvDQ;
-	DQ_t  minvDQ;
-	float s_maxRPM;
-	float s_maxTorque;
 	float n_modulation;
 	float n_PhaseFilterCeof;
 	float n_TrqVelLimGain;
+	DQ_t  maxvDQ;
+	DQ_t  minvDQ;
 }FOC_Params;
 
 typedef struct {
@@ -48,7 +42,6 @@ typedef struct {
 	DQ_t    s_targetVdq;
 	float   s_targetTorque; //限速后的实际扭矩
 	float 	s_vDC;
-	float   s_LimitiDC; //母线限流
 	EPM_Dir_t epmDirection;
 	u8      n_ctlMode;
 	bool    b_motEnable;
@@ -60,6 +53,27 @@ typedef struct {
 	float   s_manualAngle; //mainly used when calibrate hall/mtpa. 
 }FOC_InP;
 
+typedef struct {
+	float s_motRPMLim;
+	float s_torqueLim;
+	float s_iDCLim;
+	float s_PhaseCurrLim; //最大相电流
+	float s_iDCeBrkLim; //最大母线回收电流
+	float s_PhaseeVoleBrkLim;
+	float s_vDCMinLim;
+	float s_vDCMaxLim;
+}FOC_UserLimit;
+
+typedef struct {
+	float s_motRPMMax;
+	float s_PhaseCurrMax;
+	float s_PhaseVolMax;
+	float s_iDCMax;
+	float s_vDCMax;
+	float s_torqueMax;
+}FOC_HwLimit;
+
+
 typedef struct {
 	u16   n_Duty[3];
 	u16   n_lowDuty;
@@ -104,6 +118,8 @@ typedef struct {
 	FOC_InP       in;
 	FOC_OutP      out;
 	FOC_Params    params;
+	FOC_UserLimit userLim;
+	FOC_HwLimit   hwLim;
 	int           ctrl_count;
 }PMSM_FOC_Ctrl;
 
@@ -195,6 +211,8 @@ 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_SeteBrkPhaseCurrent(float curr);
+float PMSM_FOC_GeteBrkPhaseCurrent(void);
 
 #endif /* _PMSM_FOC_Core_H__ */
 

+ 1 - 1
Applications/foc/core/e_ctrl.c

@@ -63,7 +63,7 @@ void _eCtrl_process_eBrake(void) {
 	g_eCtrl.speed_shadow = 0.0f;
 	if (g_eCtrl.is_ebrake) {
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_CURRENT_BRK);
-		eCtrl_set_TgtCurrent(-nv_get_foc_params()->s_maxBrkCurrent);
+		eCtrl_set_TgtCurrent(-PMSM_FOC_GeteBrkPhaseCurrent());
 	}else {
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_TRQ);
 	}

+ 1 - 1
Project/MC100.uvoptx

@@ -211,7 +211,7 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>1</aLwin>
+        <aLwin>0</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>