Sfoglia il codice sorgente

加入转把处理

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

+ 1 - 12
Applications/app/key_process.c

@@ -14,7 +14,6 @@
 static u8 key_value[3];
 static float foc_current = 0.0f;
 static u8 ctrl_mode = CTRL_MODE_OPEN;
-static float max_speed = 2000;
 static float target_speed = 2000;
 static u32 key_task(void *p) {
 	foc_cmd_body_t foc_cmd;
@@ -23,8 +22,6 @@ static u32 key_task(void *p) {
 	int value = gpio_startkey_value();
 	if (value != key_value[KEY_START]) {
 		if (value) {
-			foc_current = 0.0f;
-			ctrl_mode = CTRL_MODE_OPEN;
 			foc_cmd.cmd = Foc_Start_Motor;
 			if (PMSM_FOC_Is_Start()) {
 				PMSM_FOC_Set_Torque(foc_current);
@@ -41,15 +38,7 @@ static u32 key_task(void *p) {
 	value = gpio_stopkey_value();
 	if (value != key_value[KEY_STOP]) {
 		if (value) {
-			if (foc_current < 5.0f) {
-				foc_current += 1.0f;
-			}
-			target_speed = 1000.0f;
-			PMSM_FOC_SpeedLimit(max_speed);
-			PMSM_FOC_Set_Speed(max_speed);
-			PMSM_FOC_Set_Torque(foc_current);
-			ctrl_mode = CTRL_MODE_TRQ;
-			PMSM_FOC_SetCtrlMode(ctrl_mode);
+			PMSM_FOC_SetCtrlMode(CTRL_MODE_SPD);
 		}
 		key_value[KEY_STOP] = value;
 	}

+ 6 - 3
Applications/bsp/adc.c

@@ -133,6 +133,12 @@ static void adc_gpio_init(void) {
 	/* configure ADC pin, bus voltage sampling -- ADC_IN0(PA0) */
 	gpio_init(VBUS_V_ADC_GROUP, VBUS_V_ADC_MODE, GPIO_OSPEED_50MHZ, VBUS_V_ADC_PIN);
 #endif
+#ifdef THROTTLE_V_ADC_GROUP
+	rcu_periph_clock_enable(THROTTLE_V_ADC_RCU);
+	/* configure ADC pin, bus voltage sampling -- ADC_IN0(PA0) */
+	gpio_init(THROTTLE_V_ADC_GROUP, THROTTLE_V_ADC_MODE, GPIO_OSPEED_50MHZ, THROTTLE_V_ADC_PIN);
+#endif
+
 #ifdef TEMP_V_ADC_GROUP
 	rcu_periph_clock_enable(TEMP_V_ADC_GROUP);
 	/* configure ADC pin, temperature sampling -- ADC_IN11(PC1) */
@@ -169,9 +175,6 @@ void adc_start_convert(void) {
 	adc_interrupt_enable(ADC0, ADC_INT_EOIC);
 
 	adc_update_ext_trigger(ADC_TRIGGER_PHASE);
-
-	//adc_enable_ext_trigger();
-
 }
 
 void adc_stop_convert(void) {

+ 6 - 2
Applications/bsp/board_gd32demo.h

@@ -84,7 +84,11 @@
 #define VBUS_V_ADC_RCU 		RCU_GPIOA
 #define VBUS_V_ADC_MODE 	GPIO_MODE_AIN
 
-#define THROTTLE_CHAN   ADC_CHANNEL_2 
+#define THROTTLE_CHAN   		ADC_CHANNEL_10
+#define THROTTLE_V_ADC_GROUP 	GPIOC
+#define THROTTLE_V_ADC_PIN 		GPIO_PIN_0
+#define THROTTLE_V_ADC_RCU 		RCU_GPIOC
+#define THROTTLE_V_ADC_MODE 	GPIO_MODE_AIN
 
 /* 是否有目前电流采集 */
 #define NO_SAMPLE_IDC //如果硬件没有采集母线电流,定义一下
@@ -92,7 +96,7 @@
 /* ADC 的电压系数 */
 #define ADC_TO_CURR_ceof (0.008f)
 #define VBUS_VOL_CEOF (ADC_REFERENCE_VOLTAGE*16/4096.0f)
-#define THROTTLE_VOL_CEOF (1)
+#define THROTTLE_VOL_CEOF (ADC_REFERENCE_VOLTAGE/4096.0f * 2.0f)
 
 /* 是否用编码器 */
 #define USE_ENCODER_ABI

+ 2 - 6
Applications/bsp/gpio.c

@@ -21,7 +21,7 @@ const static gpio_pin_config_t _pins[] = {
 	[LED3_Enable_pin] = {GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 0},
 	[KEY_Start_pin] = {GPIOB, GPIO_PIN_5, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 0},
 	[KEY_Stop_pin] = {GPIOB, GPIO_PIN_11, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 0},
-	[KEY_Func_pin] = {GPIOC, GPIO_PIN_0, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 0},
+//	[KEY_Func_pin] = {GPIOC, GPIO_PIN_0, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 0},
 #endif	
 };
 void gpio_pin_init(void){
@@ -88,11 +88,7 @@ int gpio_stopkey_value(void) {
 }
 
 int gpio_funckey_value(void) {
-#ifdef GD32_FOC_DEMO
-	return gpio_input_bit_get(_pins[KEY_Func_pin].group, _pins[KEY_Func_pin].pin)==SET?1:0;
-#else
-	return 1;
-#endif
+	return 0;
 }
 
 

+ 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();
 			}

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

@@ -313,6 +313,9 @@ void PMSM_FOC_idqCalc(void) {
 		float refTorque = eCtrl_get_RefTorque();
 		_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 < 10) {
+			_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
+		}
 		float errRef = _gFOC_Ctrl.params.s_maxRPM - _gFOC_Ctrl.in.s_motRPM;
 		_gFOC_Ctrl.in.s_targetTorque = PI_Controller_run(_gFOC_Ctrl.pi_ctl_trq, errRef);
 	}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD){

+ 3 - 3
Applications/foc/foc_config.h

@@ -5,15 +5,15 @@
 #define Default_Spd_Limit 5200   /* 默认速度最大值, 单位 RPM */
 
 /* 转把 */
-#define THROTTLE_LOW_VALUE 0.2f /* 转把最小值 */
-#define THROTTLE_MAX_VALUE 4.9f /* 转把最大值 */
+#define THROTTLE_LOW_VALUE 1.0f /* 转把最小值 */
+#define THROTTLE_MAX_VALUE 4.0f /* 转把最大值 */
 #define THROTTLE_MIN_RPM   10   /* 转把对应最小的速度 */
 #define THROTTLE_MIN_IDQ   20   /* 转把对应最小的扭矩电流 Q轴 */
 #define MAX_iDQ            15  /* 最大DQ轴电流, A*/
 #define MAX_SPEED          8200 /* 最大转速 RPM*/
 #define MAX_iDC            45   /* 最大母线电流 A*/
 #define MIN_CRUISE_RPM 	   1000     /* 能启动定速巡航的最小速度 */
-#define MAX_TORQUE         15
+#define MAX_TORQUE         7.5f
 #ifdef GD32_FOC_DEMO
 #define MAX_vDC (16)   /* 母线最大电压 V*/
 #else

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

@@ -149,11 +149,11 @@ bool mc_throttle_released(void) {
 	return get_throttle_float() < THROTTLE_LOW_VALUE;
 }
 
-static float _get_speed_from_throttle(void) {
+static float _get_speed_from_throttle(float f_throttle) {
 	if (motor.b_ignor_throttle) {
 		return motor.s_targetFix;
 	}
-	float f_throttle = motor.throttle;
+
 	if (f_throttle <= (THROTTLE_LOW_VALUE)) {
 		return 0;
 	}
@@ -161,15 +161,14 @@ static float _get_speed_from_throttle(void) {
 
 	float ration = delta / (THROTTLE_MAX_VALUE - THROTTLE_LOW_VALUE);
 
-	return (THROTTLE_MIN_RPM + PMSM_FOC_GetSpeedLimit() * ration);
+	return (PMSM_FOC_GetSpeedLimit() * ration);
 }
 
-static float _get_idq_from_throttle(void) {
+static float _get_torque_from_throttle(float f_throttle) {
 	if (motor.b_ignor_throttle) {
 		return motor.s_targetFix;
 	}
 
-	float f_throttle = motor.throttle;
 	if (f_throttle <= (THROTTLE_LOW_VALUE)) {
 		return 0;
 	}
@@ -177,7 +176,7 @@ static float _get_idq_from_throttle(void) {
 
 	float ration = delta / (THROTTLE_MAX_VALUE - THROTTLE_LOW_VALUE);
 
-	return (THROTTLE_MIN_IDQ + MAX_iDQ * ration);
+	return (MAX_TORQUE * ration);
 }
 
 /*do 50 times filter*/
@@ -244,14 +243,15 @@ void Sched_MC_mTask(void) {
 #endif
 	if (runMode != CTRL_MODE_OPEN) {
 		eCtrl_Running();
-		if (get_throttle_float() != motor.throttle) {
-			motor.throttle = get_throttle_float();
+		float f_throttle = get_throttle_float();
+		if (f_throttle != motor.throttle) {
+			motor.throttle = f_throttle;
 			if (runMode == CTRL_MODE_SPD) {
-				float speed_Ref = _get_speed_from_throttle();
+				float speed_Ref = _get_speed_from_throttle(f_throttle);
 				PMSM_FOC_Set_Speed(speed_Ref);
 			}else if (runMode == CTRL_MODE_TRQ) {
-				float torque_idq = _get_idq_from_throttle();
-				PMSM_FOC_Set_Torque(torque_idq);
+				float torque = _get_torque_from_throttle(f_throttle);
+				PMSM_FOC_Set_Torque(torque);
 			}
 		}		
 		PMSM_FOC_idqCalc();

+ 4 - 4
Applications/foc/samples.c

@@ -18,7 +18,7 @@ static void sample_throttle(void);
 
 static u32 sample_task(void *);
 static samples_t _vbus;
-#ifndef GD32_FOC_DEMO
+#ifdef THROTTLE_CHAN
 static samples_t _throttle;
 #endif
 void samples_init(void){
@@ -26,7 +26,7 @@ void samples_init(void){
 	_vbus.value = (MAX_vDC);
 	_vbus.lowpass = (0.2f); 
 
-#ifndef GD32_FOC_DEMO
+#ifdef THROTTLE_CHAN
 	_throttle.filted_value = (0);
 	_throttle.value = (0);
 	_throttle.lowpass = (0.2f); 
@@ -50,7 +50,7 @@ s16 get_vbus_sfix5(void){
 
 
 float get_throttle_float(void) {
-	return 0.0f;//(float)((s32)(_throttle.filted_value * 100.0f)/100.0f);
+	return _throttle.filted_value;
 }
 static u32 sample_task(void *param) {
 	sample_vbus();
@@ -67,7 +67,7 @@ static void sample_vbus(void){
 }
 
 static void sample_throttle(void){
-#ifndef GD32_FOC_DEMO	
+#ifdef THROTTLE_CHAN
 	s16 vadc = adc_sample_regular_channel(THROTTLE_CHAN, 16);
 	_throttle.value = (float)vadc * THROTTLE_VOL_CEOF;
 	LowPass_Filter(_throttle.filted_value, _throttle.value, _throttle.lowpass);

+ 1 - 1
Project/GD32_DEMO.uvoptx

@@ -120,7 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>&amp;</Name>
+          <Name>?</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>