Forráskód Böngészése

docs:参数配置

1.添加驱动板参数
2.添加电机参数
3.调整电机状态机代码
Comment.Vivre 1 éve
szülő
commit
4edad75345

+ 1 - 181
KeilC51/Fortior.uvopt

@@ -145,188 +145,8 @@
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.UqFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>1</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.UdFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>2</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.SpeedFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>3</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.Ref,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>4</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcState</ItemText>
-        </Ww>
-        <Ww>
-          <count>5</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFaultSource</ItemText>
-        </Ww>
-        <Ww>
-          <count>6</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>VoltageComp,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>7</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.mcDcbusFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>8</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS.KeyADCValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>9</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>10</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcPwmInput,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>11</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.PowerFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>12</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>fault.Stall.Type,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>13</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>fault.Stall.EsValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>14</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>fault.Stall.Mode0DectCnt</ItemText>
-        </Ww>
-        <Ww>
-          <count>15</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>fault.Stall.DectDealyCnt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>16</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.NTCValueFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>17</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS.KeyADCValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>18</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>VoltageComp.AverageVoltageValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>19</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>VoltageComp.AverageVoltageValue1,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>20</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>VoltageComp.mcDcbusFlt2Sum</ItemText>
-        </Ww>
-        <Ww>
-          <count>21</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.NTCValueFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>22</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS.KeyADCValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>23</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS.KeyValuetotal,0x10</ItemText>
-        </Ww>
-        <Ww>
-          <count>24</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS.KeyADCValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>25</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>Type</ItemText>
-        </Ww>
-        <Ww>
-          <count>26</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>fault,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>27</count>
-          <WinNumber>1</WinNumber>
           <ItemText>mcFocCtrl,0x0A</ItemText>
         </Ww>
-        <Ww>
-          <count>28</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>KS.KeyADCValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>29</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.NTCValueFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>30</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>VoltageComp,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>31</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.Ref,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>32</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>fault.Stall.EsValue,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>33</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.EMFsquare,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>34</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.PowerFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>35</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.NTCValueFlt,0x0A</ItemText>
-        </Ww>
-        <Ww>
-          <count>36</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mcFocCtrl.mcDcbusFlt,0x0A</ItemText>
-        </Ww>
       </WatchWindow1>
       <WatchWindow2>
         <Ww>
@@ -346,7 +166,7 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>0</periodic>
-        <aLwin>0</aLwin>
+        <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>

+ 91 - 138
User/Include/Customer.h

@@ -1,57 +1,54 @@
 /**
- * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
+ * @copyright None
  * @file      Customer.h
- * @author    Fortiortech  Appliction Team
- * @note      Last modify author is Marcel He
- * @since     2019-05-17
- * @date      2022-07-14
- * @brief     This file contains customer parameter used for Motor Control.  
+ * @author    Comment Vivre
+ * @date      2024-08-26
+ * @brief     基本参数配置
  */
- 
-/* Define to prevent recursive inclusion -------------------------------------------------------- */
 #ifndef __CUSTOMER_H_
 #define __CUSTOMER_H_
- /**********************基础参数*****************************
- 1. 芯片参数
- 2. 电机参数
- 3. 电流采样参数
- 4. 母线电压采样参数
-  **************************************************************/
-  
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                             1.芯片参数                                                 
----------------------------------------------------------------------------------------------------------------------------- */
+
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 驱动参数
+*/
 #define PWM_FREQUENCY                  (16.0)                                   ///< (kHz) 载波频率
 #define PWM_DEADTIME                   (1.2)                                    ///< (us) 死区时间
 #define MIN_WIND_TIME                  (2.6)                     ///< (us) 单电阻最小采样窗口,建议值死区时间+0.9us
 #define DLL_TIME                       (PWM_DEADTIME + 0.3)                     ///< (us) 双电阻最小脉宽设置, 建议值为死区时间值+0.2us以上
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                             2.电机参数                                                 
----------------------------------------------------------------------------------------------------------------------------- */
-#define Pole_Pairs                      (4.0)                  ///< 极对数
-#define LD                              (0.07*1.0)          ///< (H) D轴电感
-#define LQ                              (0.07*1.0)          ///< (H) Q轴电感
-#define RS                              (45.15)             ///< (Ω) 相电阻
-#define Ke                              (32.6)                  ///< (V/KRPM) 反电动势常数,选择AO观测器不需要Ke
-#define MOTOR_SPEED_BASE                (3000.0)             ///< (RPM) 速度基准
-
-//// 若选择AO自适应观测器 则无需填写Ke
-//#define KeVpp                          (1.832)                                 ///< (V)      反电动势测量的峰峰值
-//#define KeT                            (68.40)                                 ///< (ms)     反电动势测量的周期
-//#define Ke                             (Pole_Pairs * KeVpp * KeT / 207.84)     ///< (V/KRPM) 反电动势常数
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 电机参数
+*/
+#define Pole_Pairs                      (4.0)				///< 极对数
+#define LD                              (0.11405)			///< (H) D轴电感
+#define LQ                              (0.11405)			///< (H) Q轴电感
+#define RS                              (36.45)             ///< (Ω) 相电阻
+#define Ke                              (69.20)				///< (V/KRPM) 反电动势常数,选择AO观测器不需要Ke
+#define MOTOR_SPEED_BASE                (5000.0)			///< (RPM) 速度基准
+
+// 若选择AO自适应观测器 则无需填写Ke
+// #define KeVpp                          (1.832)			///< (V)      反电动势测量的峰峰值
+// #define KeT                            (68.40)			///< (ms)     反电动势测量的周期
+// #define Ke                             (Pole_Pairs * KeVpp * KeT / 207.84)     ///< (V/KRPM) 反电动势常数
+
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 驱动板采样参数
+*/
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                             3.电流采样参数                                                   
----------------------------------------------------------------------------------------------------------------------------- */
 /**
  * @breaf  运放模式选择
  * @param (AMP_NOMAL)       外部放大
  * @param (AMP_PGA_DUAL)    内部PGA双端差分输入(放大倍数的标定外部引脚串1kΩ电阻)
  */
-#define HW_AMP_MODE                     (AMP_PGA_DUAL)  ///< 运放模式选择       
+#define HW_AMP_MODE                     (AMP_PGA_DUAL)		///< 运放模式选择
+
+#define HW_RSHUNT                       (0.1)				///< (Ω)  采样电阻                               
 
-#define HW_RSHUNT                       (0.39)         ///< (Ω)  采样电阻                               
+#define RV1                             (1020.0)			///< (kΩ) 母线电压分压电阻1
+#define RV2                             (10.0)				///< (kΩ) 母线电压分压电阻2
 
 /**
  * 放大倍数设置
@@ -61,7 +58,7 @@
  * @param (AMP16x)      内部PGA放大16倍
  * @param (xxxxxx)      外部放大模式填写相应倍数
  */
-#define HW_AMPGAIN                      (AMP4x)         ///< 放大倍数设置                       
+#define HW_AMPGAIN                      (AMP8x)         ///< 放大倍数设置                       
 
 /**
  * 参考电压设置
@@ -103,32 +100,6 @@
  */
 #define VHALF_EN                        (Enable)        ///< VHALF输出使能
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                             4.母线电压采样参数                                                  
----------------------------------------------------------------------------------------------------------------------------- */
-
-#define RV1                             (1000.0)          ///< (kΩ) 母线电压分压电阻1
-#define RV2                             (6.8)             ///< (kΩ) 母线电压分压电阻2
-
-
- /**********************电机运行参数*****************************
- 1.  预充电参数与IPMtest
- 2.  预定位参数
- 3.  启动参数
- 4.  环路参数 
- 5.  调速开关模式 
- 6.  顺逆风参数 
- 7.  观测器模式   
- 8.  过调制
- 9.  正反转模式  
- 10. PWM调速开关参数
- 11. 启停测试参数   
- 12.发热丝控制参数设置 
-  **************************************************************/
-  
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                            1.预充电参数                                                  
----------------------------------------------------------------------------------------------------------------------------- */
 /**
  * 预充电使能
  * @param (Disable)       禁止
@@ -136,26 +107,17 @@
  */
 #define CHARGE_EN                      (Enable)          ///< 预充电使能
 #define CHARGE_DUTY                    (0.98)            ///< (%)  预充电下桥Duty
-#define CHARGE_TIME                    (150)             ///< (ms) 预充电时间 
-/**
- * IPM测试模式,用以检测MCU——MOS间电路是否正常(使用此功能需要使能预充电,禁止接电机)
- * @param (Disable)       禁止
- * @param (Enable)        使能
- */
- #define IPMTEST                       (Disable)
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                          2.预定位参数                                                    
----------------------------------------------------------------------------------------------------------------------------- */
+#define CHARGE_TIME                    (150)             ///< (ms) 预充电时间
+
+
 /**
  * 预定位模式选择
  * @param (ALIGN_DSIABLE)       禁止
  * @param (ALIGN_NOMAL)         正常预定位
  * @param (ALIGN_TEST)          测试模式,可用于手动测试电机极对数
  */
-#define ALIGN_MOME                     (ALIGN_DSIABLE)  ///< 预定位模式选择
-
+#define ALIGN_MOME                     (ALIGN_NOMAL)  ///< 预定位模式选择
 #define Align_Angle                    (0.0)          ///< (°) 预定位角度
