Kaynağa Gözat

adc 外部触发使能开始就使能,不在timer update event 中断中更新

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 yıl önce
ebeveyn
işleme
944615208f

+ 3 - 2
Applications/app/app.c

@@ -14,9 +14,10 @@ static u32 _app_low_task(void *args);
 
 
 extern measure_time_t g_meas_hall;
 extern measure_time_t g_meas_hall;
 extern measure_time_t g_meas_foc;
 extern measure_time_t g_meas_foc;
-
+extern measure_time_t g_meas_timeup;
 static void mc_exec_log(void) {
 static void mc_exec_log(void) {
-	sys_debug("intval = %d, exec = %d, count = %d\n", g_meas_foc.intval_time, g_meas_foc.exec_time, g_meas_foc.exec_count);
+	sys_debug("intval = %d, err = %d, %d, %d, count = %d\n", g_meas_foc.intval_time, g_meas_foc.intval_time_error, g_meas_foc.intval_low_err, g_meas_foc.intval_hi_err, g_meas_foc.exec_count);
+	sys_debug("timeup intval = %d, err = %d\n\n", g_meas_timeup.intval_time, g_meas_timeup.intval_time_error);
 }
 }
 
 
 void app_start(void){
 void app_start(void){

+ 3 - 1
Applications/bsp/adc.c

@@ -109,7 +109,7 @@ void adc_start_convert(void) {
     adc_flag_clear(ADC0, ADC_FLAG_EOIC);
     adc_flag_clear(ADC0, ADC_FLAG_EOIC);
     adc_flag_clear(ADC1, ADC_FLAG_EOIC);
     adc_flag_clear(ADC1, ADC_FLAG_EOIC);
 
 
-	//adc_enable_ext_trigger();
+	adc_enable_ext_trigger();
 	while(drop-- > 0) {
 	while(drop-- > 0) {
 		while ((adc_flag_get(ADC0, ADC_FLAG_EOIC) == RESET) || (adc_flag_get(ADC1, ADC_FLAG_EOIC) == RESET));
 		while ((adc_flag_get(ADC0, ADC_FLAG_EOIC) == RESET) || (adc_flag_get(ADC1, ADC_FLAG_EOIC) == RESET));
 		adc_flag_clear(ADC0, ADC_FLAG_EOIC);
 		adc_flag_clear(ADC0, ADC_FLAG_EOIC);
@@ -123,6 +123,8 @@ void adc_start_convert(void) {
 #endif
 #endif
 	adc_update_ext_trigger(ADC_TRIGGER_PHASE);
 	adc_update_ext_trigger(ADC_TRIGGER_PHASE);
 
 
+	//adc_enable_ext_trigger();
+
 }
 }
 
 
 void adc_stop_convert(void) {
 void adc_stop_convert(void) {

+ 16 - 11
Applications/bsp/mc_irqs.c

@@ -73,9 +73,13 @@ void DebugMon_Handler(void)
 {
 {
 }
 }
 
 
-extern void hall_sensor_handler(void);
-extern void mc_brake_handler(void);
-extern void mc_pwm_up_handler(void);
+
+__weak void MC_Brake_IRQHandler(void) {
+
+}
+__weak void TIMER_UP_IRQHandler(void) {
+
+}
 
 
 __weak void ADC_IRQHandler(void) {
 __weak void ADC_IRQHandler(void) {
 
 
@@ -87,23 +91,24 @@ __weak void HALL_IRQHandler(void) {
 
 
 void ADC0_1_IRQHandler(void)
 void ADC0_1_IRQHandler(void)
 {
 {
-	adc_disable_ext_trigger();
+	//adc_disable_ext_trigger();
 	ADC_IRQHandler();
 	ADC_IRQHandler();
     /* clear the ADC flag */
     /* clear the ADC flag */
-	adc_clear_irq_flags();	
+	adc_clear_irq_flags();
+	//adc_enable_ext_trigger();
 }
 }
 
 
 void TIMER0_UP_IRQHandler(void) {
 void TIMER0_UP_IRQHandler(void) {
 	if (timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP)) {
 	if (timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP)) {
 		timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
 		timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
-		mc_pwm_up_handler();
+		TIMER_UP_IRQHandler();
 	}
 	}
 }
 }
 
 
 void TIMER0_BRK_IRQHandler(void) {
 void TIMER0_BRK_IRQHandler(void) {
 	if (timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_BRK)) {
 	if (timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_BRK)) {
 		timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_BRK);
 		timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_BRK);
-		mc_brake_handler();
+		MC_Brake_IRQHandler();
 	}
 	}
 }
 }
 
 
@@ -118,7 +123,7 @@ void EXTI0_IRQHandler(void)
 {
 {
 	if(RESET != exti_interrupt_flag_get(EXTI_0)){
 	if(RESET != exti_interrupt_flag_get(EXTI_0)){
 		exti_interrupt_flag_clear(EXTI_0);
 		exti_interrupt_flag_clear(EXTI_0);
-		hall_sensor_handler();
+		HALL_IRQHandler();
 	}	
 	}	
 }
 }
 
 
@@ -143,7 +148,7 @@ void EXTI4_IRQHandler(void)
 {
 {
 	if(RESET != exti_interrupt_flag_get(EXTI_4)){
 	if(RESET != exti_interrupt_flag_get(EXTI_4)){
 		exti_interrupt_flag_clear(EXTI_4);
 		exti_interrupt_flag_clear(EXTI_4);
-		mc_brake_handler();
+		MC_Brake_IRQHandler();
 	}	
 	}	
 }
 }
 
 
@@ -151,11 +156,11 @@ void EXTI4_IRQHandler(void)
 void EXTI5_9_IRQHandler(void){
 void EXTI5_9_IRQHandler(void){
 	if(RESET != exti_interrupt_flag_get(EXTI_5)){
 	if(RESET != exti_interrupt_flag_get(EXTI_5)){
 		exti_interrupt_flag_clear(EXTI_5);
 		exti_interrupt_flag_clear(EXTI_5);
-		mc_brake_handler();
+		MC_Brake_IRQHandler();
 	}
 	}
 	if(RESET != exti_interrupt_flag_get(EXTI_6)){
 	if(RESET != exti_interrupt_flag_get(EXTI_6)){
 		exti_interrupt_flag_clear(EXTI_6);
 		exti_interrupt_flag_clear(EXTI_6);
-		hall_sensor_handler();
+		HALL_IRQHandler();
 	}	
 	}	
 	if(RESET != exti_interrupt_flag_get(EXTI_7)){
 	if(RESET != exti_interrupt_flag_get(EXTI_7)){
 		exti_interrupt_flag_clear(EXTI_7);
 		exti_interrupt_flag_clear(EXTI_7);

+ 2 - 2
Applications/bsp/pwm.c

@@ -109,7 +109,7 @@ static void _init_pwm_timer(void) {
     timer_initpara.alignedmode      = TIMER_COUNTER_CENTER_UP;
     timer_initpara.alignedmode      = TIMER_COUNTER_CENTER_UP;
     timer_initpara.period          = half_period;
     timer_initpara.period          = half_period;
     timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
     timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
-    timer_initpara.repetitioncounter = 0;
+    timer_initpara.repetitioncounter = 1;
     timer_init(timer,&timer_initpara);
     timer_init(timer,&timer_initpara);
     /* auto-reload preload enable */
     /* auto-reload preload enable */
     timer_auto_reload_shadow_enable(timer);
     timer_auto_reload_shadow_enable(timer);
@@ -389,7 +389,7 @@ void pwm_turn_on_low_side(void)
 void pwm_update_sample(u32 samp1, u32 samp2, u8 sector) {
 void pwm_update_sample(u32 samp1, u32 samp2, u8 sector) {
 	pwm_update_2smaples(samp1, samp2);
 	pwm_update_2smaples(samp1, samp2);
 #ifdef ENABLE_AUX_TIMER
 #ifdef ENABLE_AUX_TIMER
-	if (samp2 < FOC_PWM_Half_Period) {
+	if (samp1 < FOC_PWM_Half_Period) {
 		adc_update_ext_trigger(ADC_TRIGGER_PHASE);
 		adc_update_ext_trigger(ADC_TRIGGER_PHASE);
 	}else {
 	}else {
 		adc_update_ext_trigger(ADC_TRIGGER_PHASE2);
 		adc_update_ext_trigger(ADC_TRIGGER_PHASE2);

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

@@ -93,6 +93,7 @@ void PMSM_FOC_CoreInit(void) {
 	_gFOC_Ctrl.in.s_maxiDC = S16Q5(MAX_iDC);
 	_gFOC_Ctrl.in.s_maxiDC = S16Q5(MAX_iDC);
 	_gFOC_Ctrl.in.s_maxRPM = S32Q14(MAX_SPEED);
 	_gFOC_Ctrl.in.s_maxRPM = S32Q14(MAX_SPEED);
 	_gFOC_Ctrl.in.s_vDC    = S16Q5(MAX_vDC);
 	_gFOC_Ctrl.in.s_vDC    = S16Q5(MAX_vDC);
+	_gFOC_Ctrl.in.n_modulation = S16Q14(0.95f);
 	_gFOC_Ctrl.out.n_RunMode = OPEN_MODE;
 	_gFOC_Ctrl.out.n_RunMode = OPEN_MODE;
 	_gFOC_Ctrl.out.f_vdqRation = S16Q14(0.9f);
 	_gFOC_Ctrl.out.f_vdqRation = S16Q14(0.9f);
 	_gFOC_Ctrl.in.s_manualAngle = 0xFFFF;
 	_gFOC_Ctrl.in.s_manualAngle = 0xFFFF;
@@ -138,7 +139,7 @@ void PMSM_FOC_Schedule(void) {
 		err = err << 9; //q5 to q14
 		err = err << 9; //q5 to q14
 		_gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_run(_gFOC_Ctrl.iq_ctl, err);
 		_gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_run(_gFOC_Ctrl.iq_ctl, err);
 	}
 	}
-	_gFOC_Ctrl.out.f_vdqRation = Circle_Limitation(&_gFOC_Ctrl.in.s_targetVdq, _gFOC_Ctrl.in.s_vDC, S16Q14(0.95f), &_gFOC_Ctrl.out.s_OutVdq);
+	_gFOC_Ctrl.out.f_vdqRation = Circle_Limitation(&_gFOC_Ctrl.in.s_targetVdq, _gFOC_Ctrl.in.s_vDC, _gFOC_Ctrl.in.n_modulation, &_gFOC_Ctrl.out.s_OutVdq);
 
 
 	RevPark(&_gFOC_Ctrl.out.s_OutVdq, _gFOC_Ctrl.in.s_motAngle, &vAB);
 	RevPark(&_gFOC_Ctrl.out.s_OutVdq, _gFOC_Ctrl.in.s_motAngle, &vAB);
 
 

+ 1 - 0
Applications/foc/core/PMSM_FOC_Core.h

@@ -25,6 +25,7 @@ typedef struct {
 	DQ_t    s_targetIdq;
 	DQ_t    s_targetIdq;
 	DQ_t    s_targetVdq;
 	DQ_t    s_targetVdq;
 	s16q5_t s_vDC;
 	s16q5_t s_vDC;
+	s16q14_t n_modulation;
 	u8      n_ctlMode;
 	u8      n_ctlMode;
 	bool    b_motEnable;
 	bool    b_motEnable;
 	bool    b_cruiseEna;
 	bool    b_cruiseEna;

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

@@ -159,7 +159,7 @@ u32 phase_current_point(u8 *sector, u16 *duty, u16 low, u16 midle){
 		time->Samp_p1 = FOC_PWM_Half_Period - 1;//dumy trigger
 		time->Samp_p1 = FOC_PWM_Half_Period - 1;//dumy trigger
 	}
 	}
 	*sector = cs->sector;
 	*sector = cs->sector;
-	return (time->Samp_p1 | time->Samp_p2>>16);
+	return (time->Samp_p1 | time->Samp_p2<<16);
 }
 }
 
 
 
 

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

@@ -168,14 +168,16 @@ static void brake_timer_handler(shark_timer_t *t) {
 
 
 static shark_timer_t _brake_timer = TIMER_INIT(_brake_timer, brake_timer_handler);
 static shark_timer_t _brake_timer = TIMER_INIT(_brake_timer, brake_timer_handler);
 
 
-void mc_brake_handler(void){
+void MC_Brake_IRQHandler(void){
 	shark_timer_post(&_brake_timer, 0);
 	shark_timer_post(&_brake_timer, 0);
 }
 }
-void mc_pwm_up_handler(void){
-	phase_current_adc_triger();
+measure_time_t g_meas_timeup = {.intval_max_time = 50, .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
+void TIMER_UP_IRQHandler(void){
+	//phase_current_adc_triger();
+	time_measure_start(&g_meas_timeup);
 }
 }
 
 
-measure_time_t g_meas_foc = {.exec_max_time = 15,};
+measure_time_t g_meas_foc = {.intval_max_time = 50,  .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
 #define TIME_MEATURE_START() time_measure_start(&g_meas_foc)
 #define TIME_MEATURE_START() time_measure_start(&g_meas_foc)
 #define TIME_MEATURE_END() time_measure_end(&g_meas_foc)
 #define TIME_MEATURE_END() time_measure_end(&g_meas_foc)
 
 

+ 13 - 1
Applications/libs/time_measure.c

@@ -3,7 +3,7 @@
 #include "os/os_task.h"
 #include "os/os_task.h"
 #include "libs/time_measure.h"
 #include "libs/time_measure.h"
 
 
-#define COUNT_2_US(c) (c)
+#define COUNT_2_US(c) (c/120)
 
 
 u32 time_delta_us(u32 count, u32 *p_update) {
 u32 time_delta_us(u32 count, u32 *p_update) {
 	u32 now = task_ticks_abs();
 	u32 now = task_ticks_abs();
@@ -21,6 +21,18 @@ u32 time_delta_us(u32 count, u32 *p_update) {
 void time_measure_start(measure_time_t *m){
 void time_measure_start(measure_time_t *m){
 	m->intval_time = time_delta_us(m->intval_count, &m->intval_count);
 	m->intval_time = time_delta_us(m->intval_count, &m->intval_count);
 	m->exec_count = task_ticks_abs();
 	m->exec_count = task_ticks_abs();
+	if (m->first) {
+		m->first = false;
+		return;
+	}
+	if (m->intval_time > m->intval_max_time+1) {
+		m->intval_time_error ++;
+		m->intval_hi_err = m->intval_time;
+	}
+	if (m->intval_time < m->intval_max_time-1) {
+		m->intval_time_error ++;
+		m->intval_low_err = m->intval_time;
+	}
 }
 }
 void time_measure_end(measure_time_t *m) {
 void time_measure_end(measure_time_t *m) {
 	m->exec_time = time_delta_us(m->exec_count, NULL);
 	m->exec_time = time_delta_us(m->exec_count, NULL);

+ 4 - 0
Applications/libs/time_measure.h

@@ -3,10 +3,14 @@
 #include "os/os_types.h"
 #include "os/os_types.h"
 
 
 typedef struct {
 typedef struct {
+	bool first;
 	u32 exec_count;
 	u32 exec_count;
 	u32 exec_time;
 	u32 exec_time;
 	u32 intval_count;
 	u32 intval_count;
 	u32 intval_time;
 	u32 intval_time;
+	u32 intval_max_time;
+	u32 intval_low_err;
+	u32 intval_hi_err;
 	u32 exec_max_time;
 	u32 exec_max_time;
 	u32 exec_max_error_time;
 	u32 exec_max_error_time;
 	u32 exec_time_error;
 	u32 exec_time_error;