Jelajahi Sumber

编码器和无感都封装到foc_observer.c 中

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 tahun lalu
induk
melakukan
66a0250b9c

+ 21 - 19
Applications/app/app.c

@@ -5,7 +5,7 @@
 #include "libs/utils.h"
 #include "foc/motor/motor.h"
 #include "foc/motor/current.h"
-#include "foc/core/smo_observer.h"
+#include "foc/core/foc_observer.h"
 #include "foc/samples.h"
 #include "prot/can_foc_msg.h"
 #include "prot/can_message.h"
@@ -111,26 +111,28 @@ static u32 _app_report_task(void *p) {
 	}
 	return 200;
 }
-//static bool _mc_start = false;
-//static float _angle = 0.0f;
-static u32 _app_plot_task(void * args) {
-	//can_report_plot_values(0x45);
-	//can_plot3(PMSM_FOC_Get()->out.n_Duty[0], PMSM_FOC_Get()->out.n_Duty[1], PMSM_FOC_Get()->out.n_Duty[2]);
-	//can_plot2(PMSM_FOC_Get()->rtLim.rpmLimRamp.interpolation, PMSM_FOC_GetSpeed());
-	can_plot2(eCtrl_get_RefTorque() * 50.0f, PMSM_FOC_GetSpeed());
-	//can_plot2(PMSM_FOC_Get()->in.s_iABC[1], PMSM_FOC_Get()->in.s_iABC[2]);
-#if 0
-	if (!_mc_start) {
-		_mc_start = true;
-		mc_start(CTRL_MODE_OPEN);
-		PMSM_FOC_SetOpenVdq(0, 60);
+static int plot_type = 3;
+static void plot_smo_angle(void) {
+	float smo_angle = foc_observer_smo_angle();
+	float delta = smo_angle - PMSM_FOC_Get()->in.s_hallAngle;
+	if (delta > 180) {
+		delta -= 360;
+	}else if (delta < -180) {
+		delta += 360;
 	}
-	_angle++;
-	if (_angle >= 360.0f) {
-		_angle = 0.0f;
+	can_plot3(PMSM_FOC_Get()->in.s_hallAngle, smo_angle, delta);
+
+}
+static u32 _app_plot_task(void * args) {
+	if (plot_type == 1) {
+		can_plot2(PMSM_FOC_Get()->rtLim.rpmLimRamp.interpolation, PMSM_FOC_GetSpeed());
+	}else if (plot_type == 2) {
+		can_plot2(eCtrl_get_RefTorque(), PMSM_FOC_Get_Real_Torque());
+	}else if (plot_type == 3) {
+		//can_plot2(PMSM_FOC_GetSpeed(), foc_observer_smo_speed());
+		plot_smo_angle();
 	}
-	PMSM_FOC_Set_Angle(_angle);
-#endif
+	
 	return 20;
 }
 static u32 _app_low_task(void *args) {

+ 1 - 1
Applications/bsp/board_mc100_v1.h

@@ -30,7 +30,7 @@
 
 #define CONFIG_CURR_LP_CEOF (CONFIG_CURR_LP_WC*2*3.14F/(float)FOC_PWM_FS)
 
-#define CONFIG_96V_MODE_VOL (55.0F)
+#define CONFIG_96V_MODE_VOL (60.0F)
 
 #define CONFIG_SMO_OBSERVER 1
 

+ 11 - 0
Applications/foc/commands.c

@@ -10,6 +10,7 @@
 #include "foc/commands.h"
 #include "prot/can_foc_msg.h"
 #include "app/nv_storage.h"
+#include "foc/core/foc_observer.h"
 
 #ifdef CONFIG_DQ_STEP_RESPONSE
 extern float target_d;
@@ -428,6 +429,16 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		{
 			break;
 		}
+		case Foc_Use_SensorLess_Angle:
+		{
+			bool sensorless = decode_u8((u8 *)command->data)?true:false;
+			if (sensorless && mc_is_start() && PMSM_FOC_GetSpeed() >= CONFIG_SMO_MIN_SPEED) {
+				foc_observer_use_smo(sensorless);
+			}else {
+				foc_observer_use_smo(false);
+			}
+			break;
+		}
 		default:
 		{
 			erroCode = FOC_Unknow_Cmd;

+ 1 - 0
Applications/foc/commands.h

@@ -32,6 +32,7 @@ typedef enum {
 	Foc_Fan_Duty, //57
 	Foc_Get_Gear_Limit,
 	Foc_Set_Thro_Ration,
+	Foc_Use_SensorLess_Angle,
 	Foc_Hall_Phase_Cali_Result = 160,
 	Foc_Hall_Offset_Cali_Result,
 	Foc_Report_Speed,

+ 15 - 15
Applications/foc/core/PMSM_FOC_Core.c

@@ -8,7 +8,7 @@
 #include "foc/motor/motor.h"
 #include "foc/core/svpwm.h"
 #include "foc/core/torque.h"
-#include "foc/core/smo_observer.h"
+#include "foc/core/foc_observer.h"
 #include "foc/samples.h"
 #include "foc/limit.h"
 #include "app/nv_storage.h"
@@ -233,9 +233,8 @@ void PMSM_FOC_CoreInit(void) {
 	FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[1], (CONFIG_IDQ_CTRL_TS/CONFIG_FOC_VDQ_RAMP_TS));	
 	PMSM_FOC_Reset_PID();
 
-#ifdef CONFIG_SMO_OBSERVER
-	smo_observer_init(CONFIG_SMO_PLL_BANDWITH, CONFIG_SMO_LFP_WC, CONFIG_SMO_GAIN_K, CONFIG_SMO_SIGMOID_MAX);
-#endif
+	foc_observer_init();
+
 	gFoc_Ctrl.plot_type = Plot_None;
 }
 
@@ -247,28 +246,28 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
 #endif
 	float *iabc = gFoc_Ctrl.in.s_iABC;
 
+	phase_current_get(gFoc_Ctrl.in.s_iABC);
+
+	Clark(iabc[0], iabc[1], iabc[2], &iAB);
+
 	if (!gFoc_Ctrl.in.b_MTPA_calibrate && (gFoc_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
 		gFoc_Ctrl.in.s_motAngle = gFoc_Ctrl.in.s_manualAngle;
 		gFoc_Ctrl.in.s_hallAngle = motor_encoder_get_angle();
 	}else {
-		gFoc_Ctrl.in.s_hallAngle = motor_encoder_get_angle();
+		gFoc_Ctrl.in.s_hallAngle = foc_observer_update(gFoc_Ctrl.out.s_OutVAB.a, gFoc_Ctrl.out.s_OutVAB.b, iAB.a, iAB.b);
 		gFoc_Ctrl.in.s_motAngle = gFoc_Ctrl.in.s_hallAngle;
 	}
+	gFoc_Ctrl.in.s_motRPM = foc_observer_speed();
+
 #ifdef CONFIG_DQ_STEP_RESPONSE
 	gFoc_Ctrl.in.s_hallAngle = 0;
 	gFoc_Ctrl.in.s_motAngle = 0;
 #endif
-	gFoc_Ctrl.in.s_motRPM = motor_encoder_get_speed();
+
 	gFoc_Ctrl.in.s_vDC = get_vbus_int();
-	//sample current
-	phase_current_get(gFoc_Ctrl.in.s_iABC);
+	
 	get_phase_vols(gFoc_Ctrl.in.s_vABC);
 	
-	Clark(iabc[0], iabc[1], iabc[2], &iAB);
-#ifdef CONFIG_SMO_OBSERVER
-	gFoc_Ctrl.in.s_smoAngle = smo_observer_update(gFoc_Ctrl.out.s_OutVAB.a, gFoc_Ctrl.out.s_OutVAB.b, iAB.a, iAB.b);
-#endif
-
 #ifdef CONFIG_USER_PHASE_LFP
 	float e_freq = gFoc_Ctrl.in.s_motRPM / 60.0f * gFoc_Ctrl.params.n_poles;
 	float lpf_wc;
@@ -401,13 +400,14 @@ void PMSM_FOC_Schedule(void) {
 				plot_3data16(FtoS16(gFoc_Ctrl.in.s_vABC[0]), FtoS16(gFoc_Ctrl.in.s_vABC[1]), FtoS16(gFoc_Ctrl.in.s_vABC[2]));
 			}else if (gFoc_Ctrl.plot_type == Plot_SMO_OBS) {
 #ifdef CONFIG_SMO_OBSERVER
-				float delta = gFoc_Ctrl.in.s_smoAngle - gFoc_Ctrl.in.s_hallAngle;
+				float smo_angle = foc_observer_smo_angle();
+				float delta = smo_angle - gFoc_Ctrl.in.s_hallAngle;
 				if (delta > 180) {
 					delta -= 360;
 				}else if (delta < -180) {
 					delta += 360;
 				}
-				plot_3data16(gFoc_Ctrl.in.s_hallAngle, gFoc_Ctrl.in.s_smoAngle, delta);
+				plot_3data16(gFoc_Ctrl.in.s_hallAngle, smo_angle, delta);
 #endif
 			}
 		}

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

@@ -83,7 +83,6 @@ typedef struct {
 	float   s_motRPM;   //from hall or encoder
 	float 	s_motAngle; //from hall or encoder
 	float 	s_hallAngle;//from hall or encoder
-	float   s_smoAngle;
 	float   s_targetRPM;
 	float   s_cruiseRPM;
 	e_Ramp  cruiseRpmRamp;

+ 57 - 0
Applications/foc/core/foc_observer.c

@@ -0,0 +1,57 @@
+#include "bsp/bsp.h"
+#include "foc/core/foc_observer.h"
+#include "foc/core/smo_observer.h"
+#include "foc/motor/motor.h"
+
+static foc_observer_t foc_obser;
+void foc_observer_init(void) {
+	foc_obser.smo_enabled = false;
+	foc_obser.smo_used = false;
+#ifdef CONFIG_SMO_OBSERVER
+	smo_observer_init(CONFIG_SMO_PLL_BANDWITH, CONFIG_SMO_LFP_WC, CONFIG_SMO_GAIN_K, CONFIG_SMO_SIGMOID_MAX);
+	foc_obser.smo_enabled = true;
+#endif
+}
+float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
+	if (foc_obser.smo_enabled) {
+		foc_obser.smo_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta);
+		foc_obser.smo_speed = smo_observer_est_rpm();
+	}
+	foc_obser.enc_angle = motor_encoder_get_angle();
+	foc_obser.enc_speed = motor_encoder_get_speed();
+	
+	if (foc_obser.smo_used) {
+		return foc_obser.smo_angle;
+	}
+	return foc_obser.enc_angle;
+}
+
+float foc_observer_speed(void) {
+	if (foc_obser.smo_used) {
+		return foc_obser.smo_speed;
+	}
+	return foc_obser.enc_speed;
+}
+
+bool  foc_observer_is_encoder(void) {
+	return !foc_obser.smo_used;
+}
+void  foc_observer_use_smo(bool use_smo) {
+	if (foc_obser.smo_enabled) {
+		foc_obser.smo_used = use_smo;
+	}else {
+		foc_obser.smo_used = false;
+	}
+}
+void  foc_observer_enable_smo(bool enable) {
+	foc_obser.smo_enabled = enable;
+}
+
+float foc_observer_smo_angle(void) {
+	return foc_obser.smo_angle;
+}
+
+float foc_observer_smo_speed(void) {
+	return foc_obser.smo_speed;
+}
+

+ 26 - 0
Applications/foc/core/foc_observer.h

@@ -0,0 +1,26 @@
+#ifndef _FOC_OBSERVER_H__
+#define _FOC_OBSERVER_H__
+#include "os/os_types.h"
+/*
+处理编码器和角度观测器的电角度融合,主要是判断编码器是否异常,切换到角度观测器
+*/
+typedef struct {
+	float enc_angle;
+	float enc_speed;
+	float enc_est_angle; //通过encoder速度,估计当前角度
+	float smo_angle;
+	float smo_speed;
+	float smo_est_angle; //通过smo速度,估计当前角度
+	bool  smo_enabled;
+	bool  smo_used;
+}foc_observer_t;
+void foc_observer_init(void);
+float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta);
+float foc_observer_speed(void);
+bool  foc_observer_is_encoder(void);
+void  foc_observer_use_smo(bool use_smo);
+void  foc_observer_enable_smo(bool enable);
+float foc_observer_smo_angle(void);
+float foc_observer_smo_speed(void);
+#endif /*_FOC_OBSERVER_H__*/
+

+ 8 - 6
Applications/foc/core/torque.c

@@ -60,9 +60,9 @@ static float throttle_ration(float f_throttle) {
 	}
 	float delta = f_throttle - (nv_get_foc_params()->n_minThroVol);
 
-	int ration = (delta * 1000.0f) / (nv_get_foc_params()->n_maxThroVol - nv_get_foc_params()->n_minThroVol);
+	int ration = (delta * 100.0f) / (nv_get_foc_params()->n_maxThroVol - nv_get_foc_params()->n_minThroVol);
 	
-	return ((float)ration)/1000.0f;
+	return ((float)ration)/100.0f;
 }
 
 float throttle_to_speed(float f_throttle) {
@@ -88,7 +88,6 @@ void request_torque(float thro_ration) {
 	float max_trq = min(trq_map, trq_lim);
 	float ref_trq = max_trq * thro_ration;
 	if ((mc_throttle_released()) && eCtrl_enable_eBrake(true)) {
-		g_trq_mn.thro_ration = 0;
 		return;
 	}
 	
@@ -102,7 +101,6 @@ void request_torque(float thro_ration) {
 		float ref_now = min(real_trq, eCtrl_get_RefTorque());
 		eCtrl_reset_Torque(ref_now);
 		PMSM_FOC_Set_Torque(0);
-		g_trq_mn.thro_ration = 0;
 	}
 }
 
@@ -114,8 +112,12 @@ void request_speed(float thro_ration) {
 #define THRO_REF_LP_CEOF 0.2f
 
 void throttle_process(u8 run_mode, float f_throttle) {
-	float thro_value = throttle_ration(f_throttle);
-	g_trq_mn.thro_ration = LowPass_Filter(g_trq_mn.thro_ration, thro_value, THRO_REF_LP_CEOF);
+	if (mc_throttle_released()){
+		g_trq_mn.throttle_value = 0;
+	}else {
+		LowPass_Filter(g_trq_mn.throttle_value, f_throttle, THRO_REF_LP_CEOF);
+	}
+	g_trq_mn.thro_ration = throttle_ration(f_throttle);
 
 	if (run_mode == CTRL_MODE_TRQ) {
 		request_torque(g_trq_mn.thro_ration);

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

@@ -4,6 +4,7 @@
 #include "foc/core/PMSM_FOC_Core.h"
 typedef struct {
 	bool  accl;
+	float throttle_value;
 	float thro_ration; //油门开度百分比
 	float spd_filted;
 	u32   count;

+ 2 - 2
Applications/foc/foc_config.h

@@ -50,14 +50,14 @@
 
 #define CONFIG_RAMP_CROSS_ZERO_STEP (0.1F)
 
-#define CURRENT_LOOP_RAMP_COUNT 1
+#define CURRENT_LOOP_RAMP_COUNT 15 //1ms 完成ramp给定
 
 #define CONFIG_TORQUE_MODE_MIN_RPM 600
 
 #define CONFIG_MAX_NEG_CURRENT 2.0F
 
 #ifdef CONFIG_SMO_OBSERVER
-	#define CONFIG_SMO_MIN_SPEED    500 //RPM
+	#define CONFIG_SMO_MIN_SPEED    1000 //RPM
 	//#define CONFIG_SMO_PLL_BANDWITH 2000.0f //计算角度和速度的pll
 	#define CONFIG_SMO_PLL_BANDWITH 100.0f //计算速度的pll
 	#define CONFIG_SMO_LFP_WC       100.0F

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

@@ -751,6 +751,11 @@ static bool mc_can_stop_foc(void) {
 	}
 	return false;
 }
+
+static bool mc_can_restart_foc(void) {
+	return (!PMSM_FOC_Is_Start()) && (!mc_throttle_released());
+}
+
 #endif
 
 static bool mc_run_stall_process(u8 run_mode) {
@@ -878,7 +883,7 @@ void Sched_MC_mTask(void) {
 					cpu_exit_critical(mask);
 				}
 			}
-			if (!PMSM_FOC_Is_Start() && (!mc_throttle_released())) {
+			if (mc_can_restart_foc()) {
 				mask = cpu_enter_critical();
 				PMSM_FOC_Start(motor.mode);
 				mc_gear_vmode_changed();

+ 70 - 58
Project/MC100.uvoptx

@@ -374,6 +374,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>14</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\foc\core\foc_observer.c</PathWithFileName>
+      <FilenameWithoutPath>foc_observer.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -384,7 +396,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -396,7 +408,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -408,7 +420,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -420,7 +432,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -432,7 +444,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -444,7 +456,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -464,7 +476,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -476,7 +488,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -488,7 +500,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -500,7 +512,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -520,7 +532,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -532,7 +544,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -544,7 +556,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -556,7 +568,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -576,7 +588,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -588,7 +600,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -600,7 +612,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -612,7 +624,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -624,7 +636,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -636,7 +648,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -648,7 +660,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -660,7 +672,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -672,7 +684,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -684,7 +696,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -696,7 +708,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -708,7 +720,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -720,7 +732,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -732,7 +744,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -744,7 +756,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -756,7 +768,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -768,7 +780,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -788,7 +800,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -800,7 +812,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -812,7 +824,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -824,7 +836,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -836,7 +848,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -848,7 +860,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -868,7 +880,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -880,7 +892,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -892,7 +904,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -912,7 +924,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -924,7 +936,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -936,7 +948,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -948,7 +960,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -960,7 +972,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -972,7 +984,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -984,7 +996,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -996,7 +1008,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1008,7 +1020,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1020,7 +1032,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1032,7 +1044,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1044,7 +1056,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <FileNumber>66</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1056,7 +1068,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1068,7 +1080,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <FileNumber>68</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1080,7 +1092,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>68</FileNumber>
+      <FileNumber>69</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1092,7 +1104,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>69</FileNumber>
+      <FileNumber>70</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1112,7 +1124,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>70</FileNumber>
+      <FileNumber>71</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1124,7 +1136,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>71</FileNumber>
+      <FileNumber>72</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/MC100.uvprojx

@@ -453,6 +453,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\foc\core\smo_observer.c</FilePath>
             </File>
+            <File>
+              <FileName>foc_observer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Applications\foc\core\foc_observer.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>