-
 #define Align_Time                     (1)              ///< (ms) 预定位时间 
 
 /* 预定位的Kp、Ki */
@@ -164,9 +126,13 @@
 #define ID_Align_CURRENT               I_Value(0.0)     ///< (A) D轴定位电流
 #define IQ_Align_CURRENT               I_Value(0.3)     ///< (A) Q轴定位电流
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                            3.启动参数                                                   
----------------------------------------------------------------------------------------------------------------------------- */
+
+
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 启动配置
+*/
+
 /**
  * 开环启动模式选择
  * @param (Open_Start)          开环强拖启动
@@ -176,18 +142,18 @@
 
 /* 启动电流 */
 #define ID_Start_CURRENT               I_Value(0.0)     ///< (A) D轴启动电流
-#define IQ_Start_CURRENT               I_Value(0.3)    ///< (A) Q轴启动电流
+#define IQ_Start_CURRENT               I_Value(0.2)    ///< (A) Q轴启动电流
 
 /* 顺风启动切入闭环电流  */
 #define ID_RUN_CURRENT                 I_Value(0.0)     ///< (A) D轴运行电流
-#define IQ_RUN_CURRENT                 I_Value(0.2)     ///< (A) Q轴运行电流
+#define IQ_RUN_CURRENT                 I_Value(0.1)     ///< (A) Q轴运行电流
 
 /* 启动ATO参数 */
-#define ATO_BW_START                   (5.0)            ///< 观测器带宽的滤波值,经典值为1.0-200.0 
+#define ATO_BW_START                   (0.0)            ///< 观测器带宽的滤波值,经典值为1.0-200.0 
 #define ATO_BW_RUN1                    (20.0) 
-#define ATO_BW_RUN2                    (30.0) 
-#define ATO_BW_RUN3                    (40.0) 
-#define ATO_BW_RUN4                    (50.0) 
+#define ATO_BW_RUN2                    (40.0) 
+#define ATO_BW_RUN3                    (80.0) 
+#define ATO_BW_RUN4                    (120.0) 
 
 /* 启动ATO爬坡时间控制 */
 #define ATO_START_HOLDTIME             (10)               ///< (ms)观测器带宽的滤波值,启动第一拍ATO持续时间
@@ -208,26 +174,31 @@
 #define MOTOR_SPEED_MAX_RPM            S_Value(2000.0)       ///< (RPM) 运行最大转速
 #define MOTOR_SPEED_STOP_RPM           S_Value(250.0)       ///< (RPM) 运行最小转速
 
-/* -----------电流环参数设置值-------------------------------------------------------------- */
-#define DKP_Start                      _Q12(2.3)        ///< 启动DQ轴电流环KP
-#define DKI_Start                      _Q15(0.015)       ///< 启动DQ轴电流环KI
-#define QKP_Start                      _Q12(2.3)        ///< 启动DQ轴电流环KP
-#define QKI_Start                      _Q15(0.015)       ///< 启动DQ轴电流环KI
 
-#define DKP                            _Q12(3.5)        ///< 运行DQ轴电流环KP
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 电流环参数设置值
+*/
+#define DKP_Start                      _Q12(2.5)        ///< 启动DQ轴电流环KP
+#define DKI_Start                      _Q15(0.02)       ///< 启动DQ轴电流环KI
+#define QKP_Start                      _Q12(2.5)        ///< 启动DQ轴电流环KP
+#define QKI_Start                      _Q15(0.02)       ///< 启动DQ轴电流环KI
+
+#define DKP                            _Q12(2.5)        ///< 运行DQ轴电流环KP
 #define DKI                            _Q15(0.05)       ///< 运行DQ轴电流环KI
-#define QKP                            _Q12(3.5)        ///< 运行DQ轴电流环KP
+#define QKP                            _Q12(2.5)        ///< 运行DQ轴电流环KP
 #define QKI                            _Q15(0.05)       ///< 运行DQ轴电流环KI
 /* D轴参数设置 */
-#define DOUTMAX                        _Q15(0.9)        ///< D轴电压最大限幅值,单位:输出占空比
-#define DOUTMIN                        _Q15(-0.9)       ///< D轴电压最小限幅值,单位:输出占空比
+#define DOUTMAX                        _Q15(0.99)        ///< D轴电压最大限幅值,单位:输出占空比
+#define DOUTMIN                        _Q15(-0.99)       ///< D轴电压最小限幅值,单位:输出占空比
 /* Q轴参数设置 */
-#define QOUTMAX                        _Q15(0.95)       ///< Q轴电压最大限幅值,单位:输出占空比
-#define QOUTMIN                        _Q15(-0.95)      ///< Q轴电压最小限幅值,单位:输出占空比
+#define QOUTMAX                        _Q15(0.99)       ///< Q轴电压最大限幅值,单位:输出占空比
+#define QOUTMIN                        _Q15(-0.99)      ///< Q轴电压最小限幅值,单位:输出占空比
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                        4. 环路参数                                                
----------------------------------------------------------------------------------------------------------------------------- */
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 环路参数
+*/
 /**
  * 闭环方式选择
  * @param (CURRENT_LOOP_CONTROL)       电流环
@@ -260,10 +231,6 @@
 #define Motor_F7SEG_Speed S_Value(1000) // 速度低于这个值,切换成七段式,主要是起动的时候
 
 
-
-/* 限制功率 */
-#define POWERLPFLIMIT                  (16000)              ///< 15800大概在110W左右
-
 /**
  * 弱磁设置
  * @param (Disable)       禁止
@@ -271,7 +238,6 @@
  */
 #define MotorFiledWeakenEn            (Disable)                  ///<  弱磁使能位
 #define MotorFiledWeakenUs            _Q15(0.90)                ///<  弱磁能到的最大饱和电压(弱磁转速上不去的时候可以调小该值)
-
 #define MotorFiledWeakenKp            _Q12(0.2)                 ///<  弱磁控制的Kp
 #define MotorFiledWeakenKi            _Q15(0.003)               ///<  弱磁控制的Ki
 
@@ -281,16 +247,12 @@
  * @param (Disable)      禁止
  * @param (Enable)       使能
  */
-#define VoltageCompensationEn           (Enable)
+#define VoltageCompensationEn           (Disable)
 #define VoltageCompensationDelayCnt     (800)                              ///< 进入速度环后延迟1S进入电压补偿
 #define LinearCompensationAngel          _Q15(0.0 / 180.0)               ///< 根据电压降低到AC210V时开始给补偿角度
 #define LinearCompensationAngel_MAX      _Q15(30.0 / 180.0)              ///< 电压降低时最大补偿角度
 #define LinearCompensationAngel_MIN      _Q15(-30.0 / 180.0)             ///< 电压降低时最小补偿角度
 
-
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                        5. 调速开关模式                                                   
----------------------------------------------------------------------------------------------------------------------------- */
 /**
  * 闭环方式选择
  * @param (PWMMODE)       PWM调速
@@ -311,19 +273,14 @@
  * @param (BEMFMethod)      BEMF比较器方法
  * @param (FOCMethod)       FOC计算方法
  */
-#define TAILWIND_MODE                  (FOCMethod)     ///< 顺逆风检测方式
-
+#define TAILWIND_MODE                  (NoTailWind)     ///< 顺逆风检测方式
 /* 逆风顺风电流环KP、KI */
 #define DQKP_TailWind                  _Q12(0.3)        ///< FOC计算顺逆风检测电流环KP
 #define DQKI_TailWind                  _Q15(0.005)        ///< FOC计算顺逆风检测电流环KI
-
 #define TAILWIND_TIME                  (500)           ///< (ms) 顺逆风检测时间 
 #define ATO_BW_WIND                    (80)            ///< 逆风判断观测器带宽的滤波值,经典值为8.0-100.0 
 #define SPD_BW_WIND                    (20.0)           ///< 逆风判断速度带宽的滤波值,经典值为5.0-40.0 
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                          7. 观测器模式                                                 
----------------------------------------------------------------------------------------------------------------------------- */
 /**
  * 估算器模式选择
  * @param (SMO)       滑膜估算
@@ -331,30 +288,14 @@
  * @param (AO)        自适应
  */
 #define EstimateAlgorithm              (AO)                 ///< 估算器模式选择
-
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                          8. 过调制                                                
----------------------------------------------------------------------------------------------------------------------------- */
 /**
  * 过调制
  * @param (Disable)      禁止
  * @param (Enable)       使能
  */
 #define OverModulation                 (Disable)             ///< 开启过调制UD,UQ会被放大1.15倍,但极限状态可能导致电流畸变                                  
