Преглед на файлове

1. adc初始化区分是否是电机参数识别模式,如果参数识别模式,需要加速规则通道的采样速度
2. 电机参数flux识别使用采样的相电压,同时需要关闭弱磁
3. 电机Ld,Lq识别,频频是1000rad/s, 相电压补偿需要转化为Hz

Signed-off-by: kevin <huhui@sharkgulf.com>

kevin преди 2 години
родител
ревизия
473a058d24

+ 50 - 47
Applications/bsp/gd32/adc.c

@@ -66,7 +66,6 @@ static void adc01_dma_init(void)
 {
     dma_parameter_struct dma_init_struct;
     rcu_periph_clock_enable(RCU_DMA0);
-
     dma_deinit(DMA0, DMA_CH0);
     dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
     dma_init_struct.memory_addr  = (uint32_t)adc_buffer;
@@ -85,14 +84,7 @@ static void adc01_dma_init(void)
 }
 
 
-static void adc01_init(void) {
-    /* config ADC clock */
-    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
-	rcu_periph_clock_enable(RCU_ADC0);
-	rcu_periph_clock_enable(RCU_ADC1);
-	adc_deinit(ADC0);
-	adc_deinit(ADC1);
-
+static void adc01_init(u32 reg_sampletime) {
 	/* config work mode */
     adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
     adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
@@ -107,46 +99,46 @@ static void adc01_init(void) {
 	
 #if (CONFIG_MC105_HW_VERSION==2)
 	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, ADC01_NUM);
-	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 1, MOS_TEMP1_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 2, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 3, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 4, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_17, ADC_REGCHAN_SAMPLE_TIME);//3.3vref
+	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 1, MOS_TEMP1_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 2, U_VOL_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 3, V_VOL_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 4, W_VOL_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_17, reg_sampletime);//3.3vref
 
 	adc_tempsensor_vrefint_enable();
 
 	adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, ADC01_NUM);
-	adc_regular_channel_config(ADC1, 0, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 1, ACC_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 2, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 3, THROTTLE_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 4, ADC_CHANNEL_10, ADC_REGCHAN_SAMPLE_TIME); //dumy
-	adc_regular_channel_config(ADC1, 5, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC1, 0, VBUS_V_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 1, ACC_V_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 2, VBUS_I_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 3, THROTTLE_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 4, ADC_CHANNEL_10, reg_sampletime); //dumy
+	adc_regular_channel_config(ADC1, 5, MOTOR_TEMP_ADC_CHAN, reg_sampletime);
 #else
 	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, ADC01_NUM);
-	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 1, MOTOR_TEMP_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 2, THROTTLE_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 3, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 4, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
-	adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_17, ADC_REGCHAN_SAMPLE_TIME); //mcu内部vref
-	adc_regular_channel_config(ADC0, 6, THROTTLE2_5V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 7, THROTTLE2_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC0, 8, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
+	adc_regular_channel_config(ADC0, 0, MOS_TEMP_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 1, MOTOR_TEMP_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 2, THROTTLE_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 3, U_VOL_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 4, ZERO_ADC_CHAN, reg_sampletime); //insert zero vol
+	adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_17, reg_sampletime); //mcu内部vref
+	adc_regular_channel_config(ADC0, 6, THROTTLE2_5V_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 7, THROTTLE2_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC0, 8, ZERO_ADC_CHAN, reg_sampletime); //insert zero vol
 
 	adc_tempsensor_vrefint_enable();
 
 	adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, ADC01_NUM);
