Explorar el Código

hall 校准调试

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui hace 3 años
padre
commit
af28139d43

+ 10 - 6
Applications/app/app.c

@@ -20,6 +20,7 @@ extern measure_time_t g_meas_timeup;
 
 
 #ifdef JTAG_DEBUG
 #ifdef JTAG_DEBUG
 int jtag_cmd = 0;
 int jtag_cmd = 0;
+int jtag_data = 0;
 void fetch_jtag_cmd(void) {
 void fetch_jtag_cmd(void) {
 	foc_cmd_body_t foc_cmd;
 	foc_cmd_body_t foc_cmd;
 	u8 cmd_data[32];
 	u8 cmd_data[32];
@@ -29,12 +30,15 @@ void fetch_jtag_cmd(void) {
 		cmd_data[0] = jtag_cmd;
 		cmd_data[0] = jtag_cmd;
 		foc_send_command(&foc_cmd);
 		foc_send_command(&foc_cmd);
 		jtag_cmd = 0;
 		jtag_cmd = 0;
-	}else if (jtag_cmd == 3 || jtag_cmd == 4) {
-		if (jtag_cmd ==3) {
-			PMSM_FOC_SetOpenVdq(0, S16Q5(8));
-		}else {
-			PMSM_FOC_SetOpenVdq(0, 0);
-		}
+	}else if (jtag_cmd == 3) {
+		PMSM_FOC_SetOpenVdq(S16Q5(jtag_data), 0);
+		jtag_cmd = 0;
+	}else if (jtag_cmd == 4) {
+		foc_cmd.cmd = Foc_Cali_Hall_Phase;
+		foc_cmd.data = cmd_data;
+		encode_s16(cmd_data, jtag_data);
+		foc_send_command(&foc_cmd);
+		jtag_cmd = 0;
 	}
 	}
 }
 }
 #else
 #else

+ 3 - 3
Applications/bsp/mc_hall_gpio.c

@@ -7,9 +7,9 @@ static void _gpio_irq_enable(void);
 static hall_io_t g_hall;
 static hall_io_t g_hall;
 
 
 void mc_hall_init(void){
 void mc_hall_init(void){
-	gpio_init(HALL_1_GROUP,  GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_1_PIN);
-	gpio_init(HALL_2_GROUP,  GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_2_PIN);
-	gpio_init(HALL_3_GROUP,  GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_3_PIN);
+	gpio_init(HALL_1_GROUP,  GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, HALL_1_PIN);
+	gpio_init(HALL_2_GROUP,  GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, HALL_2_PIN);
+	gpio_init(HALL_3_GROUP,  GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, HALL_3_PIN);
 	g_hall.is_edged = 0;
 	g_hall.is_edged = 0;
 	g_hall.hall_time = 0;
 	g_hall.hall_time = 0;
 	_gpio_irq_enable();
 	_gpio_irq_enable();

+ 1 - 6
Applications/bsp/pwm.c

@@ -84,11 +84,6 @@ static void _pwm_gpio_config(void)
 	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_4);//高刹车
 	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_4);//高刹车
 	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_5);//低刹车
 	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_5);//低刹车
 #endif
 #endif
-#ifdef GD32_FOC_DEMO
-	/* IR2136S enable pin */
-	gpio_bit_reset(GPIOA, GPIO_PIN_12);
-    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_12);
-#endif
 }
 }
 
 
 
 
@@ -121,7 +116,7 @@ static void _init_pwm_timer(void) {
     timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_LOW;
     timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_LOW;
     timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_LOW;
     timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_LOW;
     timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;
     timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;
-    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;
+    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
 
 
     timer_channel_output_config(timer,TIMER_CH_0,&timer_ocintpara);
     timer_channel_output_config(timer,TIMER_CH_0,&timer_ocintpara);
     timer_channel_output_pulse_value_config(timer,TIMER_CH_0,half_period/2);
     timer_channel_output_pulse_value_config(timer,TIMER_CH_0,half_period/2);

+ 2 - 1
Applications/foc/commands.c

@@ -80,7 +80,8 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		}		
 		}		
 		case Foc_Cali_Hall_Phase:
 		case Foc_Cali_Hall_Phase:
 		{
 		{
-			mc_hall_calibrate(decode_s16((u8 *)command->data));
+			s16 vd = decode_s16((u8 *)command->data);
+			mc_hall_calibrate(S16Q5(vd));
 			break;
 			break;
 		}
 		}
 		case Foc_Set_Open_Dq_Vol:
 		case Foc_Set_Open_Dq_Vol:

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