-
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                          9. 正反转模式                                                
----------------------------------------------------------------------------------------------------------------------------- */
-/**
- * 转向设置
- * @param (CW)        顺时针
- * @param (CCW)       逆时针
- */
 #define FR_MODE                        (CW)                 ///< 转向设置 
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                          10. PWM调速开关参数                                                
----------------------------------------------------------------------------------------------------------------------------- */
 /**
  * PWM调速 PWM极性选择
  * @param (PosiPWMDUTY)       正逻辑
@@ -369,9 +310,14 @@
 #define MINPWMDuty                     _Q15(0.10)           ///< 速度曲线上最小PWM占空比
 #define MAXPWMDuty                     _Q15(0.90)           ///< 速度曲线上最大PWM占空比
 
-/* ----------------------------------------------------------------------------------------------------------------------------
-                                          11. 启停测试参数                                                
----------------------------------------------------------------------------------------------------------------------------- */
+
+/**
+ * IPM测试模式
+ * @param (Disable)       禁止
+ * @param (Enable)        使能
+ */
+ #define IPMTEST                       (Disable)
+
 /* -----启停测试参数配置----- */
 #define ONOFFTEST_REF                  S_Value(1000)        ///< 测试给定,注意闭环方式不同给定值需要更改
 #define ONOFFTEST_ON_TIME              (3000)               ///< (ms) 启动运行时间
@@ -381,13 +327,20 @@
 #define StopBrakeFlag                  (0)
 #define StopWaitTime                   (550)                ///< (ms) 刹车等待时间
 #define Stop_MOTOR_SPEED_RPM            S_Value(300)        ///< (RPM) 小于该转速刹车
-#endif
-                                         
+
 /**
  * NTC采集
  * @param (Disable)       禁止
  * @param (Enable)        使能
  */
- #define NTCSignalENABLE            (Enable)               ///<NTC信号采集,1:复用LED端口采集NTC信号  0:不使能LED端口复用,没有NTC的可直接关掉                                                    
+ #define NTCSignalENABLE            (Disable)               ///<NTC信号采集,1:复用LED端口采集NTC信号  0:不使能LED端口复用,没有NTC的可直接关掉                                                    
+
+
+/**
+---------------------------------------------------------------------------------------------------------------------------------------------
+	@brief 到此结束
+*/
+#endif
+
 																														   
        																														

+ 26 - 25
User/Include/Declaration.h

@@ -9,7 +9,7 @@
 #define __DECLARATION_H_
 
 #include <VaribleDef.h>
-// 运行
+
 /**
 	@brief 状态处理函数
 */
@@ -26,9 +26,7 @@ void MC_Break(void);
 void Motor_Static_Open(void);
 void Motor_FocTailWind_Open(void);
 void Motor_Align(void);
-void MotorcontrolInit(void);
 void Motor_TailWind(void);
-void MotorcontrolInit(void);
 void McTailWindDealwith(void);
 void TailWindDealwith(void);
 
@@ -43,8 +41,10 @@ void   PWMInputCapture(void);
 void   FGOutput(void);
 void   Fault_GetCurrentOffset(void);
 uint32 Abs_F32(int32 value);
+
 void SinCal(int16 Ref, int16 Theta, int16 * Sin, int16 * Cos);
 uint16 SqrtUDQ(int16 sqrtUd, int16 sqrtUq);
+
 void LedDisplay(uint8 uLedMask);
 void zeroLoss(void);
 
@@ -88,8 +88,9 @@ void put_char(unsigned char c);
 void put_string(unsigned char *str);
 
 
-// DMA相关
-
+/**
+	@brief DMA相关
+*/
 typedef enum
 {
     UART_DRAM  = 0,
@@ -122,26 +123,28 @@ typedef enum
     DMA_IRQ = DMAIF
 }eType_DMA_Statu;
 
-/******************************************************************************///Function Subject
-extern void SetPipe_DMA0(eType_DMA_PIPE ePipe);
-extern void SetPipe_DMA1(eType_DMA_PIPE ePipe);
-extern void SetDataPackage_DMA0(unsigned short ulAddr, char cLen);
-extern void SetDataPackage_DMA1(unsigned short ulAddr, char cLen);
-extern void EnableRun_DMA0(void);
-extern void EnableRun_DMA1(void);
-extern bool GetStatus_DMA0(eType_DMA_Statu eStatu);
-extern bool GetStatus_DMA1(eType_DMA_Statu eStatu);
-extern void SetEndian_DMA(eType_DMA_Endian eEndian);
-extern void SetIRQ_DMA(ebool eIRQ, eType_DMA_IRQ eIP);
-extern void SetDbgMod_DMA(void);
-extern void SetDbgData_DMA(unsigned short ulAddr);
-extern void Set_DBG_DMA(uint16 DMAAddr);
-
-
-
+void SetPipe_DMA0(eType_DMA_PIPE ePipe);
+void SetPipe_DMA1(eType_DMA_PIPE ePipe);
+void SetDataPackage_DMA0(unsigned short ulAddr, char cLen);
+void SetDataPackage_DMA1(unsigned short ulAddr, char cLen);
+void EnableRun_DMA0(void);
+void EnableRun_DMA1(void);
+bool GetStatus_DMA0(eType_DMA_Statu eStatu);
+bool GetStatus_DMA1(eType_DMA_Statu eStatu);
+void SetEndian_DMA(eType_DMA_Endian eEndian);
+void SetIRQ_DMA(ebool eIRQ, eType_DMA_IRQ eIP);
+void SetDbgMod_DMA(void);
+void SetDbgData_DMA(unsigned short ulAddr);
+void Set_DBG_DMA(uint16 DMAAddr);
 
+/**
+	@brief 过零点检测
+*/
 void ZeroCrossing_Init(void);
 
+/**
+	@brief 定时器
+*/
 #define TIM3_Fre                       (750000.0)                                // TIM0计数频率750KHz
 #define TIM4_Fre                       (6000.0)                                  // TIM0计数频率6KHz
 void Timer1_Init(void);
@@ -180,6 +183,7 @@ void BEMFDetectInit(void);
 void BemfProcess(void);
 void BEMFFOCCloseLoopStart(void);
 MotStateType Bemf_Start_Process(void);
+
 /**
 	@brief 电压补偿
 */
@@ -214,7 +218,6 @@ typedef struct
 
 extern USER_TYPEDEF  User;
 
