Explorar el Código

add adc ins chan len=4 support

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui hace 3 años
padre
commit
e82c496d78
Se han modificado 2 ficheros con 67 adiciones y 43 borrados
  1. 20 4
      Applications/bsp/gd32/adc.c
  2. 47 39
      Applications/bsp/gd32/adc.h

+ 20 - 4
Applications/bsp/gd32/adc.c

@@ -173,14 +173,30 @@ static void adc01_init(void) {
 	adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);
 
 	/* configure ADC inserted channel length */
-	adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
+	adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, INJ_CHAN_NUM);
+#if 1
+	adc_inserted_channel_config(ADC0, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#if (INJ_CHAN_NUM==4)
+	adc_inserted_channel_config(ADC0, 1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+	adc_inserted_channel_config(ADC0, 2, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+	adc_inserted_channel_config(ADC0, 3, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#endif
+#else
 	adc_update_insert_sample_time(ADC0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 	adc_update_insert_sample_time(ADC0, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-
-	adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
+#endif
+	adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, INJ_CHAN_NUM);
+#if 1
+	adc_inserted_channel_config(ADC1, 0, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#if (INJ_CHAN_NUM==4)
+	adc_inserted_channel_config(ADC1, 1, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+	adc_inserted_channel_config(ADC1, 2, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+	adc_inserted_channel_config(ADC1, 3, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+#endif
+#else
 	adc_update_insert_sample_time(ADC1, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-
+#endif
 	adc_mode_config(ADC_DUAL_MODE);
 
     /* configure ADC inserted channel trigger */

+ 47 - 39
Applications/bsp/gd32/adc.h

@@ -28,6 +28,7 @@ inserted ADC 由timer0 ch3触发,
 
 #define ADC_RANK_CHANNEL(c)  ((c)<<ISQ3_OFFSET | (0)<<IL_OFFSET) 
 #define ADC_INS_RANK_4_CHANS(c1,c2,c3,c4) (((c1)<<ISQ0_OFFSET) | ((c2)<<ISQ1_OFFSET) | ((c3)<<ISQ2_OFFSET) | ((c4)<<ISQ3_OFFSET) | ((3)<<IL_OFFSET))
+#define INJ_CHAN_NUM 1
 
 #ifndef HIGH_SIDE_CURRENT_SENSOR
 static u32 adc0_rank_channels[3] = {
@@ -54,55 +55,62 @@ static u32 volatile * adc_phase_reg2[3] = {
 	&ADC_IDATA0(ADC1),//2, C
 };
 #endif
-#ifdef CONFIG_SW_MUTISAMPLE
-static s32 __inline _adc_avg(s32 *v) {
-	s32 max_v = 0;
-	s32 min_v = 4096*32;
-	s32 total_v = 0;
-	for (int i = 0; i < 4; i++) {
-		if (v[i] > max_v) {
-			max_v = v[i];
-		}else if (v[i] < min_v) {
-			min_v = v[i];
-		}
-		total_v += v[i];
-	}
-	total_v -= (max_v + min_v);
-	return (total_v>>1);
-	
-}
-#endif
-static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
+
+#define v_calc(sum, v, min, max) \
+	do { \
+		if (v > max) { \
+			max = v; \
+		} \
+		if (v < min) { \
+			min = v; \
+		}\
+		sum += v; \
+	}while(0);
+
+static void __inline adc_phase_current_read(u8 phases, s32 *pv1, s32 *pv2) {
 #ifdef HIGH_SIDE_CURRENT_SENSOR
-#ifdef CONFIG_SW_MUTISAMPLE
-	s32 v[4];
-	v[0] = ADC_IDATA0(ADC0);
-	v[1] = ADC_IDATA1(ADC1);
-	v[2] = ADC_IDATA2(ADC0);
-	v[3] = ADC_IDATA3(ADC1);
-	*v1 = (s32)((float)_adc_avg(v) * adc_5vref_compesion());
-
-	v[0] = ADC_IDATA0(ADC1);
-	v[1] = ADC_IDATA1(ADC0);
-	v[2] = ADC_IDATA2(ADC1);
-	v[3] = ADC_IDATA3(ADC0);
-	*v2 = (s32)((float)_adc_avg(v) *  adc_5vref_compesion());
+#if (INJ_CHAN_NUM==4)
+	u16 min, max;
+	u16 sum = 0;
+	u16 v1 = ADC_IDATA0(ADC0);
+	u16 v2 = ADC_IDATA1(ADC1);
+	u16 v3 = ADC_IDATA2(ADC0);
+	u16 v4 = ADC_IDATA3(ADC1);
+	min = max = v1;
+	sum += v1;
+	v_calc(sum, v2, min, max);
+	v_calc(sum, v3, min, max);
+	v_calc(sum, v4, min, max);
+	*pv1 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
+
+	sum = 0;
+	v1 = ADC_IDATA0(ADC1);
+	v2 = ADC_IDATA1(ADC0);
+	v3 = ADC_IDATA2(ADC1);
+	v4 = ADC_IDATA3(ADC0);
+	min = max = v1;
+	sum += v1;
+	v_calc(sum, v2, min, max);
+	v_calc(sum, v3, min, max);
+	v_calc(sum, v4, min, max);
+	*pv2 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
+
 #else
-	*v1 = (s32)((float)ADC_IDATA0(ADC0) * adc_5vref_compesion());
-	*v2 = (s32)((float)ADC_IDATA0(ADC1) * adc_5vref_compesion());
+	*pv1 = (s32)((float)ADC_IDATA0(ADC0) * adc_5vref_compesion());
+	*pv2 = (s32)((float)ADC_IDATA0(ADC1) * adc_5vref_compesion());
 #endif
 #else
-	*v1 = (s32)(*adc_phase_reg1[phases]) ;
-	*v2 = (s32)(*adc_phase_reg2[phases]) ;
+	*pv1 = (s32)(*adc_phase_reg1[phases]) ;
+	*pv2 = (s32)(*adc_phase_reg2[phases]) ;
 #endif
 }
 
 
 static void __inline adc_current_sample_config(u8 phases) {
 #ifdef HIGH_SIDE_CURRENT_SENSOR
-#ifdef CONFIG_SW_MUTISAMPLE
-	ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN);
-	ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN);
+#if (INJ_CHAN_NUM==4)
+	//ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN);
+	//ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN);
 #else
 	ADC_ISQ(ADC0) = ADC_RANK_CHANNEL(V_PHASE_I_CHAN);
 	ADC_ISQ(ADC1) = ADC_RANK_CHANNEL(W_PHASE_I_CHAN);