@@ -178,7 +178,8 @@ void PMSM_FOC_Schedule(void) {
 	SVM_Duty_Fix(&vAB, _gFOC_Ctrl.in.s_vDC, FOC_PWM_Half_Period, &_gFOC_Ctrl.out);
 	SVM_Duty_Fix(&vAB, _gFOC_Ctrl.in.s_vDC, FOC_PWM_Half_Period, &_gFOC_Ctrl.out);
 
 
 	if (_g_ctl_count++ % 10 == 0) {
 	if (_g_ctl_count++ % 10 == 0) {
-		plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
+		//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
+		plot_2data16(hall_sensor_get_theta()>>5, _gFOC_Ctrl.in.s_motAngle>>5);
 		//plot_3data16(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABC[1], _gFOC_Ctrl.in.s_iABC[2]);
 		//plot_3data16(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABC[1], _gFOC_Ctrl.in.s_iABC[2]);
 	}
 	}
 	phase_current_point(&_gFOC_Ctrl.out);
 	phase_current_point(&_gFOC_Ctrl.out);

+ 5 - 0
Applications/foc/motor/current.c

@@ -46,6 +46,11 @@ void phase_current_start_cali(void){
 	adc_current_sample_config(g_cs.sector);
 	adc_current_sample_config(g_cs.sector);
 }
 }
 
 