-
 typedef struct
 {
 	uint16 LEDCnt;
@@ -232,8 +235,6 @@ extern LEDCtl_TypeDef LEDCtl;
 #define LED5_MASK	((uint8)(1 << 4))
 #define LED6_MASK	((uint8)(1 << 5))
 
-void LEDControl(void);
-void Temperature_Control(void);
 void LedDisplay(uint8 uLedMask);
 
 /**

+ 16 - 12
User/Include/Protect.h

@@ -9,11 +9,11 @@
 #define __PROTECT_H_
 
 #define OC_SW_ProtectEn                     (1)                                     // 软件过流保护使能: 0,不使能;1,使能
-#define OV_ProtectEn                        (1)                                     // 过欠压保护使能:   0,不使能;1,使能
+#define OV_ProtectEn                        (0)                                     // 过欠压保护使能:   0,不使能;1,使能
 #define LP_ProtectEn                        (1)                                     // 缺相保护使能:     0,不使能;1,使能
-#define OT_ProtectEn                        (1)                                     // 过温保护使能:     0,不使能;1,使能
+#define OT_ProtectEn                        (0)                                     // 过温保护使能:     0,不使能;1,使能
 #define Stall_ProtectEn                     (1)                                     // 堵转失速保护使能: 0,不使能;1,使能
-#define OP_ProtectEn                        (0)                                     ///< 功率保护,0,不使能;1,使能
+#define OP_ProtectEn                        (0)                                     // 功率保护,0,不使能;1,使能
 #define GetCurrentOffsetEnable              (1)                                     // 偏置电压保护,0,不使能;1,使能
 
 /*  保护重启参数设置  */
@@ -24,7 +24,7 @@
 #define OV_RecoveryDelayTime                (1200)                                // (ms)欠过压保护恢复时间
 #define OV_RecoveryDelayTime1               (200)                                ///< (5ms) 欠过压保护恢复时间,过零判断用于快速插拔电开关机
 #define OV_RecoveryDelayTime2               (1000)                               ///< (5ms) 过压保护恢复时间
- 
+
 #define LP_RecoveryTimes                    (200)                                   // 重启次数,设定值<255 达到重启次数后不再重启,设定值>=255,一直重启
 #define LP_RecoveryDelayTime                (500)                                // (ms)重启延迟时间
 
@@ -36,7 +36,7 @@
 
 #define OP_RecoveryTimes                    (200)                                   // 重启次数,设定值<255 达到重启次数后不再重启,设定值>=255,一直重启
 #define OP_RecoveryDelayTime                (500)                                // (ms)重启延迟时间
-/* HW current protection */
+
 #define HW_OC_FO_MODE                       (1)                                     ///< 硬件FO过流保护使能,适用于IPM有FO保护的场合
 #define HW_OC_CMP_MODE                      (2)                                     ///< 硬件CMP比较过流保护使能,适用于MOS管应用场合
 #define HW_OC_FOCMP_MODE                    (3)                                     ///< 硬件CMP比较和FO过流保护都使能
@@ -54,11 +54,11 @@
 #define SW_OC_DectTime                      (10)                                    ///< (ms)软件过流检测时间
 
 /* -----偏置电压保护----- */
- #define GetCurrentOffsetValue              _Q14(0.05)                              // (单位:100%)偏置电压保护误差范围,超过该范围保护   
- 
+#define GetCurrentOffsetValue              _Q14(0.05)                              // (单位:100%)偏置电压保护误差范围,超过该范围保护   
+
 /* -----功率保护----- */
- #define  OverPowerValue                     (12000)                           ///<功率保护阈值
- 
+#define  OverPowerValue                     (12000)                           ///<功率保护阈值
+
 /* 直流母线电压保护参数设置值 */
 
 #define OVER_VOLTAGE_DECTTIME               (300)                                   ///< (ms) 直流母线电压过压检测保持时间
@@ -85,9 +85,13 @@
 #define LP_DectCycleTIME                    (50)                                  ///< (ms) 峰值检测周期时间,需满足覆盖至少一个完整电周期
 
 /* -----NTC过温保护----- */
-#define TemperatureProtectTime 			(1000)									     // (ms)温度保护检测时间
-#define OVER_Temperature 		        Tempera_Value(1.0)						     // 过温保护阈值,根据NTC曲线设定,10K上拉电阻,80℃
-#define UNDER_Temperature          	Tempera_Value(1.5)						     // 过温保护恢复阈值,根据NTC曲线设定,10K上拉电阻,70℃
+#define TemperatureProtectTime          (1000)                                       // (ms)温度保护检测时间
+#define OVER_Temperature                Tempera_Value(1.0)                           // 过温保护阈值,根据NTC曲线设定,10K上拉电阻,80℃
+#define UNDER_Temperature           Tempera_Value(1.5)                           // 过温保护恢复阈值,根据NTC曲线设定,10K上拉电阻,70℃
+
+
+/* 限制功率 */
+#define POWERLPFLIMIT                  (16000)              ///< 15800大概在110W左右
 
 /* 故障显示 */
 #define LED_ONTime                          (100)

+ 2 - 11
User/Source/AddFunction.c

@@ -130,15 +130,12 @@ void PWMDutyCal(void)
 void VSPSample(void)
 {
     static int16 VSP = 0;
-    /*****VREF的采样获取值并滤波******/
+	
     VSP = LPFFunction(ADC7_DR, VSP, 10); // 注意低通滤波器系数范围为0---127
-    
-    //    if((VSP > ONPWMDuty)&&(VSP <= OFFPWMDutyHigh))    lint认为右边永远成立                //在ONPWMDuty-OFFPWMDutyHigh之间,电机有转速运行
-    if (VSP > ONPWMDuty)
+	if (VSP > ONPWMDuty)
     {
         isCtrlPowOn = 1; // 开机
     }
-    //    else if((VSP < OFFPWMDuty)||(VSP > OFFPWMDutyHigh))                                   //电机停机 lint认为右边永远不成立
     else if ((VSP < OFFPWMDuty)) // 电机停机
     {
         isCtrlPowOn = 0; // 关机
@@ -362,14 +359,8 @@ void Speed_response(void)
                     }
                     #else
                     {
-                        /* ------------------自定义闭环START--------------------- */
-                        /* ------------------自定义闭环 END--------------------- */
                     }
                     #endif
-                    //                              if(PI1_UKMAX < SOUTMAX)
-                    //                              {
-                    //                                  PI1_UKMAX+=1;
-                    //                              }
                 }
                 
                 #if (SVPWM_5_Segment_Run_Enale == 1) // 开启五段式

+ 179 - 189
User/Source/LED.c

@@ -1,205 +1,195 @@
-/*  -------------------------- (C) COPYRIGHT 2022 Fortiortech ShenZhen ---------------------------*/
 /**
- * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
+ * @copyright None
  * @file      LED.c
- * @author    Fortiortech  Appliction Team
- * @since     Create:2022-07-14
- * @date      Last modify:2022-07-18
- * @note      Last modify author is Leo.li
- * @brief
+ * @author    Comment Vivre 
+ * @date      2024-08-26
+ * @brief     None
  */
-
-/* Includes -------------------------------------------------------------------------------------*/
 #include <FU68xx_5.h>
 #include <Myproject.h>
 
-/* Private variables ----------------------------------------------------------------------------*/
 LEDCtl_TypeDef LEDCtl;
 
 
 #define LED_Time  20
-//uint8 LED_Time = 20;
 void LedDisplay(uint8 uLedMask)
 {
-//	    LEDCtl.LEDCnt++;
-//		GP12 = 0;
-//		GP16 = 0;
-//		GP21 = 0;	
-//	
-//		if(LEDCtl.LEDCnt<=(LED_Time*1))
-//		{
-//			if(uLedMask & LED1_MASK) //if(LED1==1)  //D11
-//			{
-//				SetBit(P1_OE, P12); 
-//				ClrBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 1;
-//				GP16 = 0;
-//				GP21 = 0;
-//							
-//			}	
-//			else
-//			{
-//				SetBit(P1_OE, P12); 
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 0;					
-//				
-//			}				
-//		}
-//		else if (LEDCtl.LEDCnt<=(LED_Time*2))
-//		{
-//			if (uLedMask & LED2_MASK) //if(LED2==1)   //D8
-//			{
-//				SetBit(P1_OE, P12); 
-//				ClrBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 1;
-//			}	
-//			else
-//			{
-//				SetBit(P1_OE, P12); 
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 0;				
-//				
-//			}					
-//		}			
-//		else if (LEDCtl.LEDCnt<=(LED_Time*3))
-//		{
-//			if (uLedMask & LED3_MASK) //if(LED3==1)   //D7
-//			{
-//				ClrBit(P1_OE, P12); 
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 1;
-//						
-//			}	
-//			else
-//			{
-//				SetBit(P1_OE, P12);  
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 0;				
-//			}					
-//		}	
-//		else if (LEDCtl.LEDCnt<=(LED_Time*4))
-//		{
-//			if (uLedMask & LED4_MASK) //if(LED4==1)  //D10
-//			{
-//				ClrBit(P1_OE, P12);  
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 1;
-//				GP21 = 0;
-//							
-//			}	
-//			else
-//			{
-//				SetBit(P1_OE, P12);  
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 0;					
-//				
-//			}					
-//		}			
-//		else if (LEDCtl.LEDCnt<=(LED_Time*5))
-//		{
-//			if (uLedMask & LED5_MASK) //if(LED5==1) //D9
-//			{
-//				SetBit(P1_OE, P12); 
-//				SetBit(P1_OE, P16); 	
-//				ClrBit(P2_OE, P21);
-//				GP12 = 1;
-//				GP16 = 0;
-//				GP21 = 0;
-//			}	
-//			else
-//			{
-//				SetBit(P1_OE, P12); 
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 0;					
-//				
-//			}					
-//		}	
-//		else if (LEDCtl.LEDCnt<=(LED_Time*6))
-//		{
-//			if (uLedMask & LED6_MASK) //if(LED6==1) //D6
-//			{
-//				SetBit(P1_OE, P12);  
-//				SetBit(P1_OE, P16); 	
-//				ClrBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 1;
-//				GP21 = 0;
-//							
-//			}	
-//			else
-//			{
-//				SetBit(P1_OE, P12); 
-//				SetBit(P1_OE, P16); 	
-//				SetBit(P2_OE, P21);
-//				GP12 = 0;
-//				GP16 = 0;
-//				GP21 = 0;				
-//				
-//			}					
-//		}
-//		else if ((LEDCtl.LEDCnt <= (LED_Time*6+1))&&(mcFocCtrl.NTCValueGatherFlag==1))
-//		{
-//			#if (NTCSignalENABLE==1)
-//			{			
-//				ClrBit(P1_OE, P12); 
-//				ClrBit(P1_OE, P16);
-//				ClrBit(P2_OE, P21);
-//				
-//				SetBit(ADC_MASK, CH8EN);   
-//				SetBit(P2_AN, PIN1);
-//			}	
-//			#endif			
-//		}
-//		else if ((LEDCtl.LEDCnt <= (LED_Time*6+5))&&(mcFocCtrl.NTCValueGatherFlag==1))
-//		{ 
-//																											//延迟5个载波时间,待NTC信号稳定再采集NTC信号
-//		}			
-//		else if ((LEDCtl.LEDCnt <= (LED_Time*6+15))&&(mcFocCtrl.NTCValueGatherFlag==1))
-//		{ 
-//			#if (NTCSignalENABLE==1)
-//			{			
-//				mcFocCtrl.NTCValue = ADC8_DR;    /* -----采集NTC温度----- */
-//			}	
-//			#endif			
-//		}  
-//		else
-//		{	
-//			#if (NTCSignalENABLE==1)
-//			{			
-//				mcFocCtrl.NTCValueGatherFlag =0;
-//				ClrBit(ADC_MASK, CH8EN);   
-//				ClrBit(P2_AN, PIN1);
-//			}	
-//			#endif		
-//			LEDCtl.LEDCnt = 0;
-//		}	
-
-		
+	    LEDCtl.LEDCnt++;
+		GP12 = 0;
+		GP16 = 0;
+		GP21 = 0;	
 	
+		if(LEDCtl.LEDCnt<=(LED_Time*1))
+		{
+			if(uLedMask & LED1_MASK) //if(LED1==1)  //D11
+			{
+				SetBit(P1_OE, P12); 
+				ClrBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 1;
+				GP16 = 0;
+				GP21 = 0;
+							
+			}	
+			else
+			{
+				SetBit(P1_OE, P12); 
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 0;					
+				
+			}				
+		}
+		else if (LEDCtl.LEDCnt<=(LED_Time*2))
+		{
+			if (uLedMask & LED2_MASK) //if(LED2==1)   //D8
+			{
+				SetBit(P1_OE, P12); 
+				ClrBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 1;
+			}	
+			else
+			{
+				SetBit(P1_OE, P12); 
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 0;				
+				
+			}					
+		}			
+		else if (LEDCtl.LEDCnt<=(LED_Time*3))
+		{
+			if (uLedMask & LED3_MASK) //if(LED3==1)   //D7
+			{
+				ClrBit(P1_OE, P12); 
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 1;
+						
+			}	
+			else
+			{
+				SetBit(P1_OE, P12);  
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 0;				
+			}					
+		}	
+		else if (LEDCtl.LEDCnt<=(LED_Time*4))
+		{
+			if (uLedMask & LED4_MASK) //if(LED4==1)  //D10
+			{
+				ClrBit(P1_OE, P12);  
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 1;
+				GP21 = 0;
+							
+			}	
+			else
+			{
+				SetBit(P1_OE, P12);  
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 0;					
+				
+			}					
+		}			
+		else if (LEDCtl.LEDCnt<=(LED_Time*5))
+		{
+			if (uLedMask & LED5_MASK) //if(LED5==1) //D9
+			{
+				SetBit(P1_OE, P12); 
+				SetBit(P1_OE, P16); 	
+				ClrBit(P2_OE, P21);
+				GP12 = 1;
+				GP16 = 0;
+				GP21 = 0;
+			}	
+			else
+			{
+				SetBit(P1_OE, P12); 
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 0;					
+				
+			}					
+		}	
+		else if (LEDCtl.LEDCnt<=(LED_Time*6))
+		{
+			if (uLedMask & LED6_MASK) //if(LED6==1) //D6
+			{
+				SetBit(P1_OE, P12);  
+				SetBit(P1_OE, P16); 	
+				ClrBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 1;
+				GP21 = 0;
+							
+			}	
+			else
+			{
+				SetBit(P1_OE, P12); 
+				SetBit(P1_OE, P16); 	
+				SetBit(P2_OE, P21);
+				GP12 = 0;
+				GP16 = 0;
+				GP21 = 0;				
+				
+			}					
+		}
+		else if ((LEDCtl.LEDCnt <= (LED_Time*6+1))&&(mcFocCtrl.NTCValueGatherFlag==1))
+		{
+			#if (NTCSignalENABLE==1)
+			{			
+				ClrBit(P1_OE, P12); 
+				ClrBit(P1_OE, P16);
+				ClrBit(P2_OE, P21);
+				
+				SetBit(ADC_MASK, CH8EN);   
+				SetBit(P2_AN, PIN1);
+			}	
+			#endif			
+		}
+		else if ((LEDCtl.LEDCnt <= (LED_Time*6+5))&&(mcFocCtrl.NTCValueGatherFlag==1))
+		{ 
+																											//延迟5个载波时间,待NTC信号稳定再采集NTC信号
+		}			
+		else if ((LEDCtl.LEDCnt <= (LED_Time*6+15))&&(mcFocCtrl.NTCValueGatherFlag==1))
+		{ 
+			#if (NTCSignalENABLE==1)
+			{			
+				mcFocCtrl.NTCValue = ADC8_DR;    /* -----采集NTC温度----- */
+			}	
+			#endif			
+		}  
+		else
+		{	
+			#if (NTCSignalENABLE==1)
+			{			
+				mcFocCtrl.NTCValueGatherFlag =0;
+				ClrBit(ADC_MASK, CH8EN);   
+				ClrBit(P2_AN, PIN1);
+			}	
+			#endif		
+			LEDCtl.LEDCnt = 0;
+		}		
 }
 
 

+ 114 - 139
User/Source/MotorControl.c

@@ -1,15 +1,11 @@
 /**
-    @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
-    @file      MotorControl.c
-    @author    Fortiortech  Appliction Team
-    @since     Create:2021-04-10
-    @date      Last modify:2022-07-14
-    @note      Last modify author is Marcel
-    @brief
-*/
-
+ * @copyright None
+ * @file      MotorControl.c
+ * @author    Comment Vivre 
+ * @date      2024-08-26
+ * @brief     None
+ */
 #include <MyProject.h>
-/* Private variables ----------------------------------------------------------------------------*/
 
 MotStateType data mcState;
 MotStaM McStaSet;
@@ -21,154 +17,140 @@ MotStaM McStaSet;
 */
 void MC_Control(void)
 {
+    // 故障下状态调整
+    if (mcFaultSource != FaultNoSource)
+    { mcState = mcFault;  }
+    // 关机命令下状态调整
+    else if ((mcState == mcInit) || (mcState == mcCharge)
+        || (mcState == mcTailWind) || (mcState == mcPosiCheck)
+        || (mcState == mcAlign) || (mcState == mcStart))
+    {
+        if (isCtrlPowOn == false)
+        {  mcState = mcStop; }
+    }
+    
+    // 状态机执行
     switch (mcState)
     {
         case mcReady:
+        {
             Motor_Ready();
             
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else if ((mcCurOffset.OffsetFlag == 1) && (isCtrlPowOn))
+            if ((mcCurOffset.OffsetFlag == 1) && (isCtrlPowOn))
             {
                 mcState = mcInit;
                 mcCurOffset.OffsetFlag = 0;
                 mcCurOffset.OffsetCount = 0; // 偏置电压采集计数
                 KS.ChangeKeyFlg = 1;
             }
-            else
-            {
-            }
             
             break;
-            
+        }
+        
         case mcInit:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else if (!isCtrlPowOn)
-            {
-                mcState = mcStop;
-            }
-            else if (mcCurOffset.OffsetFlag == 1)
+        {
+            if (mcCurOffset.OffsetFlag == 1)
             {
                 Motor_Init();
                 #if (CHARGE_EN == Enable)
-                mcFocCtrl.State_Count = CHARGE_TIME;
-                mcState = mcCharge; // 跳入mcCharge状态
-                #else
-                #if (TAILWIND_MODE == NoTailWind)
-                #if (ALIGN_MOME != ALIGN_DSIABLE)
-                mcFocCtrl.mcPosCheckAngle = Align_Angle;
-                mcState = mcAlign;
-                mcFocCtrl.State_Count = Align_Time;
-                #else
-                mcState = mcStart;
-                #endif
-                #else
-                mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
-                mcState = mcTailWind;
-                #endif
-                #endif
-            }
-            
-            break;
-            
-        case mcCharge:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else if (!isCtrlPowOn)
-            {
-                mcState = mcStop;
-            }
-            else
-            {
-                Motor_Charge();
-                #if (IPMTEST == Enable)
                 {
-                    ;
+                    mcFocCtrl.State_Count = CHARGE_TIME;
+                    mcState = mcCharge; // 跳入mcCharge状态
                 }
                 #else
-                
-                if (mcFocCtrl.State_Count == 0)
                 {
-                    MOE = 0; // 关闭输出
                     #if (TAILWIND_MODE == NoTailWind)
                     {
                         #if (ALIGN_MOME != ALIGN_DSIABLE)
-                        mcFocCtrl.mcPosCheckAngle = Align_Angle;
-                        mcState = mcAlign;
-                        mcFocCtrl.State_Count = Align_Time;
+                        {
+                            mcFocCtrl.mcPosCheckAngle = Align_Angle;
+                            mcState = mcAlign;
+                            mcFocCtrl.State_Count = Align_Time;
+                        }
                         #else
                         mcState = mcStart;
                         #endif
                     }
                     #else
-                    mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
-                    mcState = mcTailWind;
+                    {
+                        mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
+                        mcState = mcTailWind;
+                    }
                     #endif
                 }
-                
                 #endif
             }
             
             break;
-            #if (TAILWIND_MODE != NoTailWind)
-            
-        case mcTailWind:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else if (!isCtrlPowOn)
-            {
-                mcState = mcStop;
-            }
-            else
+        }
+        
+        case mcCharge:
+        {
+            Motor_Charge();
+            #if (IPMTEST == Enable)
             {
-                Motor_TailWind();
+                ;
             }
+            #else
             
-            break;
-            #endif
-            #if (ALIGN_MOME != ALIGN_DSIABLE)
-            
-        case mcAlign:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else if (!isCtrlPowOn)
-            {
-                mcState = mcStop;
-            }
-            else
+            if (mcFocCtrl.State_Count == 0)
             {
-                Motor_Align();
-                #if (ALIGN_MOME == ALIGN_TEST)
-                
-                while (1)
-                    ;
-                    
-                #else
-                    
-                if (mcFocCtrl.State_Count == 0)
+                MOE = 0; // 关闭输出
+                #if (TAILWIND_MODE == NoTailWind)
                 {
+                    #if (ALIGN_MOME != ALIGN_DSIABLE)
+                    mcFocCtrl.mcPosCheckAngle = Align_Angle;
+                    mcState = mcAlign;
+                    mcFocCtrl.State_Count = Align_Time;
+                    #else
                     mcState = mcStart;
-                    User.TPCtrlDealy = 5000; // 延时启动发热
+                    #endif
                 }
-                    
+                #else
+                mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
+                mcState = mcTailWind;
                 #endif
             }
             
-            break;
             #endif
+            break;
+        }
+        
+        #if (TAILWIND_MODE != NoTailWind)
+        
+        case mcTailWind:
+        {
+            Motor_TailWind();
+            break;
+        }
+        
+        #endif
+        #if (ALIGN_MOME != ALIGN_DSIABLE)
+        
+        case mcAlign:
+        {
+            Motor_Align();
+            #if (ALIGN_MOME == ALIGN_TEST)
             
+            while (1)
+                ;
+                
+            #else
+                
+            if (mcFocCtrl.State_Count == 0)
+            {
+                mcState = mcStart;
+                User.TPCtrlDealy = 5000; // 延时启动发热
+            }
+                
+            #endif
+            break;
+        }
+        
+        #endif
+        
         case mcStart:
+        {
             if (mcFocCtrl.Start_Mode == TAILWIND_START) // 顺风启动
             {
                 #if (TAILWIND_MODE == BEMFMethod)
@@ -176,8 +158,10 @@ void MC_Control(void)
                 #elif (TAILWIND_MODE == RSDMethod)
                 mcState = mcRun;
                 #elif (TAILWIND_MODE == FOCMethod)
-                Motor_FocTailWind_Open();
-                mcState = mcRun;
+                {
+                    Motor_FocTailWind_Open();
+                    mcState = mcRun;
+                }
                 #endif
             }
             else if (mcFocCtrl.Start_Mode == HEADWIND_START) // 逆风启动
@@ -200,41 +184,27 @@ void MC_Control(void)
             }
             
             break;
-            
+        }
+        
         case mcRun:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else if (!isCtrlPowOn)
+        {
+            if (isCtrlPowOn == false)
             {
                 mcState = mcStop;
                 mcFocCtrl.State_Count = 5; // 单位:1ms
             }
-            else
-            {
-            }
             
             break;
-            
+        }
+        
         case mcStop:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            else
-            {
-                MC_Stop();
-            }
-            
+        {
+            MC_Stop();
             break;
-            
+        }
+        
         case mcBrake:
-            if (mcFaultSource != FaultNoSource)
-            {
-                mcState = mcFault;
-            }
-            
+        {
             if (mcFocCtrl.State_Count == 0)
             {
                 fault.Voltage.VoltDetecBraketDuty = 0;
@@ -247,8 +217,10 @@ void MC_Control(void)
             }
             
             break;
-            
+        }
+        
         case mcFault:
+        {
             if (mcFaultSource == FaultUnderVoltageDC)
             {
                 UnderProcess();  // 欠压保护处理函数
@@ -266,9 +238,12 @@ void MC_Control(void)
             }
             
             break;
-            
+        }
+        
         default:
+        {
             mcState = mcReady;
             break;
+        }
     }
 }

