Просмотр исходного кода

电流传感器调试

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 лет назад
Родитель
Сommit
4682d70d21

+ 5 - 5
Applications/app/nv_storage.c

@@ -39,13 +39,13 @@ static void nv_default_motor_params(void) {
 }
 
 static void nv_default_foc_params(void) {
-	foc_params.s_maxvDC = 16;
-	foc_params.s_maxiDC = 10;
-	foc_params.s_maxIdq = 20;
-	foc_params.s_minIdq = -20;
+	foc_params.s_maxvDC = 48;
+	foc_params.s_maxiDC = 30;
+	foc_params.s_maxIdq = 150;
+	foc_params.s_minIdq = -150;
 	foc_params.s_maxRPM = 8200;
 	foc_params.s_maxEpmRPM = 133;
-	foc_params.s_maxTorque = 15;
+	foc_params.s_maxTorque = 100;
 	foc_params.s_maxBrkCurrent = 2.0f;
 	foc_params.n_currentBand = 500;
 	foc_params.n_modulation = 1.0f;

+ 19 - 4
Applications/bsp/adc.c

@@ -55,10 +55,13 @@ static void adc0_init(void){
     /* configure ADC inserted channel length */
     adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
 
-    adc_inserted_channel_config(ADC0, 0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-
+    //adc_inserted_channel_config(ADC0, 0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#ifdef U_PHASE_I_CHAN
 	adc_update_insert_sample_time(ADC0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#endif
+#ifdef V_PHASE_I_CHAN	
 	adc_update_insert_sample_time(ADC0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#endif
 #ifdef W_PHASE_I_CHAN	
 	adc_update_insert_sample_time(ADC0, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 #endif
@@ -105,10 +108,13 @@ static void adc1_init(void){
     adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
 
     /* configure ADC inserted channel */
-    adc_inserted_channel_config(ADC1, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-
+    //adc_inserted_channel_config(ADC1, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#ifdef U_PHASE_I_CHAN
 	adc_update_insert_sample_time(ADC1, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#endif
+#ifdef V_PHASE_I_CHAN	
 	adc_update_insert_sample_time(ADC1, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#endif
 #ifdef W_PHASE_I_CHAN	
 	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 #endif
@@ -126,8 +132,12 @@ static void adc1_init(void){
 }
 
 static void adc_gpio_init(void) {
+#ifdef U_PHASE_ADC_RCU
 	rcu_periph_clock_enable(U_PHASE_ADC_RCU);
+#endif
+#ifdef V_PHASE_ADC_RCU
 	rcu_periph_clock_enable(V_PHASE_ADC_RCU);
+#endif
 #ifdef W_PHASE_ADC_RCU	
 	rcu_periph_clock_enable(W_PHASE_ADC_RCU);
 #endif
@@ -149,8 +159,12 @@ static void adc_gpio_init(void) {
 	gpio_init(TEMP_V_ADC_GROUP, TEMP_V_ADC_MODE, GPIO_OSPEED_50MHZ, TEMP_V_ADC_PIN);
 #endif
 	/* configure ADC pin, current sampling -- ADC_IN1(PA1) ADC_IN12(PC2) ADC_IN13(PC3) */
+#ifdef U_PHASE_ADC_GROUP
 	gpio_init(U_PHASE_ADC_GROUP, U_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, U_PHASE_ADC_PIN);
+#endif
+#ifdef V_PHASE_ADC_GROUP
 	gpio_init(V_PHASE_ADC_GROUP, V_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, V_PHASE_ADC_PIN);
+#endif
 #ifdef W_PHASE_ADC_GROUP	
 	gpio_init(W_PHASE_ADC_GROUP, W_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, W_PHASE_ADC_PIN);
 #endif
@@ -160,6 +174,7 @@ void adc_init(void) {
 	adc_gpio_init();
 	adc0_init();
 	adc1_init();
+	adc_current_sample_config(0);
 #ifdef REG_CHAN_DMA	
 	adc_dma_init();
 #endif

+ 14 - 7
Applications/bsp/adc.h

@@ -27,20 +27,17 @@ inserted ADC 由timer0 ch3触发,
 #define ADC_RANK_CHANNEL(c)  ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET) 
 #define ADC_CALI_RANK_CHANEL(c)  ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET) 
 
-
+#ifndef HIGH_SIDE_CURRENT_SENSOR
 static u32 adc0_rank_channels[3] = {
-	ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//0, A, AB
-#ifndef HIGH_SIDE_CURRENT_SENSOR	
+	ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//0, A, AB	
 	ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//1, A, AC
 	ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//2, B, BC
-#endif
+
 };
 static u32 adc1_rank_channels[3] = {
 	ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//0, B
-#ifndef HIGH_SIDE_CURRENT_SENSOR
 	ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//1, C
 	ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//2, C
-#endif
 };
 
 
@@ -54,15 +51,25 @@ static u32 volatile * adc_phase_reg2[3] = {
 	&ADC_IDATA0(ADC1),//1, C
 	&ADC_IDATA0(ADC1),//2, C
 };
-
+#endif
 static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+	*v1 = ADC_IDATA0(ADC0);
+	*v2 = ADC_IDATA0(ADC1);
+#else
 	*v1 = (s32)(*adc_phase_reg1[phases]) ;
 	*v2 = (s32)(*adc_phase_reg2[phases]) ;
+#endif
 }
 
 static void __inline adc_current_sample_config(u8 phases) {
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+	ADC_ISQ(ADC0) = ADC_RANK_CHANNEL(V_PHASE_I_CHAN);
+	ADC_ISQ(ADC1) = ADC_RANK_CHANNEL(W_PHASE_I_CHAN);
+#else
 	ADC_ISQ(ADC0) = adc0_rank_channels[phases];
 	ADC_ISQ(ADC1) = adc1_rank_channels[phases];
+#endif
 }
 
 static void __inline adc_disable_ext_trigger(void) {   

+ 15 - 13
Applications/bsp/board_mc_v1.h

@@ -11,11 +11,12 @@
 #define SCHED_TIMER_IRQ TIMER5_IRQn
 #define SCHED_TIMER_IRQHandler TIMER5_IRQHandler
 
+#define PWM_DEAD_TIME_NS 300u
 #define HW_DEAD_TIME_NS  200u
 #define HW_RISE_TIME_NS  500u
 #define HW_NOISE_TIME_NS 300u
 
-#define TDead NS_2_TCLK(HW_DEAD_TIME_NS)/* ����ʱ�� */ 
+#define TDead NS_2_TCLK(HW_DEAD_TIME_NS + PWM_DEAD_TIME_NS)/* ����ʱ�� */ 
 #define TRise NS_2_TCLK(HW_RISE_TIME_NS)/* MOS ����ʱ��*/
 #define TNoise NS_2_TCLK(HW_NOISE_TIME_NS)/* MOS��������Ŀ�������ʱ�� */
 #define TADC  ((uint16_t)((ADC_TRIG_CONV_LATENCY_CYCLES + ADC_SAMPLING_CYCLES) * TIM_CLOCK_MHz) / ADC_CLOCK_MHz + 1u)/* ADC ����ʱ�� */
@@ -59,25 +60,25 @@
 #define PWM_BRAKE_GROUP 	GPIOB
 #define PWM_BRAKE_PIN 	GPIO_PIN_12
 #define PWM_BRAKE_RCU 	RCU_GPIOB
-#define PWM_BRAKE_MODE 	GPIO_MODE_AF_PP
+#define PWM_BRAKE_MODE 	GPIO_MODE_IPU
 
 
 /* 高边电流传感器采样 */
 #define HIGH_SIDE_CURRENT_SENSOR
 
-#define U_PHASE_I_CHAN  ADC_CHANNEL_5
-#define V_PHASE_I_CHAN  ADC_CHANNEL_6
-
-#define U_PHASE_ADC_GROUP 	GPIOA
-#define U_PHASE_ADC_PIN 	GPIO_PIN_5
-#define U_PHASE_ADC_RCU 	RCU_GPIOA
-#define U_PHASE_ADC_MODE 	GPIO_MODE_AIN
+#define V_PHASE_I_CHAN  ADC_CHANNEL_5
+#define W_PHASE_I_CHAN  ADC_CHANNEL_6
 
 #define V_PHASE_ADC_GROUP 	GPIOA
-#define V_PHASE_ADC_PIN 	GPIO_PIN_6
-#define V_PHASE_ADC_RCU 	RCU_GPIOC
+#define V_PHASE_ADC_PIN 	GPIO_PIN_5
+#define V_PHASE_ADC_RCU 	RCU_GPIOA
 #define V_PHASE_ADC_MODE 	GPIO_MODE_AIN
 
+#define W_PHASE_ADC_GROUP 	GPIOA
+#define W_PHASE_ADC_PIN 	GPIO_PIN_6
+#define W_PHASE_ADC_RCU 	RCU_GPIOA
+#define W_PHASE_ADC_MODE 	GPIO_MODE_AIN
+
 
 /* 温度,母线,油门等采集*/
 #define MOTOR_TEMP_CHAN ADC_CHANNEL_0
@@ -88,14 +89,15 @@
 #define VBUS_V_ADC_RCU 		RCU_GPIOA
 #define VBUS_V_ADC_MODE 	GPIO_MODE_AIN
 
+/*
 #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_ceof (0.0942f)
+#define ADC_TO_CURR_ceof (0.37f)
 #define VBUS_VOL_CEOF (ADC_REFERENCE_VOLTAGE*45/4096.0f)
 #define THROTTLE_VOL_CEOF (1)
 

+ 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 (30000u)
+#define FOC_PWM_FS (20000u)
 #define FOC_PWM_period (TIM_CLOCK/FOC_PWM_FS)
 #define FOC_PWM_Half_Period (FOC_PWM_period/2)
 

+ 5 - 5
Applications/bsp/pwm.c

@@ -104,17 +104,17 @@ static void _init_pwm_timer(void) {
 
     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_mode_config(timer,TIMER_CH_0,TIMER_OC_MODE_PWM0);
+    timer_channel_output_mode_config(timer,TIMER_CH_0,TIMER_OC_MODE_PWM1);
     timer_channel_output_shadow_config(timer,TIMER_CH_0,TIMER_OC_SHADOW_ENABLE);
 
     timer_channel_output_config(timer,TIMER_CH_1,&timer_ocintpara);
     timer_channel_output_pulse_value_config(timer,TIMER_CH_1,half_period/2);
-    timer_channel_output_mode_config(timer,TIMER_CH_1,TIMER_OC_MODE_PWM0);
+    timer_channel_output_mode_config(timer,TIMER_CH_1,TIMER_OC_MODE_PWM1);
     timer_channel_output_shadow_config(timer,TIMER_CH_1,TIMER_OC_SHADOW_ENABLE);
 
     timer_channel_output_config(timer,TIMER_CH_2,&timer_ocintpara);
     timer_channel_output_pulse_value_config(timer,TIMER_CH_2,half_period/2);
-    timer_channel_output_mode_config(timer,TIMER_CH_2,TIMER_OC_MODE_PWM0);
+    timer_channel_output_mode_config(timer,TIMER_CH_2,TIMER_OC_MODE_PWM1);
     timer_channel_output_shadow_config(timer,TIMER_CH_2,TIMER_OC_SHADOW_ENABLE);
     
     timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
@@ -135,9 +135,9 @@ static void _init_pwm_timer(void) {
     timer_breakpara.runoffstate        = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.ideloffstate       = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.protectmode        = TIMER_CCHP_PROT_OFF; 
-    timer_breakpara.deadtime           = 0;//NS_2_TCLK(TIMER_DT_NS);
+    timer_breakpara.deadtime           = NS_2_TCLK(PWM_DEAD_TIME_NS);
     timer_breakpara.breakstate         = TIMER_BREAK_ENABLE;
-    timer_breakpara.breakpolarity      = TIMER_BREAK_POLARITY_HIGH;
+    timer_breakpara.breakpolarity      = TIMER_BREAK_POLARITY_LOW;
     timer_breakpara.outputautostate    = TIMER_OUTAUTO_DISABLE;
     timer_break_config(timer,&timer_breakpara);
 	timer_interrupt_enable(timer, TIMER_INT_BRK);

+ 2 - 2
Applications/bsp/pwm.h

@@ -19,9 +19,9 @@
 
 #define pwm_update_duty(dutyA, dutyB, dutyC) \
 	do {\
-		ch0_update_duty(dutyA);\
+		ch0_update_duty(dutyC);\
 		ch1_update_duty(dutyB);\
-		ch2_update_duty(dutyC);\
+		ch2_update_duty(dutyA);\
 	}while(0)
 
 #define pwm_update_2smaples(samp1, sampl2) \

+ 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_TRQ);
+				success = mc_start(CTRL_MODE_OPEN);
 			}else if (scmd->start_stop == Foc_Stop) {
 				success = mc_stop();
 			}

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

@@ -161,7 +161,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);
 
@@ -244,7 +244,10 @@ void PMSM_FOC_Schedule(void) {
 	SVM_Duty_Fix(&vAB, _gFOC_Ctrl.in.s_vDC, FOC_PWM_Half_Period, &_gFOC_Ctrl.out);
 
 	phase_current_point(&_gFOC_Ctrl.out);
-
+	_gFOC_Ctrl.out.n_Duty[0] = FOC_PWM_Half_Period-NS_2_TCLK(PWM_DEAD_TIME_NS)*2;
+	_gFOC_Ctrl.out.n_Duty[1] = NS_2_TCLK(PWM_DEAD_TIME_NS)*2;
+	_gFOC_Ctrl.out.n_Duty[2] = FOC_PWM_Half_Period-NS_2_TCLK(PWM_DEAD_TIME_NS)*2;
+	
 	pwm_update_duty(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
 	pwm_update_sample(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases);
 

+ 73 - 21
Applications/foc/motor/current.c

@@ -6,10 +6,10 @@
 #include "libs/utils.h"
 #include "libs/logger.h"
 #include "math/fast_math.h"
-static current_samp_t g_cs;
+current_samp_t g_cs;
 
 #define NB_OFFSET_SAMPLES 32
-
+#define SENSOR_SAMPLES 10000
 #define Rvbus  0.0005f
 #define Gvbus (13.1f) //母线电流的运放 
 #define Rds_Defualt  0.005f//欧
@@ -29,30 +29,80 @@ ia = -(ib+ic)
 */
 void phase_current_init(void) {
 	current_samp_t *cs = &g_cs;
-	cs->offset_sample_count = NB_OFFSET_SAMPLES + 1;
+	cs->sample_count = NB_OFFSET_SAMPLES + 1;
 	cs->adc_ia = 0;
 	cs->adc_ib = 0;
 	cs->adc_ic = 0;
 }
 
-void phase_current_start_cali(void){
+void phase_current_offset_calibrate(void){
 	g_cs.adc_offset_a = 0;
 	g_cs.adc_offset_b = 0;
 	g_cs.adc_offset_c = 0;
 
 	phase_current_init();
 	g_cs.is_calibrating_offset = true;
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+	g_cs.c_phases = PHASE_BC;
+#else
 	g_cs.c_phases = PHASE_AB;
+#endif
 	g_cs.c_ignore_phase = IGNORE_NONE;
 	adc_current_sample_config(g_cs.c_phases);
 }
 
-void phase_current_wait_cali(void) {
-	while(g_cs.is_calibrating_offset) {
+void phase_current_calibrate_wait(void) {
+	while(g_cs.is_calibrating_offset || g_cs.is_calibrating_sensor) {
 		wdog_reload();
 	}
 }
 
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+void phase_current_sensor_start_calibrate(float calibrate_current) {
+	bool calibrate = false;
+	if (calibrate_current > 0) {
+		calibrate = true;
+		g_cs.sensor_samples_1 = 0;
+		g_cs.sensor_samples_2 = 0;
+		g_cs.sample_count = SENSOR_SAMPLES;
+		g_cs.calibrate_current = calibrate_current;
+	}
+	
+	g_cs.is_calibrating_sensor = calibrate;
+}
+
+bool phase_current_sensor_do_calibrate(void) {
+	current_samp_t *cs = &g_cs;
+	if (!cs->is_calibrating_sensor) {
+		return false;
+	}
+	s32 phase_current1, phase_current2;
+	adc_phase_current_read(cs->c_phases, &phase_current1, &phase_current2);
+	if(cs->c_phases == PHASE_BC) {
+		if (cs->sample_count > 0) {
+			cs->sample_count--;
+			cs->sensor_samples_1 += (phase_current1 - cs->adc_offset_b);
+			cs->sensor_samples_2 += (phase_current2 - cs->adc_offset_c);
+		}else {
+			cs->sensor_samples_1 = cs->sensor_samples_1 / (float)SENSOR_SAMPLES;
+			cs->sensor_samples_2 = cs->sensor_samples_2 / (float)SENSOR_SAMPLES;
+			cs->sensor_k1 = g_cs.calibrate_current/cs->sensor_samples_1;
+			cs->sensor_k2 = g_cs.calibrate_current/cs->sensor_samples_2;
+			cs->is_calibrating_sensor = false;
+		}
+	}
+	return cs->is_calibrating_sensor;
+}
+#else
+void phase_current_sensor_start_calibrate(float calibrate_current) {
+
+}
+
+bool phase_current_sensor_do_calibrate(void) {
+	return false;
+}
+#endif
+
 bool phase_current_offset(void) {
 	current_samp_t *cs = &g_cs;
 	if (!cs->is_calibrating_offset) {
@@ -60,35 +110,37 @@ bool phase_current_offset(void) {
 	}
 	s32 phase_current1 = 0 , phase_current2 = 0;
 	adc_phase_current_read(cs->c_phases, &phase_current1, &phase_current2);
-	if (cs->offset_sample_count == (NB_OFFSET_SAMPLES + 1)) {
-		cs->offset_sample_count --;
+	if (cs->sample_count == (NB_OFFSET_SAMPLES + 1)) {
+		cs->sample_count --;
 		return true;
 	}
-	if (cs->offset_sample_count > 0) {
-		cs->offset_sample_count--;
-		if (cs->c_phases == PHASE_AB && cs->offset_sample_count >= 0) {
+	if (cs->sample_count > 0) {
+		cs->sample_count--;
+		if (cs->c_phases == PHASE_AB && cs->sample_count >= 0) {
 			cs->adc_offset_a += phase_current1;
 			cs->adc_offset_b += phase_current2;
-			if (cs->offset_sample_count == 0) {
+			if (cs->sample_count == 0) {
 				cs->adc_offset_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
 				cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
 			}
 		}
-		if (cs->c_phases == PHASE_BC && cs->offset_sample_count >= 0) {
+		if (cs->c_phases == PHASE_BC && cs->sample_count >= 0) {
 			cs->adc_offset_c += phase_current2;
-			if (cs->offset_sample_count == 0) {
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+			cs->adc_offset_b += phase_current1;
+#endif
+			if (cs->sample_count == 0) {
 				cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+				cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
+#endif
 			}
 		}
 	}else {
 		if (cs->c_phases == PHASE_AB) {
-#ifdef HIGH_SIDE_CURRENT_SENSOR
-			cs->is_calibrating_offset = false;
-#else
 			cs->c_phases = PHASE_BC;
 			phase_current_init();
 			adc_current_sample_config(cs->c_phases);
-#endif
 		}else {
 			cs->is_calibrating_offset = false;
 			sys_debug("offset %d, %d, %d\n", g_cs.adc_offset_a, g_cs.adc_offset_b, g_cs.adc_offset_c);
@@ -181,7 +233,7 @@ void phase_current_point(void *p){
 	out->n_CPhases = cs->c_phases;
 }
 #else
-#define LOW_FP_COEF 0.5f
+#define LOW_FP_COEF 0.1f
 void phase_current_get(float *iABC){
 	current_samp_t *cs = &g_cs;
 	s32 phase_current1, phase_current2;
@@ -270,8 +322,8 @@ void phase_current_point(void *p){
 
 	cs->c_ignore_phase = IGNORE_NONE;
 #ifdef HIGH_SIDE_CURRENT_SENSOR
-	cs->c_phases = PHASE_AB;
-	out->n_Sample1 = FOC_PWM_Half_Period - 1;
+	cs->c_phases = PHASE_BC;
+	out->n_Sample1 = FOC_PWM_Half_Period/4;
 #else
 	u16 *duty = out->n_Duty;
 	u16 max_hi_side = MAX(duty[0], MAX(duty[1], duty[2]));

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

@@ -37,8 +37,14 @@ typedef struct current_sample {
 	u8    c_phases;
 	u8    c_ignore_phase;
 	phase_time_t time;	
-	volatile int   offset_sample_count;
+	volatile int   sample_count;
 	volatile bool  is_calibrating_offset;
+	volatile bool  is_calibrating_sensor;
+	float   calibrate_current;
+	float   sensor_samples_1;
+	float   sensor_samples_2;
+	float   sensor_k1;
+	float   sensor_k2;
 }current_samp_t;
 
 void phase_current_init(void);
@@ -46,8 +52,10 @@ void phase_current_get(float *iABC);
 bool phase_current_offset(void);
 void phase_current_point(void *);
 void phase_current_adc_triger(void);
-void phase_current_start_cali(void);
-void phase_current_wait_cali(void);
+void phase_current_offset_calibrate(void);
+void phase_current_calibrate_wait(void);
+void phase_current_sensor_start_calibrate(float calibrate_current);
+bool phase_current_sensor_do_calibrate(void);
 
 #endif /* _PHASE_CURRENT_H__ */
 

+ 17 - 5
Applications/foc/motor/motor.c

@@ -71,11 +71,11 @@ bool mc_start(u8 mode) {
 	motor_encoder_start(motor.s_direction);
 	PMSM_FOC_Start(mode);
 	pwm_turn_on_low_side();
-	task_udelay(500);
-	phase_current_start_cali();
+	delay_ms(500);
+	phase_current_offset_calibrate();
 	pwm_start();
 	adc_start_convert();
-	phase_current_wait_cali();
+	phase_current_calibrate_wait();
 	motor.throttle = 0;
 	motor.b_start = true;
 	gpio_led2_enable(true);
@@ -121,10 +121,10 @@ void mc_encoder_calibrate(s16 vd) {
 	pwm_turn_on_low_side();
 	task_udelay(500);
 	PMSM_FOC_Start(CTRL_MODE_OPEN);
-	phase_current_start_cali();
+	phase_current_offset_calibrate();
 	pwm_start();
 	adc_start_convert();
-	phase_current_wait_cali();
+	phase_current_calibrate_wait();
 	PMSM_FOC_Set_Angle(0);
 	PMSM_FOC_SetOpenVdq(vd, 0);
 	delay_ms(3000);
@@ -146,6 +146,15 @@ void mc_encoder_calibrate(s16 vd) {
 	motor_encoder_offset_finish();
 }
 
+bool mc_current_sensor_calibrate(float current) {
+	if (!mc_start(CTRL_MODE_OPEN)) {
+		return false;
+	}
+	phase_current_sensor_start_calibrate(current);
+	phase_current_calibrate_wait();
+	return true;
+}
+
 bool mc_lock_motor(bool lock) {
 	if (lock && (PMSM_FOC_GetSpeed() > 10)) {
 		PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
@@ -194,6 +203,9 @@ void MC_Brake_IRQHandler(void) {
 
 
 void MC_Protect_IRQHandler(void){
+	if (!motor.b_start) {
+		return;
+	}
 	PMSM_FOC_Stop(); //三相50%占空比输出,防止mos过压击穿
 	pwm_start();
 	adc_start_convert();

+ 1 - 0
Applications/foc/motor/motor.h

@@ -23,6 +23,7 @@ bool mc_throttle_released(void);
 bool mc_lock_motor(bool lock);
 void mc_set_spd_torque(s32 target);
 void mc_use_throttle(void);
+bool mc_current_sensor_calibrate(float current);
 
 static __INLINE float motor_encoder_get_angle(void) {
 #ifdef USE_ENCODER_HALL

+ 4 - 0
Applications/foc/samples.c

@@ -50,7 +50,11 @@ s16 get_vbus_sfix5(void){
 
 
 float get_throttle_float(void) {
+#ifdef THROTTLE_CHAN
 	return _throttle.filted_value;
+#else
+	return 0.0f;
+#endif
 }
 static u32 sample_task(void *param) {
 	sample_vbus();

+ 2 - 2
Librarys/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c

@@ -50,14 +50,14 @@
 //#define __SYSTEM_CLOCK_48M_PLL_IRC8M            (uint32_t)(48000000)
 //#define __SYSTEM_CLOCK_72M_PLL_IRC8M            (uint32_t)(72000000)
 //#define __SYSTEM_CLOCK_108M_PLL_IRC8M           (uint32_t)(108000000)
-//#define __SYSTEM_CLOCK_120M_PLL_IRC8M           (uint32_t)(120000000)
+#define __SYSTEM_CLOCK_120M_PLL_IRC8M           (uint32_t)(120000000)
 
 /* use HXTAL(XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */
 //#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
 //#define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)
 //#define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)
 //#define __SYSTEM_CLOCK_108M_PLL_HXTAL           (uint32_t)(108000000)
-#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000)
+//#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000)
 
 #define SEL_IRC8M       0x00U
 #define SEL_HXTAL       0x01U

+ 17 - 1
Project/MC100.uvoptx

@@ -135,7 +135,6 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name></Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -149,6 +148,23 @@
         </SetRegEntry>
       </TargetDriverDllRegistry>
       <Breakpoint/>
+      <WatchWindow1>
+        <Ww>
+          <count>0</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>g_cs,0x0A</ItemText>
+        </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>jtag_cmd</ItemText>
+        </Ww>
+        <Ww>
+          <count>2</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>_gFOC_Ctrl,0x0A</ItemText>
+        </Ww>
+      </WatchWindow1>
       <Tracepoint>
         <THDelay>0</THDelay>
       </Tracepoint>

+ 2 - 2
Project/MC100.uvprojx

@@ -275,7 +275,7 @@
               </OCR_RVCT3>
               <OCR_RVCT4>
                 <Type>1</Type>
-                <StartAddress>0x8002000</StartAddress>
+                <StartAddress>0x8000000</StartAddress>
                 <Size>0x40000</Size>
               </OCR_RVCT4>
               <OCR_RVCT5>
@@ -337,7 +337,7 @@
             <v6Rtti>0</v6Rtti>
             <VariousControls>
               <MiscControls>--gnu</MiscControls>
-              <Define>USE_STDPERIPH_DRIVER,GD32F30X_HD,BACK_TRACE,CONFIG_CAN_IAP,MC100_HW_V1</Define>
+              <Define>USE_STDPERIPH_DRIVER,GD32F30X_HD,BACK_TRACE,JTAG_DEBUG,MC100_HW_V1</Define>
               <Undefine></Undefine>
               <IncludePath>..\Librarys\CMSIS\Include,..\Librarys\CMSIS\GD\GD32F30x\Include,..\Librarys\GD32F30x_Drivers\include,..\Applications;..\Simulink\PMSM_Controller_ert_rtw</IncludePath>
             </VariousControls>