+void phase_current_wait_cali(void) {
+	while(g_cs.is_calibrating_offset) {
+		wdog_reload();
+	}
+}
 
 
 bool phase_current_offset(void) {
 bool phase_current_offset(void) {
 	current_samp_t *cs = &g_cs;
 	current_samp_t *cs = &g_cs;

+ 3 - 1
Applications/foc/motor/current.h

@@ -42,7 +42,7 @@ typedef struct current_sample {
 	u8    sector;
 	u8    sector;
 	phase_time_t time;	
 	phase_time_t time;	
 	volatile int   offset_sample_count;
 	volatile int   offset_sample_count;
-	bool  is_calibrating_offset;
+	volatile bool  is_calibrating_offset;
 }current_samp_t;
 }current_samp_t;
 
 
 void phase_current_init(void);
 void phase_current_init(void);
@@ -51,5 +51,7 @@ bool phase_current_offset(void);
 void phase_current_point(void *);
 void phase_current_point(void *);
 void phase_current_adc_triger(void);
 void phase_current_adc_triger(void);
 void phase_current_start_cali(void);
 void phase_current_start_cali(void);
+void phase_current_wait_cali(void);
+
 #endif /* _PHASE_CURRENT_H__ */
 #endif /* _PHASE_CURRENT_H__ */
 
 

+ 5 - 1
Applications/foc/motor/hall.c

@@ -9,6 +9,7 @@
 #include "app/nv_storage.h"
 #include "app/nv_storage.h"
 #include "bsp/timer_count32.h"
 #include "bsp/timer_count32.h"
 #include "libs/time_measure.h"
 #include "libs/time_measure.h"
+#include "libs/logger.h"
 
 
 //#define USE_DETECTED_ANGLE 1
 //#define USE_DETECTED_ANGLE 1
 
 
@@ -76,7 +77,7 @@ static bool __inline _hall_data_empty(void) {
 
 
 static void hall_sensor_default(void) {
 static void hall_sensor_default(void) {
 	memset(&_sensor_hander, 0, sizeof(_sensor_hander));
 	memset(&_sensor_hander, 0, sizeof(_sensor_hander));
-	_sensor_hander.phase_offset = HALL_PLACE_OFFSET;//mc_config_get()->hall_offset;
+	_sensor_hander.phase_offset = 0;//HALL_PLACE_OFFSET;//mc_config_get()->hall_offset;
 	memcpy((char *)_sensor_hander.angle_table, (char *)mc_config_get()->hall_table, sizeof(_sensor_hander.angle_table));
 	memcpy((char *)_sensor_hander.angle_table, (char *)mc_config_get()->hall_table, sizeof(_sensor_hander.angle_table));
 	_hall_init_el_angle();
 	_hall_init_el_angle();
 	hall_debug_log();
 	hall_debug_log();
@@ -322,12 +323,15 @@ static __inline__ s32 _get_delta_angle(u8 now, u8 next) {
 }
 }
 #endif
 #endif
 
 
+extern s16 _g_hall_angle;
 void HALL_IRQHandler(void) {
 void HALL_IRQHandler(void) {
 	time_measure_start(&g_meas_hall);
 	time_measure_start(&g_meas_hall);
 	u8 hall_stat_now = get_hall_stat(HALL_READ_TIMES);
 	u8 hall_stat_now = get_hall_stat(HALL_READ_TIMES);
 	u8 hall_stat_prev = _sensor_hander.hall_stat;
 	u8 hall_stat_prev = _sensor_hander.hall_stat;
 	u32 hall_ticks_now = timer_count32_get();	
 	u32 hall_ticks_now = timer_count32_get();	
 
 
+	//plot_2data16(hall_stat_now*50, _g_hall_angle);
+
 	/*获取当前转子角度*/
 	/*获取当前转子角度*/
 	s32 theta_now = _hall_position(hall_stat_now, hall_stat_prev);
 	s32 theta_now = _hall_position(hall_stat_now, hall_stat_prev);
 	if (theta_now == 0xFFFFFFFF) {
 	if (theta_now == 0xFFFFFFFF) {

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

@@ -12,6 +12,7 @@
 #include "foc/commands.h"
 #include "foc/commands.h"
 #include "libs/logger.h"
 #include "libs/logger.h"
 #include "bsp/sched_timer.h"
 #include "bsp/sched_timer.h"
+#include "foc/motor/hall.h"
 
 
 static bool _motor_started = false;
 static bool _motor_started = false;
 static float _motor_throttle = 0;
 static float _motor_throttle = 0;
@@ -20,6 +21,7 @@ void mc_init(void) {
 	adc_init();
 	adc_init();
 	pwm_3phase_init();
 	pwm_3phase_init();
 	samples_init();
 	samples_init();
+	hall_sensor_init();
 	foc_command_init();
 	foc_command_init();
 	PMSM_FOC_CoreInit();
 	PMSM_FOC_CoreInit();
 	sched_timer_enable(SPD_CTRL_MS);
 	sched_timer_enable(SPD_CTRL_MS);
@@ -41,12 +43,13 @@ bool mc_start(u8 mode) {
 		PMSM_FOC_SetErrCode(FOC_Throttle_Err);
 		PMSM_FOC_SetErrCode(FOC_Throttle_Err);
 		return false;
 		return false;
 	}
 	}
+	PMSM_FOC_Start(mode);
 	pwm_turn_on_low_side();
 	pwm_turn_on_low_side();
 	task_udelay(500);
 	task_udelay(500);
 	phase_current_start_cali();
 	phase_current_start_cali();
 	pwm_start();
 	pwm_start();
 	adc_start_convert();
 	adc_start_convert();
-	PMSM_FOC_Start(mode);
+	phase_current_wait_cali();
 	_motor_throttle = 0;
 	_motor_throttle = 0;
 	_motor_started = true;
 	_motor_started = true;
 	gpio_led2_enable(true);
 	gpio_led2_enable(true);
@@ -72,7 +75,7 @@ bool mc_stop(void) {
 	gpio_led2_enable(false);
 	gpio_led2_enable(false);
 	return true;
 	return true;
 }
 }
-
+s16 _g_hall_angle = 0;
 void mc_hall_calibrate(s16 vd) {
 void mc_hall_calibrate(s16 vd) {
 	if (PMSM_FOC_Is_Start()) {
 	if (PMSM_FOC_Is_Start()) {
 		return;
 		return;
@@ -80,22 +83,25 @@ void mc_hall_calibrate(s16 vd) {
 	pwm_turn_on_low_side();
 	pwm_turn_on_low_side();
 	task_udelay(500);
 	task_udelay(500);
 	PMSM_FOC_Start(OPEN_MODE);
 	PMSM_FOC_Start(OPEN_MODE);
+	phase_current_start_cali();
 	pwm_start();
 	pwm_start();
 	adc_start_convert();
 	adc_start_convert();
+	phase_current_wait_cali();
 	PMSM_FOC_SetOpenVdq(vd, 0);
 	PMSM_FOC_SetOpenVdq(vd, 0);
 	delay_ms(1000);
 	delay_ms(1000);
 
 
-	for (int i = 0; i < 5; i++) {
+	for (int i = 0; i < 50; i++) {
 		for (s16 angle = 0; angle < 360; angle++) {
 		for (s16 angle = 0; angle < 360; angle++) {
 			PMSM_FOC_Set_Angle(angle);
 			PMSM_FOC_Set_Angle(angle);
+			_g_hall_angle = angle;
+			delay_ms(1);
 		}
 		}
 	}
 	}
-	delay_ms(1000);
-
+	delay_ms(500);
+	PMSM_FOC_SetOpenVdq(0, 0);
+	delay_ms(500);
 	adc_stop_convert();
 	adc_stop_convert();
-
 	pwm_stop();
 	pwm_stop();
-
 	PMSM_FOC_Stop();
 	PMSM_FOC_Stop();
 }
 }
 
 
@@ -191,16 +197,24 @@ void ADC_IRQHandler(void) {
 	TIME_MEATURE_END();
 	TIME_MEATURE_END();
 }
 }
 
 
-/*FOC 的部分处理,比如速度环,状态机,转把采集等*/
+//#define ANGLE_TEST
+#ifdef ANGLE_TEST
 static s16 _g_test_angle = 0;
 static s16 _g_test_angle = 0;
-void Sched_MC_mTask(void) {
-	u8 runMode = PMSM_FOC_CtrlMode();
+static void _debug_angle(void) {
 	if (_motor_started) {
 	if (_motor_started) {
 		PMSM_FOC_Set_Angle(_g_test_angle);
 		PMSM_FOC_Set_Angle(_g_test_angle);
 		if (++_g_test_angle >= 360) {
 		if (++_g_test_angle >= 360) {
 			_g_test_angle = 0;
 			_g_test_angle = 0;
 		}
 		}
 	}
 	}
+}
+#endif
+/*FOC 的部分处理,比如速度环,状态机,转把采集等*/
+void Sched_MC_mTask(void) {
+	u8 runMode = PMSM_FOC_CtrlMode();
+#if ANGLE_TEST
+	_debug_angle();
+#endif
 	if (runMode != OPEN_MODE) {
 	if (runMode != OPEN_MODE) {
 		if (get_throttle_float() != _motor_throttle) {
 		if (get_throttle_float() != _motor_throttle) {
 			_motor_throttle = get_throttle_float();
 			_motor_throttle = get_throttle_float();

+ 22 - 1
Project/GD32_DEMO.uvoptx

@@ -117,6 +117,11 @@
         <pMon>Segger\JL2CM3.dll</pMon>
         <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
       </DebugOpt>
       <TargetDriverDllRegistry>
       <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGUARM</Key>
+          <Name>?</Name>
+        </SetRegEntry>
         <SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Number>0</Number>
           <Key>ARMRTXEVENTFLAGS</Key>
           <Key>ARMRTXEVENTFLAGS</Key>
@@ -148,7 +153,7 @@
         <Ww>
         <Ww>
           <count>0</count>
           <count>0</count>
           <WinNumber>1</WinNumber>
           <WinNumber>1</WinNumber>
-          <ItemText>jtag_cmd</ItemText>
+          <ItemText>jtag_cmd,0x0A</ItemText>
         </Ww>
         </Ww>
         <Ww>
         <Ww>
           <count>1</count>
           <count>1</count>
@@ -170,6 +175,16 @@
           <WinNumber>1</WinNumber>
           <WinNumber>1</WinNumber>
           <ItemText>_gFOC_Ctrl,0x0A</ItemText>
           <ItemText>_gFOC_Ctrl,0x0A</ItemText>
         </Ww>
         </Ww>
+        <Ww>
+          <count>5</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>jtag_data,0x0A</ItemText>
+        </Ww>
+        <Ww>
+          <count>6</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>g_meas_foc,0x0A</ItemText>
+        </Ww>
       </WatchWindow1>
       </WatchWindow1>
       <Tracepoint>
       <Tracepoint>
         <THDelay>0</THDelay>
         <THDelay>0</THDelay>
@@ -213,6 +228,12 @@
       <pszMrulep></pszMrulep>
       <pszMrulep></pszMrulep>
       <pSingCmdsp></pSingCmdsp>
       <pSingCmdsp></pSingCmdsp>
       <pMultCmdsp></pMultCmdsp>
       <pMultCmdsp></pMultCmdsp>
+      <SystemViewers>
+        <Entry>
+          <Name>System Viewer\TIMER0</Name>
+          <WinId>35905</WinId>
+        </Entry>
+      </SystemViewers>
     </TargetOption>
     </TargetOption>
   </Target>
   </Target>
 
 

+ 1 - 1
Project/version.cfg

@@ -1,3 +1,3 @@
 project: MC100
 project: MC100
 version: 01
 version: 01
-debug: 0
+debug: 1