+ 78 - 111
User/Source/MotorControlFunction.c

@@ -1,13 +1,10 @@
 /**
-    @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
-    @file      MotorControlFunction.c
-    @author    Fortiortech  Appliction Team
-    @since     Create:2021-11-07
-    @date      Last modify:2022-07-14
-    @note      Last modify author is Marcel He
-    @brief
-*/
-
+ * @copyright None
+ * @file      MotorControlFunction.c
+ * @author    Comment Vivre 
+ * @date      2024-08-26
+ * @brief     None
+ */
 #include <MyProject.h>
 
 CurrentOffset xdata mcCurOffset; ///< 电流采样偏置电压采集缓存
@@ -48,8 +45,8 @@ void FOC_Init(void)
     FOC_EK2 = OBS_K2T;
     FOC_EK3 = OBS_K3T;
     FOC_EK4 = OBS_K4T;
-		/* -----AO/PLL/SMO ----- */
-		#if (EstimateAlgorithm == AO)
+    /* -----AO/PLL/SMO ----- */
+    #if (EstimateAlgorithm == AO)
     {
         ClrBit(FOC_CR2, ESEL);
         FOC_KSLIDE = OBS_KSLIDE;
@@ -69,16 +66,16 @@ void FOC_Init(void)
         FOC_KSLIDE = OBSE_PLLKP_GAIN;
         FOC_EKLPFMIN = OBSE_PLLKI_GAIN;
     }
