Sfoglia il codice sorgente

加入转把电压,母线电压采集,电流环ramp给定稍微慢一些,防止过冲

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 anni fa
parent
commit
64bc09e7da

+ 4 - 4
Applications/app/nv_storage.c

@@ -40,11 +40,11 @@ static void nv_default_motor_params(void) {
 static void nv_default_foc_params(void) {
 	foc_params.s_maxvDC = 48;
 	foc_params.s_maxiDC = 30;
-	foc_params.s_maxIdq = 30;
-	foc_params.s_minIdq = -30;
-	foc_params.s_maxRPM = 1500;
+	foc_params.s_maxIdq = 180;
+	foc_params.s_minIdq = -180;
+	foc_params.s_maxRPM = 8200;
 	foc_params.s_maxEpmRPM = 133;
-	foc_params.s_maxTorque = 30;
+	foc_params.s_maxTorque = 180;
 	foc_params.s_maxBrkCurrent = 2.0f;
 	foc_params.n_currentBand = 500;
 	foc_params.n_modulation = 1.0f;

+ 31 - 11
Applications/bsp/board_mc_v1.h

@@ -24,7 +24,7 @@
 #define TSampleBefore (TDead + TRise) //采样开始前需要等待的时间
 
 #define ADC_REFERENCE_VOLTAGE  (3.3F)
-
+#define ADC_FULL_MAX          (4096.0F)
 /* MOS驱动 */
 #define pwm_timer TIMER0
 #define PWM_MODE TIMER_OC_MODE_PWM1
@@ -82,32 +82,52 @@
 #define W_PHASE_ADC_RCU 	RCU_GPIOA
 #define W_PHASE_ADC_MODE 	GPIO_MODE_AIN
 
+#define ADC_TO_CURR_ceof1 (0.3362f/1.0f)
+#define ADC_TO_CURR_ceof2 ADC_TO_CURR_ceof1//(0.3404f)
+
 
 /* 温度,母线,油门等采集*/
 #define MOTOR_TEMP_CHAN ADC_CHANNEL_0
 
-#define VBUS_V_CHAN 		ADC_CHANNEL_7
+#define VBUS_V_CHAN 		ADC_CHANNEL_4
 #define VBUS_V_ADC_GROUP 	GPIOA
-#define VBUS_V_ADC_PIN 		GPIO_PIN_7
+#define VBUS_V_ADC_PIN 		GPIO_PIN_4
 #define VBUS_V_ADC_RCU 		RCU_GPIOA
 #define VBUS_V_ADC_MODE 	GPIO_MODE_AIN
 
+#define VBUS_VOL_CEOF (ADC_REFERENCE_VOLTAGE*41/ADC_FULL_MAX)
+
 /* 是否有目前电流采集 */
 #define NO_SAMPLE_IDC //如果硬件没有采集母线电流,定义一下
 
-/*
-#define THROTTLE_CHAN ADC_CHANNEL_1 //转把信号
+
+#define THROTTLE_CHAN           ADC_CHANNEL_1 //转把信号
 #define THROTTLE_V_ADC_GROUP 	GPIOA
 #define THROTTLE_V_ADC_PIN 		GPIO_PIN_1
 #define THROTTLE_V_ADC_RCU 		RCU_GPIOA
 #define THROTTLE_V_ADC_MODE 	GPIO_MODE_AIN
-*/
-
-#define ADC_TO_CURR_ceof1 (0.3362f)
-#define ADC_TO_CURR_ceof2 (0.3404f)
 
-#define VBUS_VOL_CEOF (ADC_REFERENCE_VOLTAGE*45/4096.0f)
-#define THROTTLE_VOL_CEOF (1)
+#define THROTTLE_VOL_CEOF (ADC_REFERENCE_VOLTAGE*(15.1f/10.0f)/ADC_FULL_MAX)
+
+/* UVW三相对地电压采集 */
+#define U_VOL_ADC_CHAN     ADC_CHANNEL_9
+#define U_VOL_ADC_GROUP 	GPIOB
+#define U_VOL_ADC_PIN 	GPIO_PIN_1
+#define U_VOL_ADC_RCU 	RCU_GPIOB
+#define U_VOL_ADC_MODE 	GPIO_MODE_AIN
+
+#define V_VOL_ADC_CHAN     ADC_CHANNEL_8
+#define V_VOL_ADC_GROUP 	GPIOB
+#define V_VOL_ADC_PIN 	GPIO_PIN_0
+#define V_VOL_ADC_RCU 	RCU_GPIOB
+#define V_VOL_ADC_MODE 	GPIO_MODE_AIN
+
+#define W_VOL_ADC_CHAN     ADC_CHANNEL_7
+#define W_VOL_ADC_GROUP 	GPIOA
+#define W_VOL_ADC_PIN 	GPIO_PIN_7
+#define W_VOL_ADC_RCU 	RCU_GPIOA
+#define W_VOL_ADC_MODE 	GPIO_MODE_AIN
+#define UVW_VOL_CEOF (ADC_REFERENCE_VOLTAGE*(41.0f)/ADC_FULL_MAX)
 
 /* 刹车手把输入 */
 //#define GPIO_BRAKE_IN_GROUP 	GPIOA

+ 1 - 1
Applications/bsp/bsp.h

@@ -21,7 +21,7 @@
 #define ADC_CLOCK_MHz (30u)
 #define NS_PER_TCLK (8u) /* (1/120000000 * 1000000000) */
 #define NS_2_TCLK(ns) (((ns)/NS_PER_TCLK) + 1u) //ns תΪpwmʹ�õ��Ǹ�TIM��clk count
-#define FOC_PWM_FS (16000u)
+#define FOC_PWM_FS (15000u)
 #define FOC_PWM_period (TIM_CLOCK/FOC_PWM_FS)
 #define FOC_PWM_Half_Period (FOC_PWM_period/2)
 

+ 1 - 1
Applications/foc/commands.c

@@ -49,7 +49,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			bool success;
 			foc_start_cmd_t *scmd = (foc_start_cmd_t *)command->data;
 			if (scmd->start_stop == Foc_Start) {
-				success = mc_start(CTRL_MODE_OPEN);
+				success = mc_start(CTRL_MODE_TRQ);
 			}else if (scmd->start_stop == Foc_Stop) {
 				success = mc_stop();
 			}

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

@@ -98,7 +98,7 @@ static __INLINE void FOC_DqRamp_init(dq_Rctrl *c, int count) {
 }
 
 static __INLINE void FOC_Set_iDqRamp(dq_Rctrl *c, float target) {
-	FOC_Set_DqRamp(c, target, (IDQ_CTRL_TS/SPD_CTRL_TS - 1));
+	FOC_Set_DqRamp(c, target, (/*IDQ_CTRL_TS/SPD_CTRL_TS - 1*/CURRENT_LOOP_RAMP_COUNT));
 }
 
 static __INLINE void FOC_Set_vDqRamp(dq_Rctrl *c, float target) {
@@ -166,7 +166,7 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
 	}
 
 	_gFOC_Ctrl.in.s_motRPM = motor_encoder_get_speed() / _gFOC_Ctrl.params.n_poles;
-	//_gFOC_Ctrl.in.s_vDC = get_vbus_float();
+	_gFOC_Ctrl.in.s_vDC = get_vbus_float();
 	//sample current
 	phase_current_get(_gFOC_Ctrl.in.s_iABC);
 
@@ -183,6 +183,11 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
 
 static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
 	/* update id pi ctrl */
+	_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;
+
 	if (_gFOC_Ctrl.params.maxvDQ.d != _gFOC_Ctrl.pi_ctl_id->max) {
 		_gFOC_Ctrl.pi_ctl_id->max = _gFOC_Ctrl.params.maxvDQ.d;
 	}
@@ -211,8 +216,10 @@ static __INLINE void PMSM_FOC_Plot_Debug(void) {
 		//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
 		if (jtag_plot == 2) {
 			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
-			plot_3data16(FtoS16x10(_gFOC_Ctrl.in.s_iABCFilter[0]), FtoS16x10(_gFOC_Ctrl.in.s_iABCFilter[1]), FtoS16x10(_gFOC_Ctrl.in.s_iABCFilter[2]));
+			//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
+			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_iABC[1]), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
 			//plot_2data16(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABCFilter[0]);
+			plot_3data16(_gFOC_Ctrl.in.s_motRPM, _gFOC_Ctrl.idq_ctl[1].s_Cp * 10, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
 		}
 		//plot_1data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle));
 		//plot_1data16(_gFOC_Ctrl.in.s_motRPM);
@@ -350,7 +357,7 @@ void PMSM_FOC_idqCalc(void) {
 			}
 		}
 	}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
-		float refTorque = eCtrl_get_RefTorque();
+		float refTorque = eCtrl_get_FinalTorque();
 		_gFOC_Ctrl.pi_ctl_trq->max = refTorque;
 		_gFOC_Ctrl.pi_ctl_trq->min = -refTorque;
 		if ((eCtrl_get_FinalTorque() <= 0.0001f) && _gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE) {

+ 4 - 3
Applications/foc/foc_config.h

@@ -5,8 +5,8 @@
 #define Default_Spd_Limit 5200   /* 默认速度最大值, 单位 RPM */
 
 /* 转把 */
-#define THROTTLE_LOW_VALUE 1.0f /* 转把最小值 */
-#define THROTTLE_MAX_VALUE 4.0f /* 转把最大值 */
+#define THROTTLE_LOW_VALUE 1.2f /* 转把最小值 */
+#define THROTTLE_MAX_VALUE 3.8f /* 转把最大值 */
 #define THROTTLE_MIN_RPM   10   /* 转把对应最小的速度 */
 #define THROTTLE_MIN_IDQ   20   /* 转把对应最小的扭矩电流 Q轴 */
 #define MAX_iDQ            15  /* 最大DQ轴电流, A*/
@@ -39,7 +39,8 @@
 #define eCTRL_NEG_TORQUE (-100)   /* ebrake 的最大方向DQ电流,单位 ACKED_KEY*/
 
 
-#define CURRENT_BANDWITH 250 /* 电流环带宽 */
+#define CURRENT_BANDWITH 500 /* 电流环带宽 */
+#define CURRENT_LOOP_RAMP_COUNT 300
 
 #define SVM_Modulation 1.0f //(0.96f)
 

+ 2 - 2
Applications/foc/motor/motor.c

@@ -68,7 +68,7 @@ bool mc_start(u8 mode) {
 		err_add_record(FOC_Throttle_Err, get_throttle_float() * 10);
 		return false;
 	}
-	eCtrl_init(2000, 100);
+	eCtrl_init(200, 3000);
 	motor_encoder_start(motor.s_direction);
 	PMSM_FOC_Start(mode);
 	pwm_turn_on_low_side();
@@ -304,7 +304,7 @@ void Sched_MC_mTask(void) {
 		if (f_throttle != motor.throttle) {
 			motor.throttle = f_throttle;
 			torque_speed_target(runMode, f_throttle);
-		}		
+		}
 		PMSM_FOC_idqCalc();
 	}
 }

+ 1 - 0
Project/MC100.uvoptx

@@ -120,6 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
+          <Name>7</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>