-	adc_regular_channel_config(ADC1, 0, VBUS_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 1, ACC_V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 2, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 3, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 4, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 5, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
-	adc_regular_channel_config(ADC1, 6, THROTTLE_5V_CHAN, ADC_REGCHAN_SAMPLE_TIME);
-	adc_regular_channel_config(ADC1, 7, ZERO_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME); //insert zero vol
-	adc_regular_channel_config(ADC1, 8, DC5V_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC1, 0, VBUS_V_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 1, ACC_V_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 2, VBUS_I_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 3, V_VOL_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 4, W_VOL_ADC_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 5, ZERO_ADC_CHAN, reg_sampletime); //insert zero vol
+	adc_regular_channel_config(ADC1, 6, THROTTLE_5V_CHAN, reg_sampletime);
+	adc_regular_channel_config(ADC1, 7, ZERO_ADC_CHAN, reg_sampletime); //insert zero vol
+	adc_regular_channel_config(ADC1, 8, DC5V_ADC_CHAN, reg_sampletime);
 #endif
 	adc_buffer[VREF_BUFF_IDX] = VREF_ADC_DATA; //1.21/3.3*4095
 
@@ -208,16 +200,16 @@ static void adc_gpio_init(void) {
 	rcu_periph_clock_enable(RCU_AF);
 		/* configure ADC pin, current sampling -- ADC_IN1(PA1) ADC_IN12(PC2) ADC_IN13(PC3) */
 #ifdef U_PHASE_ADC_GROUP
-		rcu_periph_clock_enable(U_PHASE_ADC_RCU);
-		gpio_init(U_PHASE_ADC_GROUP, U_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, U_PHASE_ADC_PIN);
+	rcu_periph_clock_enable(U_PHASE_ADC_RCU);
+	gpio_init(U_PHASE_ADC_GROUP, U_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, U_PHASE_ADC_PIN);
 #endif
 #ifdef V_PHASE_ADC_GROUP
-		rcu_periph_clock_enable(V_PHASE_ADC_RCU);
-		gpio_init(V_PHASE_ADC_GROUP, V_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, V_PHASE_ADC_PIN);
+	rcu_periph_clock_enable(V_PHASE_ADC_RCU);
+	gpio_init(V_PHASE_ADC_GROUP, V_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, V_PHASE_ADC_PIN);
 #endif
 #ifdef W_PHASE_ADC_GROUP
-		rcu_periph_clock_enable(W_PHASE_ADC_RCU);
-		gpio_init(W_PHASE_ADC_GROUP, W_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, W_PHASE_ADC_PIN);
+	rcu_periph_clock_enable(W_PHASE_ADC_RCU);
+	gpio_init(W_PHASE_ADC_GROUP, W_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, W_PHASE_ADC_PIN);
 #endif
 
 #ifdef VBUS_V_ADC_GROUP
@@ -297,10 +289,21 @@ static void adc_gpio_init(void) {
 #endif
 }
 
-void adc_init(void) {
+void adc_init(bool mot_ind) {
+	/* config ADC clock */
+    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4); //APB2 clk 120M, adc clk 30M
+	rcu_periph_clock_enable(RCU_ADC0);
+	rcu_periph_clock_enable(RCU_ADC1);
+	adc_deinit(ADC0);
+	adc_deinit(ADC1);
+
 	adc_gpio_init();
 	adc01_dma_init();
-	adc01_init();
+	if (!mot_ind) {
+		adc01_init(ADC_REGCHAN_SAMPLE_TIME);
+	}else {
+		adc01_init(ADC_REGCHAN_MOT_IND_SAMPLE_TIME);
+	}
 	adc_current_sample_config(0);
 }
 

+ 1 - 1
Applications/bsp/gd32/adc.h

@@ -173,7 +173,7 @@ static __inline void adc_update_ext_trigger(u32 trigger) {
 	adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, trigger);
 }
 
-void adc_init(void);
+void adc_init(bool mot_ind);
 s32 adc_sample_regular_channel(int chan, int times);
 void adc_start_convert(void);
 void adc_stop_convert(void);

+ 1 - 1
Applications/bsp/gd32/board_mc105_v3.h

@@ -225,7 +225,7 @@
 
 #define PHASE_VOL_R (40*1000.0f)
 #define PHASE_VOL_R1 (1*1000.0f)
-#define PHASE_VOL_C1 (100e-9f) //470nF
+#define PHASE_VOL_C1 (470e-9f) //470nF
 #define PHASE_VOL_Gain  ((PHASE_VOL_R + PHASE_VOL_R1)/PHASE_VOL_R1)
 #define Phase_Vol_LPF_R  ((PHASE_VOL_R * PHASE_VOL_R1)/(PHASE_VOL_R + PHASE_VOL_R1))
 #define PHASE_VOL_LPF_BAND  (1/(2*3.14F*Phase_Vol_LPF_R*PHASE_VOL_C1))

+ 2 - 0
Applications/bsp/gd32/bsp.h

@@ -20,6 +20,8 @@
 #define FOC_CTRL_US (1.0f/(float)FOC_PWM_FS)
 
 #define ADC_REGCHAN_SAMPLE_TIME ADC_SAMPLETIME_71POINT5
+#define ADC_REGCHAN_MOT_IND_SAMPLE_TIME ADC_SAMPLETIME_13POINT5
+
 #define ADC_TRIG_CONV_LATENCY_CYCLES 12.5f
 #define ADC_SAMPLING_CYCLES 13.5f
 

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

@@ -22,6 +22,7 @@ static float rs_id_max, rs_vd_max, rs_vd_now, rs_est_value = 0.011f;
 static s32 rs_meas_time;
 static bool b_rs_ind = false, b_rs_ested = false, b_ldq_ind = false, b_ld_ested = false, b_lq_ested = false, b_flux_ind = false, b_flux_ested = false;
 static u8   rs_ind_step = 0;
+static u16  old_max_fw_id = 0xFFFF;
 void mot_params_ind_rs(float vd_max, float id_max, s32 time) {
 	if (b_rs_ind || b_ldq_ind || b_flux_ind) {
 		return;
@@ -44,6 +45,10 @@ void mot_params_ind_stop(void) {
 	shark_timer_cancel(&_ldq_ind_timer);
 	shark_timer_cancel(&_flux_ind_timer);
 	u32 mask = cpu_enter_critical();
+	if (old_max_fw_id != 0xFFFF) {
+		mc_conf()->m.max_fw_id = old_max_fw_id;
+		old_max_fw_id = 0xFFFF;
+	}
 	b_rs_ind = false;
 	b_ldq_ind = false;
 	b_flux_ind = false;
@@ -287,8 +292,12 @@ static void _flux_ind_timer_handler(shark_timer_t *t) {
 	float delta = We - motVelRadusPers;
 	motVelRadusPers = motor.controller.foc.mot_vel_radusPers;
 	if (We > 100 && ABS(delta) < 40) {
+#if CONFIG_MOT_IND_USE_PHASE_SAMPLE==0
 		float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_period) * motor.controller.foc.in.dc_vol * 1.5f;
 		float vq = (motor.controller.foc.out.vol_dq.q - dtc) * TWO_BY_THREE;
+#else
+		float vq = motor.controller.phase_v_dq.q;
+#endif
 		float flux = vq / We;
 		flux_est_value = LowPass_Filter(flux_est_value, flux, 0.1f);
 		flux_do_cnt ++;
@@ -322,6 +331,8 @@ void mot_params_ind_flux(float id, float iq) {
 	flux_wait_cnt = 0;
 	flux_do_cnt = 0;
 	b_flux_ested = false;
+	old_max_fw_id = mc_conf()->m.max_fw_id;
+	mc_conf()->m.max_fw_id = 0;
 	mc_set_ctrl_mode(CTRL_MODE_CURRENT);
 	mot_contrl_set_current(&motor.controller ,iq);
 	shark_timer_post(&_flux_ind_timer, 10);

+ 4 - 1
Applications/foc/motor/motor.c

@@ -239,7 +239,7 @@ static void mc_gear_mode_set(void) {
 void mc_init(void) {
 	mc_internal_init(CTRL_MODE_OPEN, false);
 	fan_pwm_init();
-	adc_init();
+	adc_init(false);
 	pwm_3phase_init();
 	samples_init();
 	motor_encoder_init();
@@ -874,6 +874,8 @@ bool mc_ind_motor_start(bool start) {
 			mot_contrl_set_error(&motor.controller, FOC_Have_CritiCal_Err);
 			return false;
 		}
+		adc_init(true);
+		task_udelay(500);
 		pwm_up_enable(false);
 		pwm_turn_on_low_side();
 		task_udelay(500);
@@ -894,6 +896,7 @@ bool mc_ind_motor_start(bool start) {
 		wdog_reload();
 		adc_stop_convert();
 		pwm_stop();
+		adc_init(false);
 		mot_contrl_stop(&motor.controller);
 		motor.mode = CTRL_MODE_OPEN;
 		pwm_up_enable(true);