-   #else
+    #else
     {
-      #error " EstimateAlgorithm  ERR"
+#error " EstimateAlgorithm  ERR"
     }
     #endif
     FOC_FBASE = OBS_FBASE;    // 由速度计算角度增量的系数
     FOC_OMEKLPF = SPEED_KLPF; // 估算器内速度低通滤波系数
     FOC_TGLI = PWM_TGLI_LOAD; // 死区配置
     SetBit(FOC_CR1, SVPWMEN); // SVPWM模式
-
+    
     if (mcFocCtrl.FR == CW)
     {
         ClrBit(DRV_CR, DDIR); // 反转标志位
@@ -87,15 +84,15 @@ void FOC_Init(void)
     {
         SetBit(DRV_CR, DDIR); // 反转标志位
     }
-
-		/* 过调制 */
-		#if (OverModulation == Enable)
+    
+    /* 过调制 */
+    #if (OverModulation == Enable)
     {
         SetBit(FOC_CR1, OVMDL); // 过调制
     }
     #endif // end OverModulation
-	/* 单电阻采样; 需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式 */
-	#if (Shunt_Resistor_Mode == Single_Resistor)
+    /* 单电阻采样; 需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式 */
+    #if (Shunt_Resistor_Mode == Single_Resistor)
     {
         SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
         FOC_TSMIN = PWM_TS_LOAD; // 最小采样窗口
@@ -103,45 +100,44 @@ void FOC_Init(void)
         // 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
         ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
     }
-	/* 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia Ib */
-	#elif (Shunt_Resistor_Mode == Double_Resistor) // double resistor sample
+    /* 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia Ib */
+    #elif (Shunt_Resistor_Mode == Double_Resistor) // double resistor sample
     {
         SetReg(FOC_CR1, CSM0 | CSM1, CSM0);
         FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
         FOC_TRGDLY = 0x07;       // ADC采样的时刻,采样时刻在计数器零点附近与单电阻不同
         // 如:0x83为下降沿结束前3个clock采样Ia 0x01为上升沿开始后第一个clock开始采样。根据实际情况调整。
         FOC_TBLO = PWM_DLOWL_TIME; // 下桥臂最小脉冲,保证采样
-			/*五段式或七段式选择*/
-			#if (SVPMW_Mode == SVPWM_7_Segment)
+        /*五段式或七段式选择*/
+        #if (SVPMW_Mode == SVPWM_7_Segment)
         {
             ClrBit(FOC_CR2, F5SEG); // 7段式
         }
-      #elif (SVPMW_Mode == SVPWM_5_Segment)
+        #elif (SVPMW_Mode == SVPWM_5_Segment)
         {
             SetBit(FOC_CR2, F5SEG); // 5段式
         }
-      #endif
-				
-      #if (DouRes_Sample_Mode == DouRes_1_Cycle)
+        #endif
+        #if (DouRes_Sample_Mode == DouRes_1_Cycle)
         {
             ClrBit(FOC_CR2, DSS); // 7段式
         }
-      #elif (DouRes_Sample_Mode == DouRes_2_Cycle)
+        #elif (DouRes_Sample_Mode == DouRes_2_Cycle)
         {
             SetBit(FOC_CR2, DSS); // 5段式
         }
-       #endif                                        // end DouRes_Sample_Mode
+        #endif                                        // end DouRes_Sample_Mode
     }
-		/*三电阻采样*/
-		#elif (Shunt_Resistor_Mode == Three_Resistor) // signel resistor sample
+    /*三电阻采样*/
+    #elif (Shunt_Resistor_Mode == Three_Resistor) // signel resistor sample
     {
         SetReg(FOC_CR1, CSM0 | CSM1, CSM0 | CSM1); // 三电阻
         FOC_TSMIN = PWM_DT_LOAD;                   // 死区补偿值
         FOC_TRGDLY = 0x06;                         // ADC采样的时刻,采样时刻在计数器零点附近与单电阻不同。
         // 如:0x83为下降沿结束前3个clock采样Ia,0x01为上升沿开始后第一个clock开始采样。根据实际情况调整。
         FOC_TBLO = PWM_OVERMODULE_TIME; // 过调制电流采样处理的TB脉宽
-			 /* 五段式或七段式选择 */
-			 #if (SVPMW_Mode == SVPWM_7_Segment)
+        /* 五段式或七段式选择 */
+        #if (SVPMW_Mode == SVPWM_7_Segment)
         {
             ClrBit(FOC_CR2, F5SEG); // 7段式
         }
@@ -150,7 +146,6 @@ void FOC_Init(void)
             SetBit(FOC_CR2, F5SEG); // 5段式
         }
         #endif // end SVPMW_Mode
-				
         #if (DouRes_Sample_Mode == DouRes_1_Cycle)
         {
             ClrBit(FOC_CR2, DSS); // 7段式
@@ -162,12 +157,12 @@ void FOC_Init(void)
         #endif // end DouRes_Sample_Mode
     }
     #endif // end Shunt_Resistor_Mode
-		/* 使能电流基准校正 */
-		#if (CalibENDIS == Enable)
+    /* 使能电流基准校正 */
+    #if (CalibENDIS == Enable)
     {
         if (mcCurOffset.OffsetFlag == 1)
         {
-           #if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻校正
+            #if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻校正
             {
                 /*set ibus current sample offset*/
                 SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
@@ -178,7 +173,7 @@ void FOC_Init(void)
                 /*set ia, ib current sample offset*/
                 SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
                 FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
-
+            
                 SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
                 FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
             }
@@ -187,10 +182,10 @@ void FOC_Init(void)
                 /*set ibus current sample offset*/
                 SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
                 FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
-
+            
                 SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
                 FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
-
+            
                 SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
                 FOC_CSO = mcCurOffset.Iw_busOffset; // 写入IC的偏置
             }
@@ -230,44 +225,47 @@ void Motor_Charge(void)
         ClrBit(DRV_CR, OCS);
         mcFocCtrl.ChargeStep = 0;
     }
-
+    
     if ((mcFocCtrl.State_Count < CHARGE_TIME) && (mcFocCtrl.ChargeStep == 0))
     {
         mcFocCtrl.ChargeStep = 1;
         DRV_CMR |= 0x01; // U相下桥臂通
         MOE = 1;
     }
-
+    
     if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 20)) && (mcFocCtrl.ChargeStep == 1))
     {
         mcFocCtrl.ChargeStep = 2;
         DRV_CMR |= 0x04; // V相下桥臂通
     }
