Explorar o código

加入电流高边采样

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui %!s(int64=3) %!d(string=hai) anos
pai
achega
b72b9255f9

+ 9 - 3
Applications/bsp/adc.c

@@ -59,8 +59,9 @@ static void adc0_init(void){
 
 	adc_update_insert_sample_time(ADC0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 	adc_update_insert_sample_time(ADC0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#ifdef W_PHASE_I_CHAN	
 	adc_update_insert_sample_time(ADC0, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-
+#endif
     /* configure ADC inserted channel trigger */
     adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE);
 
@@ -108,8 +109,9 @@ static void adc1_init(void){
 
 	adc_update_insert_sample_time(ADC1, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 	adc_update_insert_sample_time(ADC1, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#ifdef W_PHASE_I_CHAN	
 	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-
+#endif
     /* ADC external trigger enable */
 	adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC_TRIGGER_NONE);
     adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
@@ -126,7 +128,9 @@ static void adc1_init(void){
 static void adc_gpio_init(void) {
 	rcu_periph_clock_enable(U_PHASE_ADC_RCU);
 	rcu_periph_clock_enable(V_PHASE_ADC_RCU);
+#ifdef W_PHASE_ADC_RCU	
 	rcu_periph_clock_enable(W_PHASE_ADC_RCU);
+#endif
 	rcu_periph_clock_enable(RCU_AF);
 #ifdef VBUS_V_ADC_GROUP
 	rcu_periph_clock_enable(VBUS_V_ADC_RCU);
@@ -147,7 +151,9 @@ static void adc_gpio_init(void) {
 	/* configure ADC pin, current sampling -- ADC_IN1(PA1) ADC_IN12(PC2) ADC_IN13(PC3) */
 	gpio_init(U_PHASE_ADC_GROUP, U_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, U_PHASE_ADC_PIN);
 	gpio_init(V_PHASE_ADC_GROUP, V_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, V_PHASE_ADC_PIN);
-	gpio_init(W_PHASE_ADC_GROUP, W_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, W_PHASE_ADC_PIN);	
+#ifdef W_PHASE_ADC_GROUP	
+	gpio_init(W_PHASE_ADC_GROUP, W_PHASE_ADC_MODE, GPIO_OSPEED_50MHZ, W_PHASE_ADC_PIN);
+#endif
 }
 
 void adc_init(void) {

+ 4 - 0
Applications/bsp/adc.h

@@ -30,13 +30,17 @@ inserted ADC 由timer0 ch3触发,
 
 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),//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
 };
 
 

+ 7 - 13
Applications/bsp/board_mc_v1.h

@@ -51,28 +51,22 @@
 #define PWM_W_N_MODE 	GPIO_MODE_AF_PP
 
 
-/* 三电阻采样 */
-#define SHUNT_NUM THREE_SHUNTS_SAMPLE
+/* 高边电流传感器采样 */
+#define HIGH_SIDE_CURRENT_SENSOR
 
-#define W_PHASE_I_CHAN  ADC_CHANNEL_6
-#define V_PHASE_I_CHAN  ADC_CHANNEL_7
-#define U_PHASE_I_CHAN  ADC_CHANNEL_8
+#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_1
+#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_ADC_GROUP 	GPIOC
-#define V_PHASE_ADC_PIN 	GPIO_PIN_2
+#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_MODE 	GPIO_MODE_AIN
 
-#define W_PHASE_ADC_GROUP 	GPIOC
-#define W_PHASE_ADC_PIN 	GPIO_PIN_3
-#define W_PHASE_ADC_RCU 	RCU_GPIOC
-#define W_PHASE_ADC_MODE 	GPIO_MODE_AIN
-
 
 /* 温度,母线,油门等采集*/
 #define MOTOR_TEMP_CHAN ADC_CHANNEL_0

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

@@ -82,9 +82,13 @@ bool phase_current_offset(void) {
 		}
 	}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);
@@ -259,16 +263,20 @@ void phase_current_get(float *iABC){
 void phase_current_point(void *p){
 	FOC_OutP *out = p;
 	current_samp_t *cs = &g_cs;
-	u16 *duty = out->n_Duty;
 	s16  test_sample = 0;
-	u16 max_hi_side = MAX(duty[0], MAX(duty[1], duty[2]));
-	u16 min_low_side = FOC_PWM_Half_Period - max_hi_side;
-
+	
 	out->n_Sample1 = FOC_PWM_Half_Period + 1;
 	out->n_Sample2 = FOC_PWM_Half_Period + 1;
 
 	cs->c_ignore_phase = IGNORE_NONE;
-	
+#ifdef HIGH_SIDE_CURRENT_SENSOR
+	cs->c_phases = PHASE_AB;
+	out->n_Sample1 = FOC_PWM_Half_Period - 1;
+#else
+	u16 *duty = out->n_Duty;
+	u16 max_hi_side = MAX(duty[0], MAX(duty[1], duty[2]));
+	u16 min_low_side = FOC_PWM_Half_Period - max_hi_side;
+
 	if (min_low_side > TSampleMIN) {
 		u16 Samp_p = max_hi_side + TSampleBefore;
 		if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
@@ -379,6 +387,7 @@ void phase_current_point(void *p){
 			}
 		}
 	}
+#endif
 	out->n_CPhases = cs->c_phases;
 	out->test_sample = test_sample;
 }

+ 1 - 1
Project/GD32_DEMO.uvoptx

@@ -120,7 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>{</Name>
+          <Name>(a?g</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>