Ver código fonte

update for current sample

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 anos atrás
pai
commit
521a7bd8e5

+ 3 - 2
Applications/app/app.c

@@ -11,13 +11,14 @@
 #include "app/nv_storage.h"
 
 static u32 _app_low_task(void *args);
-
+extern void PMSM_FOC_LogDebug(void);
 extern measure_time_t g_meas_hall;
 extern measure_time_t g_meas_foc;
 extern measure_time_t g_meas_timeup;
 static void mc_exec_log(void) {
-	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("intval = %d, exec = %d, err = %d, %d, %d, count = %d\n", g_meas_foc.intval_time, g_meas_foc.exec_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);
+	PMSM_FOC_LogDebug();
 }
 
 void app_start(void){

+ 59 - 55
Applications/bsp/adc.c

@@ -3,88 +3,92 @@
 #include "libs/utils.h"
 #include "os/os_task.h"
 #include "libs/logger.h"
-static void _gpio_init(void);
 
-void adc_init(void){
-	rcu_adc_clock_config(RCU_AF);
-	/* init adc input gpio */
-	_gpio_init();
+static void adc0_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);
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE
+
+	adc_deinit(ADC0);
+	
 	adc_mode_config(ADC_DAUL_INSERTED_PARALLEL);
-#else
-	adc_mode_config(ADC_MODE_FREE);
-#endif
-    /* ADC scan mode function enable */
-    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
-    adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
+
+	adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
+	adc_discontinuous_mode_config(ADC0, ADC_CHANNEL_DISCON_DISABLE, 0);
 
     /* configure ADC data alignment */
     adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
-    adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
 	
-    /* configure ADC inserted channel trigger */
-    adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE);
     /* configure ADC inserted channel length */
     adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
-    /* configure ADC inserted channel trigger */
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE	
-    adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC_TRIGGER_NONE);
-#else
-	adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE2);
-#endif
-    /* configure ADC inserted channel length */
-    adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
-    /* configure ADC inserted channel */
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE		
+
     adc_inserted_channel_config(ADC0, 0, U_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-    adc_inserted_channel_config(ADC1, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 
 	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);
 	adc_update_insert_sample_time(ADC0, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
 
-	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);
-	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
-#else
-	adc_inserted_channel_config(ADC0, 0, VBUS_I_CHAN, ADC_SAMPLE_TIME);
-	adc_inserted_channel_config(ADC1, 0, VBUS_I_CHAN, ADC_SAMPLE_TIME);
-#endif
+    /* configure ADC inserted channel trigger */
+    adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_TRIGGER_PHASE);
+
     /* ADC external trigger enable */
     adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-    adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE
-    adc_interrupt_disable(ADC0, ADC_INT_EOIC);
-	adc_interrupt_disable(ADC1, ADC_INT_EOIC);
-#else
-	adc_interrupt_disable(ADC0, ADC_INT_EOIC);
-	adc_interrupt_disable(ADC1, ADC_INT_EOIC);
-#endif
+
     /* configure ADC regular channel trigger */
     adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
     adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
 
     /* enable ADC interface */
     adc_enable(ADC0);
-    adc_enable(ADC1);
 
+	delay_ms(1);
     /* ADC calibration and reset calibration */
     adc_calibration_enable(ADC0);
-    adc_calibration_enable(ADC1);
 
 	nvic_irq_enable(ADC0_1_IRQn, ADC_IRQ_PRIORITY, 0);
 
 	adc_disable_ext_trigger();
 }
 