-
+    
     if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 40)) && (mcFocCtrl.ChargeStep == 2))
     {
         mcFocCtrl.ChargeStep = 3;
         DRV_CMR |= 0x10; // W相下桥臂通
     }
+    
     if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 60)) && (mcFocCtrl.ChargeStep == 3))
     {
         mcFocCtrl.ChargeStep = 4;
-//        DRV_CMR &= 0x0000;
-//        DRV_CMR = 0x0ABF;
-//        DRV_DR = 0.975 * DRV_ARR;
+        //        DRV_CMR &= 0x0000;
+        //        DRV_CMR = 0x0ABF;
+        //        DRV_DR = 0.975 * DRV_ARR;
     }
+    
     if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 75)) && (mcFocCtrl.ChargeStep == 4))
     {
         mcFocCtrl.ChargeStep = 5;
         DRV_CMR &= 0x0000;
         DRV_CMR = 0x003f;
     }
+    
     if ((mcFocCtrl.State_Count <= (CHARGE_TIME - 76)) && (mcFocCtrl.ChargeStep == 5))
     {
         mcFocCtrl.State_Count = 0;
         mcFocCtrl.ChargeStep = 6;
     }
-
+    
     #if (IPMTEST == Enable)
     {
         if (mcFocCtrl.ChargeStep == 6)
@@ -302,8 +300,8 @@ void Motor_Align(void)
         FOC_EKI = OBSW_KI_GAIN_START;
         /*配置预定位角度*/
         FOC__THETA = Align_Theta;
-				/*********PLL或SMO**********/
-				#if (EstimateAlgorithm == SMO)
+        /*********PLL或SMO**********/
+        #if (EstimateAlgorithm == SMO)
         {
             FOC__ETHETA = FOC__THETA - 4096;
         }
@@ -325,17 +323,17 @@ void Motor_Align(void)
 void Motor_FocTailWind_Open(void)
 {
     /* 启动方式选择 */
-//    FOC_EFREQACC = 500;
-//    FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
-//    FOC_EFREQHOLD = MOTOR_OMEGA_RAMP_END;
-	                    FOC_QKP = QKP;
-                    FOC_QKI = QKI;
-                    FOC_DKP = DKP;
-                    FOC_DKI = DKI;
+    //    FOC_EFREQACC = 500;
+    //    FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
+    //    FOC_EFREQHOLD = MOTOR_OMEGA_RAMP_END;
+    FOC_QKP = QKP;
+    FOC_QKI = QKI;
+    FOC_DKP = DKP;
+    FOC_DKI = DKI;
     mcFocCtrl.State_Count = 0;   // 取消ATO爬坡
     FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
     FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
-	  FOC_IQREF = IQ_RUN_CURRENT;
+    FOC_IQREF = IQ_RUN_CURRENT;
 }
 
 /**
@@ -356,8 +354,8 @@ void Motor_Static_Open(void)
     FOC_QKI = QKI_Start;
     FOC_EKP = OBSW_KP_GAIN_START;
     FOC_EKI = OBSW_KI_GAIN_START;
-		/*启动方式选择*/
-		#if (Open_Start_Mode == Omega_Start) // Omega 启动
+    /*启动方式选择*/
+    #if (Open_Start_Mode == Omega_Start) // Omega 启动
     {
         FOC_EFREQACC = MOTOR_OMEGA_RAMP_ACC;
         FOC_EFREQMIN = MOTOR_OMEGA_RAMP_MIN;
@@ -382,8 +380,8 @@ void Motor_Static_Open(void)
         SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
     }
     #endif // end Open_Start_Mode
-		/*不同启动方式下,切换到MCRUN状态*/
-		#if (Open_Start_Mode == Open_Start) // OPEN状态启动时拖动多次
+    /*不同启动方式下,切换到MCRUN状态*/
+    #if (Open_Start_Mode == Open_Start) // OPEN状态启动时拖动多次
     {
         mcFocCtrl.State_Count = 0;
         FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
@@ -391,8 +389,8 @@ void Motor_Static_Open(void)
     }
     #elif (Open_Start_Mode == Omega_Start)
     {
-				/*********PLL或SMO**********/
-				#if (EstimateAlgorithm == SMO || EstimateAlgorithm == AO)
+        /*********PLL或SMO**********/
+        #if (EstimateAlgorithm == SMO || EstimateAlgorithm == AO)
         {
             mcFocCtrl.State_Count = ATO_START_HOLDTIME + (ATO_RAMP_PERIOD << 2); // ATO 爬坡控制时间
         }
@@ -423,31 +421,6 @@ void MC_Break(void)
     DRV_DR = 0.95 * DRV_ARR;// ARR+4为全开
 }
 
-/**
-    @brief     控制变量上电初始化,包括保护参数的初始化、电机状态初始化
-    @brief     上电只运行一次
-    @date      2022-07-14
-*/
-void MotorcontrolInit(void)
-{
-    /*****电机状态机时序变量***********/
-    McStaSet.SetMode = 0;
-		/**********电机目标方向*************/
-		#if (FR_MODE == CW)
-    {
-        mcFocCtrl.FR = CW;
-    }
-    #else
-    {
-        mcFocCtrl.FR = CCW;
-    }
-     #endif // end IRMODE
-    /* -----电流偏置校准变量初始化----- */
-    mcCurOffset.IuOffsetSum = 16383;
-    mcCurOffset.IvOffsetSum = 16383;
-    mcCurOffset.Iw_busOffsetSum = 16383;
-    mcPwmInput.TimerARR = 65535;
-}
 
 /**
     @brief     初始化电机参数,每次电机启动均会被调用
@@ -464,7 +437,6 @@ void VariablesPreInit(void)
     mcFocCtrl.Flg_ATORampEnd = 0;
     /* -----电机功率参数初始化----- */
     mcFocCtrl.sqrtUdq = 0;
-
     mcFocCtrl.NTCValueGatherFlag = 1; // 上电即采集NTC信号
 }
 
