浏览代码

update phase current sample

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 4 年之前
父节点
当前提交
76d1b57398

+ 4 - 2
Applications/app/app.c

@@ -25,6 +25,8 @@ static void _can_report_info(void) {
 	can_report_speed(0x45, foc_get_speed());
 	current_samp_t *s = foc_get_current_sample();
 	can_report_phase_current(0x45, F2I(s->Ia * 1000), F2I(s->Ib * 1000), F2I(s->Ic * 1000));
+	sys_debug("phase current %f %f %f\n", s->Ia, s->Ib, s->Ic);
+	sys_debug("phase offset %d %d %d\n", s->adc_offset_a, s->adc_offset_b, s->adc_offset_c);
 }
 
 
@@ -32,8 +34,8 @@ static void _app_low_task(void *args) {
 	while(1) {
 		wdog_reload();
 		_can_report_info();
-		sys_debug("foc exec time %d, intval %d, max %d, error %d\n", g_meas_foc.exec_time, g_meas_foc.intval_time, g_meas_foc.exec_max_error_time, g_meas_foc.intval_time_error);
-		sys_debug("hall exec time %d, intval %d\n", g_meas_hall.exec_time, g_meas_hall.intval_time);
+		//sys_debug("foc exec time %d, intval %d, max %d, error %d\n", g_meas_foc.exec_time, g_meas_foc.intval_time, g_meas_foc.exec_max_error_time, g_meas_foc.intval_time_error);
+		//sys_debug("hall exec time %d, intval %d\n", g_meas_hall.exec_time, g_meas_hall.intval_time);
 		sys_debug("vbus voltage: %f\n", foc_get_vbus_voltage());
 		co_task_delay(1000);
 	}

+ 5 - 3
Applications/bsp/adc.c

@@ -27,6 +27,8 @@ void adc_init(void){
 	adc_config_trigger(ADC_TRIGGER_PHASE);
 
 	nvic_irq_enable(ADC0_1_IRQn, ADC_IRQ_PRIORITY, 0);
+
+	adc_disable_ext_trigger();
 }
 
 static void _gpio_init(void) {
@@ -90,7 +92,7 @@ static void _adc1_init(void) {
 /* ADC0 insert chan sample phase I(use two chan, selected by foc) */
 static void _adc0_insert_chan_init(void) {
 	u32 adc_dev = ADC0;
-	//adc_discontinuous_mode_config(adc_dev, ADC_INSERTED_CHANNEL, 0);	
+	adc_discontinuous_mode_config(adc_dev, ADC_CHANNEL_DISCON_DISABLE, 0);	
     /* ADC channel length config */
     adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 1);
     /* ADC inserted channel ran config, use ISQ2,ISQ3 */
@@ -108,7 +110,7 @@ static void _adc0_insert_chan_init(void) {
 /* ADC1 insert chan sample vbus I */
 static void _adc1_insert_chan_init(void) {
 	u32 adc_dev = ADC1;
-	//adc_discontinuous_mode_config(adc_dev, ADC_INSERTED_CHANNEL, 0);
+	//adc_discontinuous_mode_config(adc_dev, ADC_CHANNEL_DISCON_DISABLE, 0);
     /* ADC channel length config */
     adc_channel_length_config(adc_dev, ADC_INSERTED_CHANNEL, 1);
     /* ADC inserted channel config */
@@ -125,7 +127,7 @@ static void _adc1_insert_chan_init(void) {
 }
 
 static void _adc0_regular_chan_init(void) {
-	adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 1); //每次转化一个
+	//adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 1); //每次转化一个
 	/* ADC channel length config */
 	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
 	adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

+ 24 - 7
Applications/bsp/adc.h

@@ -70,14 +70,14 @@ static u32 volatile * adc_phase_reg2[6] = {
 	&ADC_IDATA0(ADC0),
 };
 
-static void __inline adc_phase_current_read(u8 sector, u32 *v1, u32 *v2) {
-	*v1 = (*adc_phase_reg1[sector]) << 4;
-	*v2 = (*adc_phase_reg2[sector]) << 4;
+static void __inline adc_phase_current_read(u8 sector, s32 *v1, s32 *v2) {
+	*v1 = (s32)(*adc_phase_reg1[sector]) ;
+	*v2 = (s32)(*adc_phase_reg2[sector]) ;
 }
 
-static void __inline adc_cali_current_read(u32 *v1, u32 *v2) {
-	*v1 = ADC_IDATA0(ADC0);
-	*v2 = ADC_IDATA0(ADC1);
+static void __inline adc_cali_current_read(s32 *v1, s32 *v2) {
+	*v1 = (s32)ADC_IDATA0(ADC0);
+	*v2 = (s32)ADC_IDATA0(ADC1);
 }
 
 
@@ -99,9 +99,20 @@ static void __inline adc_cali_inserted_config(u8 invert) {
 static void __inline adc_config_trigger(u32 trigger) {
 	ADC_CTL1(ADC0) &= ~((uint32_t)ADC_CTL1_ETSIC);
 	ADC_CTL1(ADC0) |= (uint32_t)trigger;
-
+#if 1
 	ADC_CTL1(ADC1) &= ~((uint32_t)ADC_CTL1_ETSIC);
 	ADC_CTL1(ADC1) |= (uint32_t)trigger;
+#endif
+}
+
+static void __inline adc_disable_ext_trigger(void) {
+	ADC_CTL1(ADC0) &= ~ADC_CTL1_ETEIC;
+	ADC_CTL1(ADC1) &= ~ADC_CTL1_ETEIC;
+}
+
+static void __inline adc_enable_ext_trigger(void) {
+	ADC_CTL1(ADC0) |= ADC_CTL1_ETEIC;
+	ADC_CTL1(ADC1) |= ADC_CTL1_ETEIC;
 }
 
 static bool __inline adc_is_trigged_vbus(void) {
@@ -135,12 +146,18 @@ static __inline__ void adc_update_insert_sample_time(u32 adc, uint8_t adc_channe
 
 static __inline__ bool adc_eoic_interrupt(void)
 {
+#if 1
 	if (ADC_STAT(ADC0) & ADC_STAT_EOIC){
 		return true;
 	}
 	if (ADC_STAT(ADC1) & ADC_STAT_EOIC){
 		return true;
 	}
+#else
+	if ((ADC_STAT(ADC0) & ADC_STAT_EOIC) && (ADC_STAT(ADC1) & ADC_STAT_EOIC)) {
+		return true;
+	}
+#endif
 	return false;
 }
 

+ 2 - 2
Applications/bsp/pwm.c

@@ -84,7 +84,7 @@ static void _init_pwm_timer(void) {
 	memset(&timer_initpara, 0, sizeof(timer_initpara));
 	memset(&timer_ocintpara, 0, sizeof(timer_ocintpara));
     timer_initpara.prescaler        = 0;
-    timer_initpara.alignedmode      = TIMER_COUNTER_CENTER_BOTH;
+    timer_initpara.alignedmode      = TIMER_COUNTER_CENTER_UP;
     timer_initpara.period          = half_period;
     timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
     timer_initpara.repetitioncounter = 0;
@@ -128,7 +128,7 @@ static void _init_pwm_timer(void) {
     /* automatic output enable, break, dead time and lock configuration*/
     timer_breakpara.runoffstate     = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.ideloffstate    = TIMER_IOS_STATE_DISABLE ;
-    timer_breakpara.deadtime        = 1; // one Time of DTS, abort deadtime
+    timer_breakpara.deadtime        = TDead; // one Time of DTS, abort deadtime
     timer_breakpara.breakpolarity    = TIMER_BREAK_POLARITY_LOW;
     timer_breakpara.outputautostate  = TIMER_OUTAUTO_ENABLE;
     timer_breakpara.protectmode     = TIMER_CCHP_PROT_0;

+ 2 - 2
Applications/foc/foc_core.c

@@ -230,8 +230,8 @@ void mc_phase_current_irq(void) {
 	time_measure_start(&g_meas_foc);
 	FOC_Fast_Task(&g_foc);
 	time_measure_end(&g_meas_foc);
-	if (g_meas_foc.intval_time < 33 || g_meas_foc.intval_time > 33) {
-		//log_int_value(1, g_meas_foc.intval_time);
+	if (g_meas_foc.intval_time < 32 || g_meas_foc.intval_time > 34) {
+		//log_chan_value(1, g_meas_foc.intval_time);
 	}
 }
 

+ 4 - 4
Applications/foc/foc_type.h

@@ -72,10 +72,10 @@ typedef enum {
 }phase_invert_t;
 
 typedef struct current_sample {
-	u32   adc_offset_a;
-	u32   adc_offset_b;
-	u32   adc_offset_c;
-	u32   adc_offset_ivbus;
+	s32   adc_offset_a;
+	s32   adc_offset_b;
+	s32   adc_offset_c;
+	s32   adc_offset_ivbus;
 	float Ia;
 	float Ib;
 	float Ic;

+ 22 - 15
Applications/foc/phase_current.c

@@ -1,7 +1,7 @@
 #include "bsp/adc.h"
 #include "foc_type.h"
 #include "libs/utils.h"
-
+#include "libs/logger.h"
 #define MOS_Rds_Calibrate 1
 
 #define NB_OFFSET_SAMPLES 32
@@ -13,8 +13,8 @@
 
 #define Lower_Pass_p 0.2f
 
-#define VBUS_VOL(adc) ((adc) * 3.3f / 65535.0f / Gvbus)
-#define MOSds_VOL(adc) ((adc) * 3.3f / 65535.0f / Gmos)
+#define VBUS_VOL(adc) ((adc) * 3.3f / 4096.0f / Gvbus)
+#define MOSds_VOL(adc) ((adc) * 3.3f / 4096.0f / Gmos)
 
 #define current_i(v, r) ((v)/(r))
 
@@ -33,9 +33,11 @@ void phase_current_init(current_samp_t *cs) {
 
 
 void phase_current_offset(current_samp_t *cs) {
-	u32 phase_current1, phase_current2;
-	adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
+	s32 phase_current1, phase_current2;
+
+	adc_disable_ext_trigger();
 
+	adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
 	if (cs->offset_sample_count > 0) {
 		cs->offset_sample_count--;
 		if (cs->sector == SECTOR_5 && cs->offset_sample_count >= 0) {
@@ -57,35 +59,39 @@ void phase_current_offset(current_samp_t *cs) {
 }
 
 void phase_current_sample(current_samp_t *cs){
-	u32 phase_current1, phase_current2;
+	s32 phase_current1, phase_current2;
 
+	adc_disable_ext_trigger();
+	cs->sector = SECTOR_1;
 	adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
 	if (cs->sector == SECTOR_1 || cs->sector == SECTOR_2) {
 		/* Current on Phase C is not accessible */
 		/* Ia = PhaseAOffset - ADC converted value) */
-		cs->Ib = current_i(MOSds_VOL((int)phase_current1 - (int)cs->adc_offset_b), cs->Rds_b);
-		cs->Ia = current_i(MOSds_VOL((int)phase_current2 - (int)cs->adc_offset_a), cs->Rds_a);
+		cs->Ib = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_b), cs->Rds_b);
+		cs->Ia = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_a), cs->Rds_a);
 		cs->Ic = -(cs->Ia + cs->Ib);
 	}else if (cs->sector == SECTOR_3 || cs->sector == SECTOR_4) {
 		/* Current on Phase A is not accessible 	*/
 		/* Ib = PhaseBOffset - ADC converted value) */
-		cs->Ic = current_i(MOSds_VOL((int)phase_current1 - (int)cs->adc_offset_c), cs->Rds_c);
-		cs->Ib = current_i(MOSds_VOL((int)phase_current2 - (int)cs->adc_offset_b), cs->Rds_b);
+		cs->Ic = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_c), cs->Rds_c);
+		cs->Ib = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_b), cs->Rds_b);
 		cs->Ia = -(cs->Ib + cs->Ic);
 	}else if (cs->sector == SECTOR_5 || cs->sector == SECTOR_6) {
 		/* Current on Phase B is not accessible 	*/
 		/* Ia = PhaseAOffset - ADC converted value) */
-		cs->Ia = current_i(MOSds_VOL((int)phase_current1 - (int)cs->adc_offset_a), cs->Rds_a);
-		cs->Ic = current_i(MOSds_VOL((int)phase_current2 - (int)cs->adc_offset_c), cs->Rds_c);
+		cs->Ia = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_a), cs->Rds_a);
+		cs->Ic = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_c), cs->Rds_c);
 		cs->Ib = -(cs->Ia + cs->Ic);
 	}
 }
 
 /* 校准mos的 drain-source 内阻 */
-void phase_Rds_calibrate(current_samp_t *cs) {	
+void phase_Rds_calibrate(current_samp_t *cs) {
+	adc_disable_ext_trigger();
+
 	if (cs->vbus_i_invert != INVERT_NO) {
-		u32 adcm;
-		u32 adcv;
+		s32 adcm;
+		s32 adcv;
 		adc_cali_current_read(&adcm, &adcv);
 		float vbus_i = VBUS_VOL(adcv)/Rvbus;
 		if (cs->vbus_i_invert == INVERT_A) {
@@ -135,5 +141,6 @@ void phase_current_adc_triger(current_samp_t *cs){
 		adc_config_trigger(ADC_TRIGGER_PHASE);
 		adc_phase_inserted_config(cs->sector);
 	}
+	adc_enable_ext_trigger();
 }
 

+ 4 - 4
Applications/libs/logger.c

@@ -9,7 +9,7 @@ static uint32_t level_data[2];
 static co_queue_t log_queue = NULL;
 
 static void log_co_task(void *args) {
-	log_int_t log_v;
+	log_chan_t log_v;
 	while(1) {
 		if (queue_get(log_queue, &log_v)){
 			sys_debug("%d: %d\n", log_v.id, log_v.value);
@@ -19,12 +19,12 @@ static void log_co_task(void *args) {
 }
 
 void log_start_task(void) {
-	log_queue = queue_create(1000, sizeof(log_int_t));
+	log_queue = queue_create(1000, sizeof(log_chan_t));
 	co_task_create(log_co_task, NULL, 512);
 }
 
-void log_int_value(int id, int value) {
-	log_int_t log_v;
+void log_chan_value(u16 id, s32 value) {
+	log_chan_t log_v;
 	log_v.id = id;
 	log_v.value = value;
 	queue_put(log_queue, &log_v);

+ 7 - 4
Applications/libs/logger.h

@@ -1,14 +1,17 @@
 #ifndef _Shark_Logger_h__
 #define _Shark_Logger_h__
 #include <stdarg.h>
+#include "os/os_type.h"
 
+#pragma  pack (push,1)
 typedef struct {
-	int id;
-	int value;
-}log_int_t;
+	u16 id;
+	s32 value;
+}log_chan_t;
+#pragma pack(pop)
 
 void log_start_task(void);
-void log_int_value(int id, int value) ;
+void log_chan_value(u16 id, s32 value) ;
 
 #define L_disable 0
 #define L_debug  3