-static void _gpio_init(void) {
+
+static void adc1_init(void){
+
+	rcu_periph_clock_enable(RCU_ADC1);
+	adc_deinit(ADC1);
+
+	adc_special_function_config(ADC1, ADC_SCAN_MODE, DISABLE);
+	adc_discontinuous_mode_config(ADC1, ADC_CHANNEL_DISCON_DISABLE, 0);
+    /* configure ADC data alignment */
+    adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
+	
+    /* configure ADC inserted channel length */
+    adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
+
+    /* configure ADC inserted channel */
+    adc_inserted_channel_config(ADC1, 0, V_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+
+	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);
+	adc_update_insert_sample_time(ADC1, W_PHASE_I_CHAN, ADC_SAMPLE_TIME);
+
+    /* 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);
+
+    /* enable ADC interface */
+    adc_enable(ADC1);
+	delay_ms(1);
+    /* ADC calibration and reset calibration */
+    adc_calibration_enable(ADC1);
+    /* ADC software trigger enable */
+    adc_software_trigger_enable(ADC1, ADC_INSERTED_CHANNEL);	
+}
+
+static void adc_gpio_init(void) {
 	rcu_periph_clock_enable(RCU_GPIOA);
 	rcu_periph_clock_enable(RCU_GPIOB);
+	rcu_periph_clock_enable(RCU_AF);
 #ifdef GD32_FOC_DEMO
 	/* configure ADC pin, bus voltage sampling -- ADC_IN0(PA0) */
 	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
@@ -102,6 +106,11 @@ static void _gpio_init(void) {
 #endif	
 }
 
+void adc_init(void) {
+	adc_gpio_init();
+	adc0_init();
+	adc1_init();
+}
 
 void adc_start_convert(void) {
 	int drop = 2;
@@ -111,16 +120,13 @@ void adc_start_convert(void) {
 
 	adc_enable_ext_trigger();
 	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_clear(ADC0, ADC_FLAG_EOIC);
-		adc_flag_clear(ADC1, ADC_FLAG_EOIC);
 	}
     /* enable ADC interrupt */
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE
+
 	adc_interrupt_enable(ADC0, ADC_INT_EOIC);
-#else
-	adc_interrupt_enable(ADC1, ADC_INT_EOIC);
-#endif
+
 	adc_update_ext_trigger(ADC_TRIGGER_PHASE);
 
 	//adc_enable_ext_trigger();
@@ -130,11 +136,9 @@ void adc_start_convert(void) {
 void adc_stop_convert(void) {
 	adc_disable_ext_trigger();
     /* disable ADC interrupt */
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE
+
 	adc_interrupt_disable(ADC0, ADC_INT_EOIC);
-#else
-	adc_interrupt_disable(ADC1, ADC_INT_EOIC);
-#endif
+
     /* clear the ADC flag */
     adc_flag_clear(ADC0, ADC_FLAG_EOIC);
 	adc_flag_clear(ADC1, ADC_FLAG_EOIC);

+ 3 - 3
Applications/bsp/adc.h

@@ -32,7 +32,7 @@ inserted ADC 由timer0 ch3触发,
 #define ISO3_OFFSET 15
 #define IL_OFFSET   20
 
-#define ADC_SAMPLE_TIME ADC_SAMPLETIME_7POINT5
+#define ADC_SAMPLE_TIME ADC_SAMPLETIME_13POINT5
 #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_CH3
 #define ADC_TRIGGER_PHASE2 ADC0_1_EXTTRIG_INSERTED_T1_CH0
 #define ADC_TRIGGER_NONE  ADC0_1_2_EXTTRIG_INSERTED_NONE
@@ -82,8 +82,8 @@ 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]) ;
 #else
-	*v1 = (s32) ADC_IDATA0(ADC0);
-	*v2 = (s32) ADC_IDATA0(ADC1);
+	*v1 =  (ADC_IDATA0(ADC0) & 0xFFF);
+	*v2 =  (ADC_IDATA0(ADC1) & 0xFFF);
 #endif
 }
 

+ 2 - 1
Applications/bsp/bsp.h

@@ -70,8 +70,9 @@
 
 #define SHUNT_NUM THREE_SHUNTS_SAMPLE
 
-#define ENABLE_AUX_TIMER 1
+//#define ENABLE_AUX_TIMER 1
 
+#define ADC_TO_CURR_ceof (0.0942f)
 
 void bsp_init(void);
 void wdog_reload(void);

+ 12 - 23
Applications/bsp/pwm.c

@@ -107,7 +107,8 @@ static void _init_pwm_timer(void) {
 	memset(&timer_ocintpara, 0, sizeof(timer_ocintpara));
     timer_initpara.prescaler        = 0;
     timer_initpara.alignedmode      = TIMER_COUNTER_CENTER_UP;
-    timer_initpara.period          = half_period;
+	timer_initpara.counterdirection  = TIMER_COUNTER_UP;
+    timer_initpara.period          = half_period-1;
     timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
     timer_initpara.repetitioncounter = 1;
     timer_init(timer,&timer_initpara);
@@ -123,17 +124,17 @@ static void _init_pwm_timer(void) {
     timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;
 
     timer_channel_output_config(timer,TIMER_CH_0,&timer_ocintpara);
-    timer_channel_output_pulse_value_config(timer,TIMER_CH_0,half_period);
+    timer_channel_output_pulse_value_config(timer,TIMER_CH_0,half_period/2);
     timer_channel_output_mode_config(timer,TIMER_CH_0,TIMER_OC_MODE_PWM0);
     timer_channel_output_shadow_config(timer,TIMER_CH_0,TIMER_OC_SHADOW_ENABLE);
 
     timer_channel_output_config(timer,TIMER_CH_1,&timer_ocintpara);
-    timer_channel_output_pulse_value_config(timer,TIMER_CH_1,half_period);
+    timer_channel_output_pulse_value_config(timer,TIMER_CH_1,half_period/2);
     timer_channel_output_mode_config(timer,TIMER_CH_1,TIMER_OC_MODE_PWM0);
     timer_channel_output_shadow_config(timer,TIMER_CH_1,TIMER_OC_SHADOW_ENABLE);
 
     timer_channel_output_config(timer,TIMER_CH_2,&timer_ocintpara);
-    timer_channel_output_pulse_value_config(timer,TIMER_CH_2,half_period);
+    timer_channel_output_pulse_value_config(timer,TIMER_CH_2,half_period/2);
     timer_channel_output_mode_config(timer,TIMER_CH_2,TIMER_OC_MODE_PWM0);
     timer_channel_output_shadow_config(timer,TIMER_CH_2,TIMER_OC_SHADOW_ENABLE);
     
@@ -146,20 +147,20 @@ static void _init_pwm_timer(void) {
 
     /* chan3 trigger adc O3CPRE is alwary active high, adc trigger is rising */
     timer_channel_output_config(timer,TIMER_CH_3,&timer_ocintpara);
-    timer_channel_output_pulse_value_config(timer,TIMER_CH_3,half_period-1);
+    timer_channel_output_pulse_value_config(timer,TIMER_CH_3,half_period-5);
     timer_channel_output_mode_config(timer,TIMER_CH_3,TIMER_OC_MODE_PWM1);
     timer_channel_output_shadow_config(timer,TIMER_CH_3,TIMER_OC_SHADOW_ENABLE);
 
 #if USER_ITMER_BRAKE==1
 	timer_break_parameter_struct timer_breakpara;
-    timer_breakpara.runoffstate        = TIMER_ROS_STATE_ENABLE;
-    timer_breakpara.ideloffstate       = TIMER_IOS_STATE_ENABLE;
+    timer_breakpara.runoffstate        = TIMER_ROS_STATE_DISABLE;
+    timer_breakpara.ideloffstate       = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.protectmode        = TIMER_CCHP_PROT_OFF; 
-    timer_breakpara.deadtime           = NS_2_TCLK(TIMER_DT_NS);
-    timer_breakpara.breakstate         = TIMER_BREAK_ENABLE;
+    timer_breakpara.deadtime           = 0;//NS_2_TCLK(TIMER_DT_NS);
+    timer_breakpara.breakstate         = TIMER_BREAK_DISABLE;
     timer_breakpara.breakpolarity      = TIMER_BREAK_POLARITY_HIGH;
     timer_breakpara.outputautostate    = TIMER_OUTAUTO_DISABLE;
-    timer_break_config(TIMER0,&timer_breakpara);
+    timer_break_config(timer,&timer_breakpara);
 	timer_interrupt_enable(timer, TIMER_INT_BRK);
 	timer_interrupt_flag_clear(timer, TIMER_INT_FLAG_BRK);
 	nvic_irq_enable(TIMER0_BRK_IRQn, 1, 0);		
@@ -320,14 +321,8 @@ static void _gpio_brakein_irq_enable(void){
 #endif
 
 void pwm_start(void){
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE
 	pwm_update_duty(FOC_PWM_Half_Period/2, FOC_PWM_Half_Period/2, FOC_PWM_Half_Period/2);
-	pwm_update_2smaples(FOC_PWM_Half_Period-1, FOC_PWM_Half_Period + 1);
-#else
-	pwm_update_duty_dma(0,0,0,0,0,0);
-	dma_channel_enable(DMA0, DMA_CH4);
-	pwm_update_2smaples(FOC_PWM_Half_Period-(2 * TADC + TRise), FOC_PWM_Half_Period-TADC);
-#endif	
+	pwm_update_2smaples(FOC_PWM_Half_Period-10, FOC_PWM_Half_Period + 1);
 	/* wait for a new PWM period to flush last HF task */
 	timer_flag_clear(pwm_timer, TIMER_FLAG_UP);
 
@@ -368,14 +363,8 @@ void pwm_enable_output(bool enable) {
 /*open low side of the mosfet*/
 void pwm_turn_on_low_side(void)
 {
-#if SHUNT_NUM==THREE_SHUNTS_SAMPLE
 	pwm_update_duty(0, 0, 0);
 	pwm_update_2smaples(FOC_PWM_Half_Period-1, FOC_PWM_Half_Period + 1);
-#else
-	pwm_update_duty_dma(0,0,0,0,0,0);
-	dma_channel_enable(DMA0, DMA_CH4);
-	pwm_update_2smaples(FOC_PWM_Half_Period-(2 * TADC + TRise), FOC_PWM_Half_Period-TADC);
-#endif
 	timer_flag_clear(pwm_timer,TIMER_FLAG_UP);
 	timer_event_software_generate(pwm_timer, TIMER_EVENT_SRC_UPG);
   	while (timer_flag_get(pwm_timer,TIMER_FLAG_UP) == RESET );

+ 1 - 1
Applications/foc/commands.c

@@ -49,7 +49,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			bool success;
 			foc_start_cmd_t *scmd = (foc_start_cmd_t *)command->data;
 			if (scmd->start_stop == Foc_Start) {
-				success = mc_start(OPEN_MODE);
+				success = mc_start(TRQ_MODE);
 			}else if (scmd->start_stop == Foc_Stop) {
 				success = mc_stop();
 			}

+ 39 - 23
Applications/foc/core/PMSM_FOC_Core.c

@@ -1,3 +1,4 @@
+#include "arm_math.h"
 #include "PMSM_FOC_Core.h"
 #include "PMSM_FOC_Params.h"
 #include "foc/core/e_ctrl.h"
@@ -7,6 +8,7 @@
 #include "foc/motor/hall.h"
 #include "foc/core/svpwm.h"
 #include "bsp/pwm.h"
+#include "libs/logger.h"
 
 static PMSM_FOC_Ctrl _gFOC_Ctrl;
 
@@ -32,19 +34,19 @@ static __INLINE void Park(AB_t *alpha_beta, s16q5_t angle, DQ_t *dq) {
 	dq->q = S16_mul(-alpha_beta->a, s, 14) + S16_mul(alpha_beta->b, c, 14);
 }
 
-static __INLINE s16q5_t Circle_Limitation(DQ_t *vdq, s16q5_t vDC, s16q14_t module, DQ_t *out) {
-	u32 sq_vdq = vdq->d * vdq->d + vdq->q * vdq->q;
+static __INLINE s16q14_t Circle_Limitation(DQ_t *vdq, s16q5_t vDC, s16q14_t module, DQ_t *out) {
+	u32 sq_vdq = (u32)vdq->d * vdq->d + (u32)vdq->q * vdq->q;
 	s16q5_t vDC_m = S16_mul(vDC, module, 14);
-	u32 sq_vDC = vDC_m * vDC_m;
+	u32 sq_vDC = (u32)vDC_m * vDC_m;
 	if (sq_vdq > sq_vDC) {
-		s16q5_t r = Sqrt_Fix((sq_vDC << 10) / (sq_vdq));
-		out->d = S16_mul(vdq->d, r, 5);
-		out->q = S16_mul(vdq->q, r, 5);
+		s16q14_t r = S16Q14(sqrtf((float)sq_vDC / (float)sq_vdq));
+		out->d = S16_mul(vdq->d, r, 14);
+		out->q = S16_mul(vdq->q, r, 14);
 		return r;
 	}
 	out->d = vdq->d;
 	out->q = vdq->q;
-	return 32; // s16q5 32 means int 1
+	return S16Q14(1); // s16q5 32 means int 1
 }
 
 static __INLINE void FOC_Set_DqRamp(idq_Ctrl *c, s16q5_t target) {
@@ -53,9 +55,9 @@ static __INLINE void FOC_Set_DqRamp(idq_Ctrl *c, s16q5_t target) {
 	c->s_Step = (c->s_FinalTgt - cp) / (IDQ_CTRL_TS/SPD_CTRL_TS);
 	if (c->s_Step == 0) {
 		if (c->s_FinalTgt - cp > 0) {
-			c->s_Step = 1<<14;	
+			c->s_Step = S32Q14(1);	
 		}else {
-			c->s_Step = -(1 << 14);
+			c->s_Step = S32Q14(-1);
 		}
 	}
 }
@@ -63,12 +65,12 @@ static __INLINE void FOC_Set_DqRamp(idq_Ctrl *c, s16q5_t target) {
 static __INLINE s32q14_t FOC_Get_DqRamp(idq_Ctrl *c) {
 	c->s_Cp += c->s_Step;
 	if (c->s_Step < 0) {
-		if (c->s_Cp < c->s_Step) {
-			c->s_Cp = c->s_Step;
+		if (c->s_Cp < c->s_FinalTgt) {
+			c->s_Cp = c->s_FinalTgt;
 		}
 	}else {
-		if (c->s_Cp > c->s_Step) {
-			c->s_Cp = c->s_Step;
+		if (c->s_Cp > c->s_FinalTgt) {
+			c->s_Cp = c->s_FinalTgt;
 		}
 	}
 	return c->s_Cp;
@@ -97,15 +99,17 @@ void PMSM_FOC_CoreInit(void) {
 	_gFOC_Ctrl.out.n_RunMode = OPEN_MODE;
 	_gFOC_Ctrl.out.f_vdqRation = S16Q14(0.9f);
 	_gFOC_Ctrl.in.s_manualAngle = 0xFFFF;
-	
+
+	FOC_Set_DqRamp(_gFOC_Ctrl.dq_ctl, 0);
+	FOC_Set_DqRamp(_gFOC_Ctrl.dq_ctl + 1, 0);
 	PMSM_FOC_Reset_PID();
 }
 
 static __INLINE void PMSM_FOC_Update_Encoder(void) {
-	if (_gFOC_Ctrl.in.s_manualAngle != 0xFFF0) {
+	if (_gFOC_Ctrl.in.s_manualAngle != 0xFFFF) {
 		_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_manualAngle;
 	}else {
-		_gFOC_Ctrl.in.s_motAngle = S16Q5(hall_sensor_get_theta());
+		_gFOC_Ctrl.in.s_motAngle = hall_sensor_get_theta();
 	}
 	_gFOC_Ctrl.in.s_motRPM = hall_sensor_get_speed();
 }
@@ -126,17 +130,15 @@ void PMSM_FOC_Schedule(void) {
 	PMSM_FOC_Update_Encoder();
 	//sample current
 	phase_current_get(iabc);
-	
 	if (_gFOC_Ctrl.out.n_RunMode != OPEN_MODE) {
 		Clark(iabc[0], iabc[1], iabc[2], &vAB);
+
 		Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
 
-		s32q14_t err = FOC_Get_DqRamp(_gFOC_Ctrl.dq_ctl) - _gFOC_Ctrl.out.s_RealIdq.d;
-		err = err << 9; //q5 to q14
+		s32q14_t err = FOC_Get_DqRamp(_gFOC_Ctrl.dq_ctl) - (_gFOC_Ctrl.out.s_RealIdq.d << 9);
 		_gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_run(_gFOC_Ctrl.id_ctl, err);
 		
-		err = FOC_Get_DqRamp(_gFOC_Ctrl.dq_ctl+1) - _gFOC_Ctrl.out.s_RealIdq.q;
-		err = err << 9; //q5 to q14
+		err = FOC_Get_DqRamp(_gFOC_Ctrl.dq_ctl+1) - (_gFOC_Ctrl.out.s_RealIdq.q << 9);
 		_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, _gFOC_Ctrl.in.n_modulation, &_gFOC_Ctrl.out.s_OutVdq);
@@ -145,8 +147,22 @@ void PMSM_FOC_Schedule(void) {
 
 	SVM_Duty_Fix(&vAB, _gFOC_Ctrl.in.s_vDC, FOC_PWM_Half_Period, &_gFOC_Ctrl.out);
 
-	u32 sp = phase_current_point(&_gFOC_Ctrl.out.n_Sector , _gFOC_Ctrl.out.n_Duty, _gFOC_Ctrl.out.n_lowDuty, _gFOC_Ctrl.out.n_midDuty);
-	pwm_update_sample(sp&0xFFFF, (sp>>16)&0xFFFF, _gFOC_Ctrl.out.n_Sector);
+	//u32 sp = phase_current_point(&_gFOC_Ctrl.out.n_Sector , _gFOC_Ctrl.out.n_Duty, _gFOC_Ctrl.out.n_lowDuty, _gFOC_Ctrl.out.n_midDuty);
+	//_gFOC_Ctrl.out.n_Sample1 = sp & 0xFFFF;
+	//_gFOC_Ctrl.out.n_Sample2 = (sp>>16) & 0xFFFF;
+	//pwm_update_duty(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
+	//pwm_update_duty(FOC_PWM_Half_Period, FOC_PWM_Half_Period, FOC_PWM_Half_Period);
+	//pwm_update_sample(sp&0xFFFF, (sp>>16)&0xFFFF, _gFOC_Ctrl.out.n_Sector);
+	plot_3data16(_gFOC_Ctrl.in.s_iABC[0]>>5, _gFOC_Ctrl.in.s_iABC[1]>>5, _gFOC_Ctrl.in.s_iABC[2]>>5);
+	//plot_1data16(_gFOC_Ctrl.in.s_iABC[2]);
+}
+
+void PMSM_FOC_LogDebug(void) {
+	//sys_debug("Duty %d, %d, %d\n", _gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
+	//sys_debug("Vdq %f, %f-->%f, %f, %f\n", S16Q5toF(_gFOC_Ctrl.in.s_targetVdq.d), S16Q5toF(_gFOC_Ctrl.in.s_targetVdq.q), S16Q5toF(_gFOC_Ctrl.out.s_OutVdq.d), S16Q5toF(_gFOC_Ctrl.out.s_OutVdq.q), S16Q14toF(_gFOC_Ctrl.out.f_vdqRation));
+	sys_debug("iABC %f, %f, %f\n", S16Q5toF(_gFOC_Ctrl.in.s_iABC[0]), S16Q5toF(_gFOC_Ctrl.in.s_iABC[1]), S16Q5toF(_gFOC_Ctrl.in.s_iABC[2]));
+	//plot_1data16(_gFOC_Ctrl.in.s_iABC[0]);
+	//sys_debug("sample %d, %d\n", _gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2);
 }
 
 /*called in media task */

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

@@ -39,6 +39,8 @@ typedef struct {
 	u16   n_lowDuty;
 	u16   n_midDuty;
 	u8    n_Sector;
+	u16   n_Sample1;
+	u16   n_Sample2;
 	u8    n_RunMode;
 	DQ_t  s_OutVdq;
 	DQ_t  s_RealIdq;

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

@@ -5,7 +5,7 @@
 #include "foc/core/PMSM_FOC_Core.h"
 #include "libs/utils.h"
 #include "libs/logger.h"
-
+#include "math/fix_math.h"
 static current_samp_t g_cs;
 
 #define NB_OFFSET_SAMPLES 32
@@ -47,7 +47,7 @@ bool phase_current_offset(void) {
 	if (!g_cs.is_calibrating_offset) {
 		return false;
 	}
-	s32 phase_current1, phase_current2;
+	s32 phase_current1 = 0 , phase_current2 = 0;
 	adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
 	if (cs->offset_sample_count == (NB_OFFSET_SAMPLES + 1)) {
 		cs->offset_sample_count --;
@@ -83,20 +83,13 @@ bool phase_current_offset(void) {
 	return true;
 }
 
-
 #define LowPass_filter 1.0f
 void phase_current_get(s16 *iABC){
 	current_samp_t *cs = &g_cs;
 	s32 phase_current1, phase_current2;
-	phase_time_t *time = &cs->time;
+
 	adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
-	if (time->three_shunts_flags == 1) {
-		iABC[0] = cs->adc_ia;
-		iABC[1] = cs->adc_ib;
-		iABC[2] = cs->adc_ic;
-		time->three_shunts_flags = 0;
-		return; //use old current;
-	}
+
 	if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
 		/* Current on Phase C is not accessible */
 		/* Ia = PhaseAOffset - ADC converted value) */
@@ -116,9 +109,9 @@ void phase_current_get(s16 *iABC){
 		cs->adc_ic = (phase_current2 - cs->adc_offset_c);
 		cs->adc_ib = -(cs->adc_ia + cs->adc_ic);
 	}
-	iABC[0] = cs->adc_ia;
-	iABC[1] = cs->adc_ib;
-	iABC[2] = cs->adc_ic;
+	iABC[0] = S16Q5(cs->adc_ia*ADC_TO_CURR_ceof*3);
+	iABC[1] = S16Q5(cs->adc_ib*ADC_TO_CURR_ceof*3);
+	iABC[2] = S16Q5(cs->adc_ic*ADC_TO_CURR_ceof*3);
 }
 
 

+ 1 - 1
Applications/libs/logger.c

@@ -15,7 +15,7 @@ void plot_3data16(s16 v1, s16 v2, s16 v3) {
 	u8 data[6] = {0};
 	encode_s16(data, v1);
 	encode_s16(data + 2, v2);
-	encode_s16(data + 2, v3);
+	encode_s16(data + 4, v3);
 	shark_uart_write_frame(SHARK_UART0, data, sizeof(data));
 }
 

+ 4 - 1
Applications/libs/logger.h

@@ -36,6 +36,9 @@ extern void set_log_level(int mod, int l);
 extern void log_debug(int mod, char *fmt, ...);
 extern void log_warning(int mod, char *fmt, ...);
 extern void log_error(int mod, char *fmt, ...);
+void plot_3data16(s16 v1, s16 v2, s16 v3);
+void plot_2data16(s16 v1, s16 v2);
+void plot_1data16(s16 v1);
 
 /* logger functions */
 #define at_debug(fmt, args...) log_debug(MOD_4G_AT, "[AT:D]"fmt, ##args)
@@ -54,7 +57,7 @@ extern void log_error(int mod, char *fmt, ...);
 #define ble_warning(fmt, args...) log_warning(MOD_BLE, "[BLE:W]"fmt, ##args)
 #define ble_error(fmt, args...) log_error(MOD_BLE, fmt, "[BLE:E]"##args)
 
-#define sys_debug(fmt, args...) log_debug(MOD_SYSTEM, fmt, ##args)
+#define sys_debug(fmt, args...) log_debug(MOD_SYSTEM, "D"fmt, ##args)
 #define sys_warning(fmt, args...) log_warning(MOD_SYSTEM, fmt, ##args)
 #define sys_error(fmt, args...) log_error(MOD_SYSTEM, fmt, ##args)
 #endif /* _Shark_Logger_h__ */

+ 3 - 3
Applications/libs/utils.h

@@ -76,20 +76,20 @@ static __inline__ void encode_s08(u8 *buff, s8 value)
 
 static __inline__ void encode_s16(u8 *buff, s16 value)
 {
-	encode_s08(buff,value);
+	encode_s08(buff,value&0xFF);
 	encode_s08(buff+1,value >> 8);
 
 }
 
 static __inline__ void encode_s24(u8 *buff, s32 value)
 {
-	encode_s16(buff, value);
+	encode_s16(buff, value&0xFF);
 	encode_s08(buff+2,value >> 16);
 }
 
 static __inline__ void encode_s32(u8 *buff, s32 value)
 {
-	encode_s24(buff, value);
+	encode_s24(buff, value&0xFF);
 	encode_s08(buff+3,value >> 24);
 }
 

+ 38 - 4
Applications/math/fix_math.h

@@ -15,11 +15,22 @@ typedef int32_t   s32q19_t;
 
 //#define S16Q4(A) (signed short)((A) * 16.0F)
 #define S16Q5(A) (signed short)((A) * 32.0F)
+#define S16Q5toF(A) ((float)(A)/32.0f)
+
 #define S16Q10(A) (signed short)((A) * 1024.0F)
+#define S16Q10toF(A) ((float)(A)/1024.0f)
+
 #define S16Q14(A) (signed short)((A) * 16384.0F)
+#define S16Q14toF(A)  ((float)(A)/16384.0f)
+
 #define S32Q4(A) (signed int)((A) * 16.0F)
+#define S32Q4toF(A) ((float)(A)/16.0f)
+
 #define S32Q14(A) (signed int)((A) * 16384.0F)
+#define S32Q14toF(A) ((float)(A)/16384.0f)
+
 #define S32Q14_MUL(a, b) (((a)*(b)) >>14)
+
 #define S16_mul(a, b, q) (((u32)(a)*(b)) >> q) 
 /*
 static __INLINE float S16Q4toF(s16q4_t v) {
@@ -28,27 +39,50 @@ static __INLINE float S16Q4toF(s16q4_t v) {
 	float f = num + (float)tail / 16.0f;
 	return f;
 } 
-*/
+
 static __INLINE float S16Q5toF(s16q5_t v) {
-	s16 num = (v >> 5) & 0xFFFF;
+	s16 num = (v >> 5) & 0x3FF;
 	u16 tail = v & 0x001F;
 	float f = num + (float)tail / 32.0f;
+	if (v & 0x8000) {
+		return -f;
+	}	
 	return f;
 } 
 
+
 static __INLINE float S16Q10toF(s16q5_t v) {
-	s16 num = (v >> 10) & 0xFFFF;
+	s16 num = (v >> 10) & 0x1F;
 	u16 tail = v & 0x03FF;
 	float f = num + (float)tail / 1024.0f;
+	if (v & 0x8000) {
+		return -f;
+	}	
 	return f;
 }
 
+
+static __INLINE float S16Q14toF(s16q5_t v) {
+	s16 num = (v >> 14) & 0x1;
+	u16 tail = v & 0x03FFF;
+	float f = num + (float)tail / 16384.0f;
+	if (v & 0x8000) {
+		return -f;
+	}	
+	return f;
+}
+
+
 static __INLINE float S32Q4toF(s32q4_t v) {
-	s32 num = (v >> 4) & 0xFFFFFFFF;
+	s32 num = (v >> 4) & 0x7FFFFFF;
 	u16 tail = v & 0x000F;
 	float f = num + (float)tail / 16.0f;
+	if (v & 0x80000000) {
+		return -f;
+	}
 	return f;
 } 
+*/
 
 #define MATH_sat(in, minOut, maxOut) (min((in), MAX((in), (minOut))))
 

+ 53 - 41
Project/MC100.uvoptx

@@ -448,6 +448,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>19</FileNumber>
+      <FileType>4</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\math\arm_cortexM4lf_math.lib</PathWithFileName>
+      <FilenameWithoutPath>arm_cortexM4lf_math.lib</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -458,7 +470,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -470,7 +482,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -482,7 +494,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -494,7 +506,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -506,7 +518,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -518,7 +530,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -530,7 +542,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -542,7 +554,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -554,7 +566,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -566,7 +578,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -578,7 +590,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -590,7 +602,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -602,7 +614,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -614,7 +626,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -634,7 +646,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -646,7 +658,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -658,7 +670,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -670,7 +682,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -682,7 +694,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -694,7 +706,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -714,7 +726,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -726,7 +738,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -738,7 +750,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -758,7 +770,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -770,7 +782,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -782,7 +794,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -794,7 +806,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -806,7 +818,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -818,7 +830,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -830,7 +842,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -842,7 +854,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -854,7 +866,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -866,7 +878,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -878,7 +890,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -890,7 +902,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -902,7 +914,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -914,7 +926,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -926,7 +938,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -938,7 +950,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -958,7 +970,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -970,7 +982,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/MC100.uvprojx

@@ -493,6 +493,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\math\sin_table.c</FilePath>
             </File>
+            <File>
+              <FileName>arm_cortexM4lf_math.lib</FileName>
+              <FileType>4</FileType>
+              <FilePath>..\Applications\math\arm_cortexM4lf_math.lib</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>