@@ -478,9 +450,9 @@ void VariablesPreInit(void)
 void GetCurrentOffset(void)
 {
     SetBit(ADC_CR, ADCBSY); // 使能ADC
-
+    
     while (ReadBit(ADC_CR, ADCBSY));
-
+    
     #if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻模式
     {
         mcCurOffset.Iw_busOffsetSum += ((ADC4_DR & 0x7ff8));
@@ -513,7 +485,7 @@ void GetCurrentOffset(void)
     }
     #endif
     mcCurOffset.OffsetCount++;
-
+    
     if (mcCurOffset.OffsetCount > Calib_Time)
     {
         mcCurOffset.OffsetFlag = 1;
@@ -558,17 +530,13 @@ void Motor_Ready(void)
 void Motor_Init(void)
 {
     #if (Shunt_Resistor_Mode == Single_Resistor)
-    {
-        ClrBit(ADC_MASK, CH4EN); // 关闭软件电流采样的ADC  FOC模块会自动调用相应ADC 无需外部使能
-    }
+    ClrBit(ADC_MASK, CH4EN); // 关闭软件电流采样的ADC  FOC模块会自动调用相应ADC 无需外部使能
     #else
-    {
-        ClrBit(ADC_MASK, CH4EN | CH1EN | CH0EN); // 关闭软件电流采样的ADC  FOC模块会自动调用相应ADC 无需外部使能
-    }
+    ClrBit(ADC_MASK, CH4EN | CH1EN | CH0EN); // 关闭软件电流采样的ADC  FOC模块会自动调用相应ADC 无需外部使能
     #endif
     VariablesPreInit(); // 电机相关变量初始化
     PI_Init();          // PI初始化
-                        //    PI2_Init();                                    // PI初始化
+    // PI2_Init();                                    // PI初始化
     PI3_Init();         // PI初始化
 }
 
@@ -582,15 +550,15 @@ void Motor_TailWind(void)
     {
         SetBit(DRV_CR, DRVEN); // 计数器使能      0-->Disable 1-->Enable
         McStaSet.SetFlag.TailWindSetFlag = 1;
-       #if (TAILWIND_MODE == RSDMethod)
+        #if (TAILWIND_MODE == RSDMethod)
         RSDDetectInit();
-       #elif (TAILWIND_MODE == BEMFMethod)
+        #elif (TAILWIND_MODE == BEMFMethod)
         BEMFDetectInit();
-       #elif (TAILWIND_MODE == FOCMethod)
+        #elif (TAILWIND_MODE == FOCMethod)
         FocDetectInit();
-       #endif
+        #endif
     }
-
+    
     #if (TAILWIND_MODE == RSDMethod)
     {
         if (mcFocCtrl.State_Count > 0) // 顺逆风检测时间结束前判断转速
@@ -635,21 +603,20 @@ void Motor_TailWind(void)
     {
         if (mcFocCtrl.State_Count == 0) // 顺逆风检测时间结束判断转速
         {
-           
-            if ((mcFocCtrl.SpeedFlt >= S_Value(100))&&mcFocCtrl.EMFsquare>=400) // 需要增加 判断保持时间
+            if ((mcFocCtrl.SpeedFlt >= S_Value(100)) && mcFocCtrl.EMFsquare >= 400) // 需要增加 判断保持时间
             {
                 mcFocCtrl.Start_Mode = TAILWIND_START;
                 mcState = mcStart;
             }
-						else if ((mcFocCtrl.SpeedFlt < -S_Value(80))&&mcFocCtrl.EMFsquare>=400)
-						{
+            else if ((mcFocCtrl.SpeedFlt < -S_Value(80)) && mcFocCtrl.EMFsquare >= 400)
+            {
                 McStaSet.SetFlag.TailWindSetFlag = 0;  // 清除 顺逆风检测初始标志
                 mcFocCtrl.State_Count = 2000;          // 逆风刹车时间,刹车结束会切回重新进行顺逆风检测
                 mcFocCtrl.Start_Mode = HEADWIND_START; // 逆风启动
                 mcState = mcStart;                     // 状态机切换到Start
             }
-						else
-						{
+            else
+            {
                 mcFocCtrl.Start_Mode = STATIC_START;
                 mcState = mcStart;
             }
@@ -677,7 +644,7 @@ void MC_Stop(void)
         #else
         {
             MOE = 0;
-            MC_Break(); 
+            MC_Break();
             mcState = mcBrake;
             mcFocCtrl.State_Count = StopWaitTime;
         }

+ 7 - 3
User/Source/MotorProtect.c

@@ -1,9 +1,13 @@
+/**
+ * @copyright None
+ * @file      MotorProtect.c
+ * @author    Comment Vivre 
+ * @date      2024-08-26
+ * @brief     None
+ */
 #include <FU68xx_5.h>
 #include <Myproject.h>
 
-/* Private variables ---------------------------------------------------------*/
-
-/* Private variables ---------------------------------------------------------*/
 FaultStateType data mcFaultSource; ///< 故障类型
 uint8 xdata mcPOSTErrSource;       ///< 自检故障类型
 FaultVarible xdata fault;          ///< 故障检测相关结构体变量

+ 48 - 45
User/Source/main.c

@@ -1,7 +1,7 @@
 /**
  * @copyright None
  * @file      main.c
- * @author    Comment Vivre 
+ * @author    Comment Vivre
  * @date      2024-08-26
  * @brief     None
  */
@@ -25,16 +25,16 @@ static void DebugSet(void);
 */
 static void DebugSet(void)
 {
-   #if (DBG_MODE == DBG_SPI_HW) // 硬件调试模式
+    #if (DBG_MODE == DBG_SPI_HW) // 硬件调试模式
     SPI_Init();
     Set_DBG_DMA(&HARD_SPIDATA);
-   #elif (DBG_MODE == DBG_SPI_SW) // 软件调试模式
+    #elif (DBG_MODE == DBG_SPI_SW) // 软件调试模式
     SPI_Init();
     Set_DBG_DMA((uint16)spidebug);
-   #elif (DBG_MODE == DBG_UART)
+    #elif (DBG_MODE == DBG_UART)
     UART2_Init();
     Conf_DMA(1, XDATA_UART1, (uint16)GetAddr_UARTDBG(), BUFFLEN);
-   #endif
+    #endif
 }
 
 /**
@@ -56,10 +56,8 @@ static void HardwareInit(void)
     ADC_Init(); /* 初始化需要在Driver之前 */
     Driver_Init();
     AMP_Init();
-
-
-	// Timer3_Init();
-	// Timer2_Init();
+    // Timer3_Init();
+    // Timer2_Init();
     /******温度配置初始化**********/
     TSD_Init();
     /*  比较器中断配置,与CMP3硬件配置间隔一段时间等待硬件稳定  */
@@ -77,7 +75,20 @@ static void HardwareInit(void)
 */
 static void SoftwareInit(void)
 {
-    MotorcontrolInit();
+	    // 电机状态机时序变量
+    McStaSet.SetMode = 0;
+		// 电机目标方向
+		#if (FR_MODE == CW)
+	mcFocCtrl.FR = CW;
+		#else
+	mcFocCtrl.FR = CCW;
+	#endif // end IRMODE
+    /* -----电流偏置校准变量初始化----- */
+    mcCurOffset.IuOffsetSum = 16383;
+    mcCurOffset.IvOffsetSum = 16383;
+    mcCurOffset.Iw_busOffsetSum = 16383;
+    mcPwmInput.TimerARR = 65535;
+	
     mcState = mcReady;
     mcFaultSource = FaultNoSource;
 }
@@ -88,7 +99,6 @@ static void SoftwareInit(void)
 */
 void VREFConfigInit(void)
 {
-/************************VREF&VHALF Config************************/
     #if (HW_ADC_VREF == VREF3_0)
     {
         SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
@@ -109,41 +119,40 @@ void VREFConfigInit(void)
         ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
         SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
     }
-   #endif
-		
-	// VHALF电压配置 00:1/8VREF  01:1/4VREF 10:25/64VREF 11:1/2VREF(default)
-	#if (HW_VHALF_SEL == VHALF1_8)
-    ClrBit(VREF_VHALF_CR, VHALFSEL1);
-    ClrBit(VREF_VHALF_CR, VHALFSEL0);
-  #elif (HW_VHALF_SEL == VHALF1_4)
-    ClrBit(VREF_VHALF_CR, VHALFSEL1);
-    SetBit(VREF_VHALF_CR, VHALFSEL0);
-  #elif (HW_VHALF_SEL == VHALF25_64)
+    #endif
+    // VHALF电压配置 00:1/8VREF  01:1/4VREF 10:25/64VREF 11:1/2VREF(default)
+    #if (HW_VHALF_SEL == VHALF1_8)
+    {
+        ClrBit(VREF_VHALF_CR, VHALFSEL1);
+        ClrBit(VREF_VHALF_CR, VHALFSEL0);
+    }
+    #elif (HW_VHALF_SEL == VHALF1_4)
+    {
+        ClrBit(VREF_VHALF_CR, VHALFSEL1);
+        SetBit(VREF_VHALF_CR, VHALFSEL0);
+    }
+    #elif (HW_VHALF_SEL == VHALF25_64)
     {
         SetBit(VREF_VHALF_CR, VHALFSEL1);
         ClrBit(VREF_VHALF_CR, VHALFSEL0);
     }
-  #elif (HW_VHALF_SEL == VHALF1_2)
+    #elif (HW_VHALF_SEL == VHALF1_2)
     {
         SetBit(VREF_VHALF_CR, VHALFSEL1);
         SetBit(VREF_VHALF_CR, VHALFSEL0);
     }
-  #else
+    #else
+#error " VHALF MODE Err "
+    #endif
+    #if (VREF_OUT_EN)
     {
-        #error " VHALF MODE Err "
+        SetBit(P3_AN, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚,需同步配置输出
+        SetBit(P3_OE, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚
     }
     #endif
-		
-   #if (VREF_OUT_EN)
-    SetBit(P3_AN, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚,需同步配置输出
-    SetBit(P3_OE, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚
-   #endif
-		
-   #if (VHALF_EN)
-    //    SetBit(P3_AN, P32);
+    #if (VHALF_EN)
     SetBit(VREF_VHALF_CR, VHALFEN); // VREF_VHALF_CR = 0x11;
     #endif
-		
     SetBit(VREF_VHALF_CR, VREFEN);
 }
 
@@ -154,19 +163,13 @@ void VREFConfigInit(void)
 void main(void)
 {
     uint16 PowerUpCnt = 0;
-
+    
     /* ----- 上电空指令延时 等待系统稳定 ----- */
     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
-
-    /* ----- 部分变量初始化 ----- */
-    SoftwareInit();
-    /* ----- 硬件初始化,配置MCU外设 ----- */
-    HardwareInit();
-    #if (DBG_MODE != DBG_DISABLE) // 调试小工具
-    /* -----debug配置(SPI调试),量产程序可以删除----- */
-    DebugSet();
-    #endif
-
+    
+    SoftwareInit();                 // 部分变量初始化
+    HardwareInit();                 // 硬件初始化
+    
     while (1)
     {
         /* -----获取电流采样偏置电压----- */
@@ -178,7 +181,7 @@ void main(void)
         {
             /* -----电机控制状态机----- */
             MC_Control();
-
+            
             if (g_1mTick)
             {
                 TickCycle_1ms();