Sfoglia il codice sorgente

1. 加入ladrc sensorless 观测器
2. 重新封装foc_observer,只处理sensorless
3. 给观测器的Valpha, Vbeta 需要乘2/3
4. 更新simulink模型,尝试16K的FOC控制频率(载波频率),32K的观测器频率,提高观测器的动态响应

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 3 anni fa
parent
commit
eff46e6644

+ 5 - 2
Applications/app/app.c

@@ -6,6 +6,7 @@
 #include "foc/motor/motor.h"
 #include "foc/motor/current.h"
 #include "foc/core/foc_observer.h"
+#include "foc/core/ladrc_observer.h"
 #include "foc/samples.h"
 #include "prot/can_foc_msg.h"
 #include "prot/can_message.h"
@@ -136,8 +137,10 @@ static u32 _app_report_task(void *p) {
 		//sys_debug("Vdq out %f, %f\n", PMSM_FOC_Get()->out.s_OutVdq.d, PMSM_FOC_Get()->out.s_OutVdq.q);
 		//sys_debug("target current %f\n", PMSM_FOC_Get()->in.s_targetCurrent);
 		//thro_torque_log();
+		sys_debug("_>%f, %f, %f\n", ladrc_observer_get()->ld, ladrc_observer_get()->lq, ladrc_observer_get()->poles);
+		sys_debug("> %f, %f\n", ladrc_observer_get()->Ealpha, ladrc_observer_get()->Ebeta);
 		encoder_log();
-		sample_log();
+		//sample_log();
 		///PMSM_FOC_LogDebug();
 		//eCtrl_debug_log();
 		//err_code_log();
@@ -155,7 +158,7 @@ static void plot_smo_angle(void) {
 }
 static u32 _app_plot_task(void * args) {
 	if (plot_type == 1) {
-		can_plot2((s16)PMSM_FOC_Get()->vel_lim_adrc.z1, (s16)PMSM_FOC_GetSpeed());
+		can_plot2((s16)foc_observer_sensorless_speed(), (s16)PMSM_FOC_GetSpeed());
 	}else if (plot_type == 2) {
 		can_plot2(eCtrl_get_RefTorque(), eCtrl_get_FinalTorque());
 	}else if (plot_type == 3) {

+ 1 - 1
Applications/bsp/gd32/uart.h

@@ -11,7 +11,7 @@
 #define CH_ESC_END						0x06
 #define CH_ESC_ESC						0x07
 
-#define SHARK_UART_TX_MEM_SIZE			(10 * 1024)
+#define SHARK_UART_TX_MEM_SIZE			(5 * 1024)
 #define SHARK_UART_RX_MEM_SIZE			512
 #define RX_FRAME_MAX_LEN 260
 #define RX_OLD_FRAME_MAX_LEN 256

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

@@ -252,14 +252,16 @@ static __INLINE void PMSM_FOC_Update_Input(void) {
 
 	Clark(iabc[0], iabc[1], iabc[2], &iAB);
 
+	foc_observer_update(gFoc_Ctrl.out.s_OutVAB.a * 0.66667f, gFoc_Ctrl.out.s_OutVAB.b * 0.66667f, iAB.a, iAB.b);
+
 	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 = foc_observer_update(gFoc_Ctrl.out.s_OutVAB.a, gFoc_Ctrl.out.s_OutVAB.b, iAB.a * 0.66667f, iAB.b * 0.66667f);
+		gFoc_Ctrl.in.s_hallAngle = motor_encoder_get_angle();
 		gFoc_Ctrl.in.s_motAngle = gFoc_Ctrl.in.s_hallAngle;
 	}
-	gFoc_Ctrl.in.s_motRPM = foc_observer_speed();
+	gFoc_Ctrl.in.s_motRPM = motor_encoder_get_speed();
 	LowPass_Filter(gFoc_Ctrl.in.s_motRPMFilted, gFoc_Ctrl.in.s_motRPM, 0.005f);
 	gFoc_Ctrl.in.s_motVelDegreePers = gFoc_Ctrl.in.s_motRPM / 30.0f * PI * gFoc_Ctrl.params.n_poles;
 #ifdef CONFIG_DQ_STEP_RESPONSE
@@ -331,6 +333,7 @@ void PMSM_FOC_Schedule(void) {
 	gFoc_Ctrl.ctrl_count++;
 
 	PMSM_FOC_Update_Input();
+	
 	if (gFoc_Ctrl.out.n_RunMode != CTRL_MODE_OPEN) {
 
 		float max_Vdc = gFoc_Ctrl.in.s_vDC * CONFIG_SVM_MODULATION;

+ 1 - 51
Applications/foc/core/foc_observer.c

@@ -27,40 +27,7 @@ void foc_observer_init(void) {
 
 #define RPM_2_degree(rpm)  ((rpm) * 60.0f * nv_get_motor_params()->poles * FOC_CTRL_US)
 
-#if 1
 float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
-	float prev_enc_angle = foc_obser.enc_angle;
-	float prev_enc_speed = foc_obser.enc_speed;
-	foc_obser.enc_angle = motor_encoder_get_angle();
-	foc_obser.enc_speed = motor_encoder_get_speed();
-
-	if (!foc_obser.is_sensorless_enable) {
-		return foc_obser.enc_angle;
-	}
-	float est_enc_delta = RPM_2_degree(prev_enc_speed);
-	float real_enc_delta = foc_obser.enc_angle - prev_enc_angle;
-	if (real_enc_delta < 0) {
-		real_enc_delta += 360.0f;
-	}
-	float est_ration = real_enc_delta/est_enc_delta;
-	if (est_ration >= 1.5f || est_ration <= 0.5f) {
-		foc_obser.fusion_ceof -= 0.1f;
-		if (foc_obser.fusion_ceof < 0.0f) {
-			foc_obser.fusion_ceof = 0.0f;
-		}
-		if (foc_obser.enc_est_angle == INVALID_ANGLE) {
-			foc_obser.enc_est_angle = prev_enc_angle;
-		}else {
-			foc_obser.enc_est_angle += est_enc_delta;
-			rand_angle(foc_obser.enc_est_angle);
-		}
-	}else {
-		foc_obser.fusion_ceof += 0.1f;
-		if (foc_obser.fusion_ceof > 1.0f) {
-			foc_obser.fusion_ceof = 1.0f;
-		}
-		foc_obser.enc_est_angle = foc_obser.enc_angle;
-	}
 	foc_obser.sensorless_est_angle = foc_obser.sensorless_angle + RPM_2_degree(foc_obser.sensorless_speed);
 #ifdef CONFIG_SMO_OBSERVER
 	foc_obser.sensorless_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta);
@@ -72,31 +39,14 @@ float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
 	if (foc_obser.is_sensorless_running) {
 		return foc_obser.sensorless_angle;
 	}
-#if 0
-	return (foc_obser.enc_est_angle * foc_obser.fusion_ceof + foc_obser.smo_angle * (1.0f - foc_obser.fusion_ceof));
-#else
-	return foc_obser.enc_angle;
-#endif
-}
 
-float foc_observer_speed(void) {
-	if (foc_obser.is_sensorless_running) {
-		return foc_obser.sensorless_speed;
-	}
-	return foc_obser.enc_speed;
-}
-#else
-float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
-	foc_obser.enc_angle = motor_encoder_get_angle();
-	foc_obser.enc_speed = motor_encoder_get_speed();
 	return foc_obser.enc_angle;
 }
 
 float foc_observer_speed(void) {
-	return foc_obser.enc_speed;
+	return foc_obser.sensorless_speed;
 }
 
-#endif
 bool  foc_observer_is_encoder(void) {
 	return !foc_obser.is_sensorless_running;
 }

+ 42 - 9
Applications/foc/core/ladrc_observer.c

@@ -3,6 +3,7 @@
 #include "math/fast_math.h"
 
 static ladrc_observer observer;
+
 #define angle_clamp(a) {while (a >= M_PI*2) a-=M_PI*2;while (a < 0) a +=M_PI*2;};
 
 static __inline float ladrc_observer_band(float vel) {
@@ -25,10 +26,22 @@ void ladrc_observer_init(float Wo, float vel_min, float lpf_cut_off) {
 	observer.lq = nv_get_motor_params()->lq;
 	observer.r = nv_get_motor_params()->r;
 	observer.poles = nv_get_motor_params()->poles;
+	observer.max_z1 = 500;
+	observer.max_z2 = 500 / observer.ld;
+	observer.Vel_El = 0;
+	observer.alpha.z1 = 0;
+	observer.alpha.z2 = 0;
+	observer.beta.z1 = 0;
+	observer.beta.z2 = 0;
+	observer.Ealpha = 0;
+	observer.Ebeta = 0;
+	observer.angle_idx = 0;
+	observer.angle_last = 0;
+	observer.angle_sum = 0;
 	ladrc_observer_band(0);
 }
 
-void ladrc_observer_update(float va, float vb, float ia, float ib) {
+float ladrc_observer_update(float va, float vb, float ia, float ib) {
 	float induct = observer.Vel_El * (observer.ld - observer.lq) / observer.ld;
 	/* update Wc for current est vel */
 	float Wo = ladrc_observer_band(observer.Vel_El);
@@ -36,29 +49,41 @@ void ladrc_observer_update(float va, float vb, float ia, float ib) {
 	float F0 = -observer.r/observer.ld * ia;
 	float e = observer.alpha.z1 - ia;
 
-	observer.alpha.z2 += (-e * observer.B2);
-	observer.alpha.z1 += (observer.alpha.z2 + F0 + va/observer.ld + e * observer.B1 * observer.Vel_El - induct * observer.beta.z1);
+	float alpha_z1 = observer.alpha.z1;
+	observer.alpha.z2 += (-e * observer.B2) * observer.ts;
+	observer.alpha.z2 = fclamp(observer.alpha.z2, -observer.max_z2, -observer.max_z2);
+	observer.alpha.z1 += (observer.alpha.z2 + F0 + va/observer.ld - e * observer.B1 - induct * observer.beta.z1) * observer.ts;
+	observer.alpha.z1 = fclamp(observer.alpha.z1, -observer.max_z1, -observer.max_z1);
+
 	observer.Ealpha = observer.alpha.z2 * (-observer.ld);
 
 	/* est beta emf */
 	F0 = -observer.r/observer.ld * ib;
 	e = observer.beta.z1 - ib;
 
-	observer.beta.z2 += (-e * observer.B2);
-	observer.beta.z1 += (observer.beta.z2 + F0 + va/observer.ld - e * observer.B1 * observer.Vel_El + induct * observer.alpha.z1);
+	observer.beta.z2 += (-e * observer.B2) * observer.ts;
+	observer.beta.z2 = fclamp(observer.beta.z2, -observer.max_z2, -observer.max_z2);
+	observer.beta.z1 += (observer.beta.z2 + F0 + vb/observer.ld - e * observer.B1 + induct * alpha_z1) * observer.ts;
+	observer.beta.z1 = fclamp(observer.beta.z1, -observer.max_z1, -observer.max_z1);
+	
 	observer.Ebeta = observer.beta.z2 * (-observer.ld);
 
 	float angle = fast_atan_2(-observer.Ealpha, observer.Ebeta);
-	/* 补偿ladrc相位延时, 同时电流和电压滞后一个控制周期,需要通过当前的电角速度对计算的角度进行补偿 */
-	float angle_comp = fast_atan_2(observer.Vel_El * Wo, SQ(Wo) - SQ(observer.Vel_El)) + observer.Vel_El * observer.ts;
-	angle += angle_comp;
+	UTILS_NAN_ZERO(angle);
+	/* 补偿ladrc相位延时 */
+	float angle_comp = fast_atan_2(observer.Vel_El * Wo, SQ(Wo) - SQ(observer.Vel_El));
+	UTILS_NAN_ZERO(angle_comp);
+	/* 电流和电压滞后一个控制周期,需要通过当前的电角速度对计算的角度进行补偿 */
+	angle += (angle_comp + observer.Vel_El * observer.ts);
 	angle_clamp(angle);
+
+	/* 速度计算 */
 	float delta_angle = angle - observer.angle_last;
 	float delta_angle_abs = ABS(delta_angle);
 	if (delta_angle_abs >= M_PI) {
 		delta_angle = 2 * M_PI - delta_angle_abs;
 	}
-	observer.angle_sum += angle;
+	observer.angle_sum += delta_angle;
 	observer.angle_sum -= observer.angle_array[observer.angle_idx];
 
 	observer.angle_array[observer.angle_idx++] = delta_angle;
@@ -68,6 +93,9 @@ void ladrc_observer_update(float va, float vb, float ia, float ib) {
  	float vel = observer.angle_sum / (ANGLE_BUF_NUM * observer.ts);
 	LowPass_Filter(observer.Vel_El, vel, (observer.lpf_cutoff_freq * observer.ts));
 	observer.angle_last = angle;
+
+	return angle;
+
 }
 
 float ladrc_observer_angle(void) {
@@ -77,3 +105,8 @@ float ladrc_observer_angle(void) {
 float ladrc_observer_vel(void) {
 	return (observer.Vel_El * (30.0f / M_PI) / observer.poles);
 }
+
+ladrc_observer *ladrc_observer_get(void) {
+	return &observer;
+}
+

+ 4 - 1
Applications/foc/core/ladrc_observer.h

@@ -20,11 +20,14 @@ typedef struct {
 	float angle_array[ANGLE_BUF_NUM];
 	int   angle_idx;
 	float angle_sum;
+	float max_z1, max_z2;
 }ladrc_observer;
 
 void ladrc_observer_init(float Wo, float vel_min, float lpf_cut_off);
-void ladrc_observer_update(float va, float vb, float ia, float ib);
+float ladrc_observer_update(float va, float vb, float ia, float ib);
 float ladrc_observer_angle(void);
 float ladrc_observer_vel(void);
+ladrc_observer *ladrc_observer_get(void);
+
 #endif /* _LADRC_OBSERVER_H__ */
 

+ 1 - 0
Applications/foc/core/smo_observer.c

@@ -91,6 +91,7 @@ static void smo_arctan(void) {
 	float ebeta_in  =  smo.est_eBeta_Filted;
 
 	float angle = fast_atan_2(ealpha_in, ebeta_in); //通过反正切获取电角度
+	UTILS_NAN_ZERO(angle);
 	angle_clamp(angle);
 	float prev_angle = smo.est_angle;
 	float comp_angle = 0.0f;

+ 67 - 55
Project/MC105_V3.uvoptx

@@ -435,6 +435,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>17</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\foc\core\ladrc_observer.c</PathWithFileName>
+      <FilenameWithoutPath>ladrc_observer.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -445,7 +457,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -457,7 +469,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -469,7 +481,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -481,7 +493,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -493,7 +505,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -513,7 +525,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -525,7 +537,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -537,7 +549,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +561,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +581,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +593,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +605,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +617,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -625,7 +637,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -637,7 +649,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -649,7 +661,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -661,7 +673,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -673,7 +685,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -685,7 +697,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -697,7 +709,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -709,7 +721,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -721,7 +733,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -733,7 +745,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -745,7 +757,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -757,7 +769,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -769,7 +781,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -781,7 +793,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -801,7 +813,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -813,7 +825,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -825,7 +837,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -837,7 +849,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -849,7 +861,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -861,7 +873,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -881,7 +893,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -893,7 +905,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -905,7 +917,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -925,7 +937,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -937,7 +949,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -949,7 +961,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -961,7 +973,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -973,7 +985,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -985,7 +997,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -997,7 +1009,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1009,7 +1021,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1021,7 +1033,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1033,7 +1045,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1045,7 +1057,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1057,7 +1069,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1081,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <FileNumber>66</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1081,7 +1093,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1093,7 +1105,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <FileNumber>68</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1105,7 +1117,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>68</FileNumber>
+      <FileNumber>69</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,7 +1137,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>69</FileNumber>
+      <FileNumber>70</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1149,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>70</FileNumber>
+      <FileNumber>71</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1149,7 +1161,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>71</FileNumber>
+      <FileNumber>72</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/MC105_V3.uvprojx

@@ -468,6 +468,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\foc\core\thro_torque.c</FilePath>
             </File>
+            <File>
+              <FileName>ladrc_observer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Applications\foc\core\ladrc_observer.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

BIN
Simulink/FOC_smo.slx


BIN
Simulink/FOC_smo.slx.autosave