Ver código fonte

feat:补充调速模式

1.添加电压挡位调速
2.配置ADC
3.添加功率补偿闭环
4.调整代码格式
Comment.Vivre 1 ano atrás
pai
commit
ae50eabe3a

+ 23 - 10
User/Include/Customer.h

@@ -189,12 +189,13 @@
 
 /**
  * 闭环方式选择
- * @param (CURRENT_LOOP_CONTROL)       电流环
- * @param (SPEED_LOOP_CONTROL)         速度环
- * @param (POWER_LOOP_CONTROL)         功率环
- * @param (UQ_LOOP_CONTROL)            UQ环
+ * @param (CURRENT_LOOP_CONTROL)		电流环
+ * @param (SPEED_LOOP_CONTROL)			速度环
+ * @param (POWER_LOOP_CONTROL)			功率环
+ * @param (UQ_LOOP_CONTROL)				UQ环
+ * @param (UQ_POWER_CONTROL)			UQ环+功率补偿
  */
-#define MOTOR_CTRL_MODE                 (SPEED_LOOP_CONTROL)    // 闭环方式选择
+#define MOTOR_CTRL_MODE                 (UQ_POWER_CONTROL)    // 闭环方式选择
 #define LOOP_TIME                       (2)                     // (ms) 外环环调节周期,默认为 1ms
 
 #define SKP                             _Q12(0.5)               // 外环KP     
@@ -210,12 +211,24 @@
 
 /**
  * 闭环方式选择
- * @param (PWMMODE)       PWM调速
- * @param (SREFMODE)      模拟调速
- * @param (NONEMODE)      直接给定值,不调速
- * @param (ONOFFTEST)     启停测试工具
+ * @param (PWMMODE)			PWM调速
+ * @param (SREFMODE)		模拟调速
+ * @param (SREFKEYMODE)		电压模拟按键调试
+ * @param (NONEMODE)		直接给定值,不调速
+ * @param (ONOFFTEST)		启停测试工具
  */
-#define SPEED_MODE                      (ONOFFTEST)              // 闭环方式选择  
+#define SPEED_MODE                      (SREFKEYMODE)			// 闭环方式选择  
+
+/**
+ * @brief VSP调速开关机设置
+ */
+#define VSP_OFF_MIN						704		// 0.15V		// 小于该电压关机
+#define VSP_ON_MIN						1173	// 0.25V		// 大于该电压开机
+
+/**
+ * @brief 定速模式速度给定
+ */
+#define NONE_MODE_SPEED 				S_Value(1650)
 
 /**
  * PWM调速 PWM极性选择

+ 22 - 10
User/Include/Declaration.h

@@ -14,6 +14,20 @@
     @brief 状态处理函数
 */
 void FiniteStateManger(void);
+/**
+    @brief 定时任务
+*/
+void TickCycle(void);
+
+/**
+    @brief 环路响应
+*/
+void LoopResponse(void);
+
+/**
+    @brief 获取环路目标参数
+*/
+void GetTargetRef(void);
 
 void VariablesPreInit(void);
 void GetCurrentOffset(void);
@@ -30,16 +44,14 @@ void Motor_TailWind(void);
 void McTailWindDealwith(void);
 void TailWindDealwith(void);
 
-void   TargetRef_Process(void);
-void   Speed_response(void);
-int16   Motor_Ramp(int16 ref);
-void   VSPSample(void);
-void   ONOFF_Starttest(void);
-void   ATORamp(void);
-void   TickCycle_1ms(void);
-void   PWMInputCapture(void);
-void   FGOutput(void);
-void   Fault_GetCurrentOffset(void);
+
+int16 Motor_Ramp(int16 ref);
+void VSPSample(void);
+void ONOFF_Starttest(void);
+void ATORamp(void);
+void PWMInputCapture(void);
+void FGOutput(void);
+void Fault_GetCurrentOffset(void);
 uint32 Abs_F32(int32 value);
 
 // 保护相关

+ 7 - 5
User/Include/SystemDefinition.h

@@ -32,7 +32,7 @@
 #define TIM2_Fre                        (187500.0)      ///< 定时器频率
 
 /* 使能定义 */
-#define Disable                         (0)                              
+#define Disable                         (0)
 #define Enable                          (1)
 
 /* 转向定义 */
@@ -61,15 +61,15 @@
 #define AMP8x                           (8)
 #define AMP16x                          (16)
 
-/* --驱动电平设置-- */  
+/* --驱动电平设置-- */
 #define HIGH_LEVEL                      (0xA0)          ///< 驱动高电平有效
 #define LOW_LEVEL                       (0xB0)          ///< 驱动低电平有效
 #define UP_H_DOWN_L                     (0xC0)          ///< 上桥臂高电平有效,下桥臂低电平有效
 #define UP_L_DOWN_H                     (0xD0)          ///< 上桥臂低电平有效,下桥臂高电平有效
 
 /***正PWMduty or 负PWMduty Choose***/
-#define PosiPWMDUTY			            (0xA0)          // 正PWMduty
-#define NegaPWMDUTY				        (0xB0)          // 负PWMduty
+#define PosiPWMDUTY                     (0xA0)          // 正PWMduty
+#define NegaPWMDUTY                     (0xB0)          // 负PWMduty
 
 #define SPEED_K                         ((float)(MOTOR_SPEED_MAX_RPM-MOTOR_SPEED_MIN_RPM)/(float)(MAXPWMDuty-MINPWMDuty))
 
@@ -87,6 +87,7 @@
 #define POWER_LOOP_CONTROL              (0xB0)          ///< 恒功率
 #define SPEED_LOOP_CONTROL              (0xC0)          ///< 恒转速
 #define UQ_LOOP_CONTROL                 (0xD0)          ///< UQ闭环
+#define UQ_POWER_CONTROL                (0xF0)          ///< UQ闭环+功率补偿
 #define OTHERS_LOOP_CONTROL             (0xE0)          ///< 其他环路,自定义
 
 #define ALIGN_DSIABLE                   (0xA0)          ///< 禁止 
@@ -98,6 +99,7 @@
 #define NONEMODE                        (0xA0)          ///< 直接给定值,不调速
 #define PWMMODE                         (0xB0)          ///< PWM调速
 #define SREFMODE                        (0xC0)          ///< 模拟调速
+#define SREFKEYMODE                     (0xD0)          // 电压模拟按键调速
 #define ONOFFTEST                       (0xE0)          ///< 启停测试工具   
 #define OTHERS                          (0xF0)          ///< 其他调速方式   
 
@@ -131,7 +133,7 @@
 #define Double_Resistor                 (0xB0)          ///< 双电阻电流采样模式
 #define Three_Resistor                  (0xC0)          ///< 三电阻电流采样模式
 
-    
+
 #define Long_Inject                     (0)             ///< 脉冲注入时间长于2ms,若时间长于4ms,则要修改定时器分频
 #define Short_Inject                    (1)             ///< 脉冲注入时间低于2ms
 

+ 11 - 11
User/Include/VaribleDef.h

@@ -370,14 +370,8 @@ extern FaultRecoverTypedef          xdata   Restart;
 
 typedef struct
 {
-    uint16 mcDcbusFlt;      // 母线电压
     uint8 CtrlMode;        // 控制模式
     
-    int16  Power;            // 当前功率
-    int16  PowerFlt;         // 功率滤波后的值
-    int16  SpeedFlt;         // 当前速度滤波后的值
-    int16  UqFlt;            // Q轴电压
-    int16  UdFlt;           // D轴电压
     
     uint8  ChargeStep;      // 预充电的步骤
     uint8  Start_Mode;      // 启动方式
@@ -385,13 +379,13 @@ typedef struct
     uint8  FR_SET;
     uint8  FR;
     uint8  Flg_ATORampEnd;
-    
+	
     int16  Ref;         // 控制目标给定
     int16  IqRef;       // Q轴给定电流
     int16  IdRef;       // D轴给定电流
     int16  IqSpeedRef;   // Q轴速度给定电流
-    int16  IqADCCurrentRef;   // Q轴母线电流给定电流
-    
+    unsigned short LoopCalcValue;
+	
     int16 ExtDec;
     int16 LimitIqOut; // 限制功率输出
     uint16 PowerLimitValue; // 功率限制的值
@@ -401,12 +395,18 @@ typedef struct
     uint16 RunStateCnt;     // 运行状态计数
     uint8 LoopTime;         // 外环控制周期计数
     uint16 State_Count;     // 电机各个状态的时间计数
-    int16  mcPosCheckAngle;// 位置检测的角度
+    int16  mcPosCheckAngle;	// 位置检测的角度
     uint8  MCU_TEMP;        //MCU超过70°后,读取当前温度值
     int16  Angle;            //弱磁角度
     
+    uint16 mcDcbusFlt;      // 母线电压
+    int16 Power;            // 当前功率
+    int16 SpeedFlt;         // 当前速度滤波后的值
+    int16 UqFlt;            // Q轴电压
+    int16 UdFlt;			// D轴电压
     int16 NTCValue;
-    int16 NTCValueFlt;
+	int16 Is;				// 母线电流
+	int16 SREFValue;
 } FOCCTRL;
 extern FOCCTRL xdata mcFocCtrl;
 

+ 32 - 35
User/Source/ADC.c

@@ -1,43 +1,40 @@
-/* --------------------------- (C) COPYRIGHT 2021 Fortiortech ShenZhen -----------------------------
-    File Name      : ADC.c
-    Author         : Fortiortech  Appliction Team
-    Version        : V1.0
-    Date           : 2021-04-11
-    Description    : This file contains .C file function used for Motor Control.
-----------------------------------------------------------------------------------------------------  
-                                       All Rights Reserved
-------------------------------------------------------------------------------------------------- */
-
-
-
+/**
+ * @copyright None
+ * @file      ADC.c
+ * @author    Comment Vivre
+ * @date      2024-08-28
+ * @brief     None
+ */
 #include <Myproject.h>
 
 
+/**
+ * @function     ADC_Init
+ * @brief        ADC端口初始化
+ * @param[in]    None
+ * @return       None
+ * @date         2024-08-28
+*/
 void ADC_Init(void)
 {
-    /********************ADC 端口模拟功能设置************************/
-    SetBit(P2_AN , PIN0);	//AD0 P20 CH open--IU--固定
-    SetBit(P2_AN , PIN3);	//AD1 P23 CH open--IV--固定 
-    SetBit(P2_AN , PIN4);	//AD2 P24 CH open--IV--固定     
-    SetBit(P2_AN , PIN5);	//AD3 P25 CH open
-    SetBit(P2_AN , PIN7);	//AD4 P27 CH open--IBUS/IW--固定
-	
-//	SetBit(P3_AN , PIN2);	//AD5 P32 CH open
-//	SetBit(P3_AN , PIN3);	//AD6 P33 CH open
-	SetBit(P3_AN , PIN4);	//AD7 P34 CH open
-//	SetBit(P2_AN , PIN1);	//AD8 P21 CH open
-//	SetBit(P1_AN , PIN6);	//AD9 P16 CH open
-//	SetBit(P1_AN , PIN4);	//AD10 P14 CH open
-//	SetBit(P2_AN , PIN6);	//AD11 P26 CH open
-//	SetBit(P1_AN , PIN3);	//AD12 P13 CH open
-//	SetBit(P1_AN , PIN5);	//AD13 P15 CH open
-	/****************************************************************/
-    SetBit(ADC_MASK , CH0EN | CH1EN | CH2EN| CH3EN | CH4EN | CH7EN| CH11EN);   //通道使能
-    
-    SetBit(ADC_CR , ADCALIGN); 		//ADC数据次高位对齐使能0-->Disable	1-->Enable
+    // SetBit(P2_AN, PIN0);    //AD0 P20 CH open--IU--固定
+    // SetBit(P2_AN, PIN3);    //AD1 P23 CH open--IV--固定
+    SetBit(P2_AN, PIN4);    //AD2 P24 OVP	√
+    // SetBit(P2_AN, PIN5);    //AD3 P25 CH open
+    SetBit(P2_AN, PIN7);    //AD4 P27 CH open--IBUS/IW--固定
+    // SetBit(P3_AN , PIN2);   //AD5 P32 CH open
+    // SetBit(P3_AN , PIN3);   //AD6 P33 CH open
+    // SetBit(P3_AN, PIN4);    //AD7 P34 CH open
+    SetBit(P2_AN, PIN1);   //AD8 P21 MOS	√
+    SetBit(P1_AN, PIN6);   //AD9 P16 VSP
+    // SetBit(P1_AN , PIN4);   //AD10 P14 CH open
+    // SetBit(P2_AN , PIN6);   //AD11 P26 CH open
+    // SetBit(P1_AN , PIN3);   //AD12 P13 CH open
+    // SetBit(P1_AN , PIN5);   //AD13 P15 CH open
+    SetBit(ADC_MASK,CH2EN | CH4EN | CH8EN | CH9EN);  //通道使能
+    SetBit(ADC_CR, ADCALIGN);       //ADC数据次高位对齐使能0-->Disable 1-->Enable
     ADC_SCYC  = 0x36;
-
-    ClrBit(ADC_CR , ADCIE); 		//ADC中断使能
-    SetBit(ADC_CR , ADCEN);         //Enable ADC0
+    ClrBit(ADC_CR, ADCIE);          //ADC中断使能
+    SetBit(ADC_CR, ADCEN);          //Enable ADC0
 }
 

+ 111 - 102
User/Source/AddFunction.c

@@ -130,9 +130,9 @@ void PWMDutyCal(void)
 void VSPSample(void)
 {
     static int16 VSP = 0;
-	
     VSP = LPFFunction(ADC7_DR, VSP, 10); // 注意低通滤波器系数范围为0---127
-	if (VSP > ONPWMDuty)
+    
+    if (VSP > ONPWMDuty)
     {
         isCtrlPowOn = 1; // 开机
     }
@@ -167,6 +167,73 @@ void VSPSample(void)
     }
 }
 
+/**
+ * @function     GetSrefKeyGear
+ * @brief        根据电压挡位确定输出
+ * @param[in]    None
+ * @return       None
+ * @date         2024-08-28
+*/
+void GetSrefKeyGear(void)
+{
+    static uint8 powONHoldCnt   = 0;
+    static uint8 powOFFHoldCnt  = 0;
+    
+    if (isCtrlPowOn) // 开机状态
+    {
+        if (mcFocCtrl.SREFValue < VSP_OFF_MIN)
+        {
+            powOFFHoldCnt ++;
+            
+            if (powOFFHoldCnt > 50)
+            {
+                powOFFHoldCnt = 0;
+                isCtrlPowOn = false; // 关机
+            }
+            
+            powONHoldCnt = 0;
+        }
+    }
+    else    // 关机状态
+    {
+        if (mcFocCtrl.SREFValue > VSP_ON_MIN)
+        {
+            powONHoldCnt ++;
+            
+            if (powONHoldCnt > 50)
+            {
+                powONHoldCnt = 0;
+                isCtrlPowOn = true; // 开机
+            }
+            
+            powOFFHoldCnt = 0;
+        }
+    }
+    
+    //转速曲线计算
+    if (isCtrlPowOn)
+    {
+        // 计算公式为
+        // Ref = ( 区间UQ差 / 区间调速电压差) * (VSP - 调速下限) + 区间最小UQ值
+        if (mcFocCtrl.SREFValue <= 1408)
+        { mcFocCtrl.Ref = _Q15(0.120); }
+        else if (mcFocCtrl.SREFValue <= 11640 )
+        { mcFocCtrl.Ref = 0.864 * (mcFocCtrl.SREFValue -  1408) + _Q15(0.120); }
+        else if (mcFocCtrl.SREFValue <= 15530 )
+        { mcFocCtrl.Ref = 1.238 * (mcFocCtrl.SREFValue - 11640) + _Q15(0.390); }
+        else if (mcFocCtrl.SREFValue <= 19480 )
+        { mcFocCtrl.Ref = 1.543 * (mcFocCtrl.SREFValue - 15530) + _Q15(0.537); }
+        else if (mcFocCtrl.SREFValue <= 21962 )
+        { mcFocCtrl.Ref = 1.755 * (mcFocCtrl.SREFValue - 19480) + _Q15(0.723); }
+        else if (mcFocCtrl.SREFValue <= 23368 )
+        { mcFocCtrl.Ref = 2.004 * (mcFocCtrl.SREFValue - 21962) + _Q15(0.856); }
+        else
+        { mcFocCtrl.Ref = _Q15(0.942); }
+    }
+    else
+    { mcFocCtrl.Ref = 0; }
+}
+
 /**
     @brief        启停测试工具,用于测试启动可靠性
     @date         2022-07-14
@@ -209,7 +276,7 @@ void ONOFF_Test(void)
     @brief        调速信号处理包含:开关机控制、将调速信号处理成控制目标给定信号
     @date         2022-07-14
 */
-void TargetRef_Process(void)
+void GetTargetRef(void)
 {
     #if (SPEED_MODE == PWMMODE)
     {
@@ -221,11 +288,16 @@ void TargetRef_Process(void)
         VSPSample();
         mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
     }
+    #elif (SPEED_MODE == SREFKEYMODE)
+    {
+        GetSrefKeyGear();
+        mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
+    }
     #elif (SPEED_MODE == NONEMODE)
     {
+        isCtrlPowOn = true;
+        mcFocCtrl.Ref = NONE_MODE_SPEED;
         mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
-        isCtrlPowOn = 1; // 开机
-        mcFocCtrl.Ref = S_Value(1650);
     }
     #elif (SPEED_MODE == ONOFFTEST)
     {
@@ -239,7 +311,7 @@ void TargetRef_Process(void)
                  建议使用默认1ms周期运行
     @date         2022-07-14
 */
-void Speed_response(void)
+void LoopResponse(void)
 {
     static int16 refRampOut = 0;
     
@@ -262,12 +334,14 @@ void Speed_response(void)
                         // FOC_THECOMP = _Q15(-25.0 / 180.0); // SMO 估算补偿角
                         // 启动电流环与外环给定衔接
                         #if (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
-						mcRefRamp.OutValue_float = mcFocCtrl.SpeedFlt;
-						#elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
-                        mcRefRamp.OutValue_float = mcFocCtrl.PowerFlt;
-						#elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
-						mcRefRamp.OutValue_float = mcFocCtrl.UqFlt;
-						#endif
+                        mcRefRamp.OutValue_float = mcFocCtrl.SpeedFlt;
+                        #elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
+                        mcRefRamp.OutValue_float = mcFocCtrl.Power;
+                        #elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
+                        mcRefRamp.OutValue_float = mcFocCtrl.UqFlt;
+                        #elif (MOTOR_CTRL_MODE == UQ_POWER_CONTROL)
+                        mcRefRamp.OutValue_float = mcFocCtrl.UqFlt;
+                        #endif
                         mcFocCtrl.LoopTime = LOOP_TIME;
                         mcRefRamp.IncValue = RAMP_INC;
                         mcRefRamp.DecValue = RAMP_DEC;
@@ -275,23 +349,24 @@ void Speed_response(void)
                         FOC_IDREF = ID_RUN_CURRENT; // D轴启动电流
                         PI1_UKH = mcFocCtrl.IqRef;
                         PI2_Init(); // PI初始化
+                        // 弱磁
                         #if (MotorFiledWeakenEn)
-                        {
-                            FiledWeakenInit();
-                        }
+                        FiledWeakenInit();
                         #endif
+                        // 电压补偿
                         VoltageComp.Undervoltage_flag = 0;
-                        VoltageComp.IncVoltage     = _Q15(40.0 / HW_BOARD_VOLT_MAX);
-                        VoltageComp.LineAngel    =  LinearCompensationAngel;
+                        VoltageComp.IncVoltage = _Q15(40.0 / HW_BOARD_VOLT_MAX);
+                        VoltageComp.LineAngel =  LinearCompensationAngel;
                         VoltageComp.LineAngelMax =  LinearCompensationAngel_MAX;
                         VoltageComp.LineAngelMin =  LinearCompensationAngel_MIN;
-                        VoltageComp.VCDelayCnt   =  VoltageCompensationDelayCnt;
+                        VoltageComp.VCDelayCnt =  VoltageCompensationDelayCnt;
                         mcFocCtrl.CtrlMode = 1;
                     }
                 }
                 else
                 { mcFocCtrl.Mode0HoldCnt = 0; }
-				break;
+                
+                break;
             }
             
             case 1:
@@ -310,7 +385,7 @@ void Speed_response(void)
                     #elif (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
                     {
                         mcFocCtrl.IqSpeedRef = HW_One_PI(refRampOut - mcFocCtrl.SpeedFlt);
-                        mcFocCtrl.LimitIqOut = HW_One_PI2(mcFocCtrl.PowerLimitValue - mcFocCtrl.PowerFlt); // 限制功率
+                        mcFocCtrl.LimitIqOut = HW_One_PI2(mcFocCtrl.PowerLimitValue - mcFocCtrl.Power); // 限制功率
                     
                         if ((mcFocCtrl.LimitIqOut < mcFocCtrl.IqSpeedRef)) // 限制输出电流
                         {
@@ -321,14 +396,14 @@ void Speed_response(void)
                         { mcFocCtrl.IqRef = mcFocCtrl.IqSpeedRef; }
                     
                         #if (MotorFiledWeakenEn)
-						FileWeakenControl();
-						#else 
-						FOC_IQREF = mcFocCtrl.IqRef;
-						#endif
+                        FileWeakenControl();
+                        #else
+                        FOC_IQREF = mcFocCtrl.IqRef;
+                        #endif
                     }
                     #elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
                     {
-                        mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.PowerFlt);
+                        mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.Power);
                         FOC_IQREF = mcFocCtrl.IqRef;
                     }
                     #elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
@@ -336,8 +411,17 @@ void Speed_response(void)
                         mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.UqFlt);
                         FOC_IQREF = mcFocCtrl.IqRef;
                     }
-                    #else
+                    #elif (MOTOR_CTRL_MODE == UQ_POWER_CONTROL)
                     {
+                        // 反馈计算
+                        mcFocCtrl.LoopCalcValue = mcFocCtrl.UqFlt * 0.65 + mcFocCtrl.Power * 0.61;
+                    
+                        // 限幅
+                        if (mcFocCtrl.LoopCalcValue > 32440)
+                        { mcFocCtrl.LoopCalcValue = 32440;}
+                    
+                        mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.LoopCalcValue);
+                        FOC_IQREF = mcFocCtrl.IqRef;
                     }
                     #endif
                 }
@@ -350,7 +434,7 @@ void Speed_response(void)
                     { ClrBit(FOC_CR2, F5SEG); }
                 }
                 #endif
-				break;
+                break;
             }
         }
     }
@@ -426,78 +510,3 @@ void ATORamp(void)
     }
 }
 
-/**
-    @brief        默认1ms周期服务函数,运行信号采样,调速信号处理,闭环控制,故障检测,ATO爬坡函数
-                 该函数运行于大循环中,由SYSTICK定时器间隔1ms触发运行。
-    @date         2022-07-14
-*/
-void TickCycle_1ms(void)
-{
-    #if (VoltageCompensationEn == 1)
-    {
-        if (VoltageComp.cpscnt <= VoltageCompensationDelayCnt)
-        { SetBit(ADC_CR, ADCBSY);}
-    }
-    #else
-	// 使能ADC的DCBUS采样
-	SetBit(ADC_CR, ADCBSY); 
-	#endif
-    
-    if ((mcState != mcInit) && (mcState != mcReady))
-    {
-        // 速度滤波
-        mcFocCtrl.SpeedFlt = LPFFunction(FOC__EOME, mcFocCtrl.SpeedFlt, 50); // 注意低通滤波器系数范围为0---127
-        mcFocCtrl.EMFsquare = Sqrt_alpbet(FOC__EALP, FOC__EBET);
-        
-        if (mcState == mcRun)
-        {
-            mcFocCtrl.Power = FOC__POW << 3; // 功率滤波
-            mcFocCtrl.PowerFlt = LPFFunction(mcFocCtrl.Power, mcFocCtrl.PowerFlt, 10);
-        }
-    }
-    else
-    {
-        mcFocCtrl.SpeedFlt = 0;
-        mcFocCtrl.PowerFlt = 0;
-    }
-    
-    // DCbus的采样获取值并滤波
-    #if (VoltageCompensationEn == 1)
-    {
-		// 未进入电压补偿之前在1ms中断里面采集电压,进入之后在载波中断里面采集电压
-        if (VoltageComp.cpscnt <= VoltageCompensationDelayCnt)
-        { mcFocCtrl.mcDcbusFlt = LPFFunction(ADC2_DR, mcFocCtrl.mcDcbusFlt, 50); }
-        
-        if ((mcFocCtrl.CtrlMode == 1) && (mcState == mcRun) && (mcFaultSource == FaultNoSource)) // 进入速度环后进行延时计数
-        {
-            if (VoltageComp.cpscnt < VoltageCompensationDelayCnt + 10)
-            { VoltageComp.cpscnt++; }
-            else
-            { VoltageComp.cpscnt = VoltageCompensationDelayCnt + 10; }
-        }
-        else
-        { VoltageComp.cpscnt = 0; }
-        
-        // 母线电压平均值
-        BusAverageVoltage();
-    }
-    #else
-	mcFocCtrl.mcDcbusFlt = LPFFunction(ADC2_DR, mcFocCtrl.mcDcbusFlt, 50); // 母线电压值滤波
-    #endif
-    mcFocCtrl.NTCValue = ADC7_DR;
-    mcFocCtrl.NTCValueFlt = LPFFunction(mcFocCtrl.NTCValue, mcFocCtrl.NTCValueFlt, 60);
-    mcFocCtrl.UqFlt = LPFFunction(FOC__UQ, mcFocCtrl.UqFlt, 50);
-    mcFocCtrl.UdFlt = LPFFunction(FOC__UD, mcFocCtrl.UdFlt, 50);
-    // 获取调速信号,不同调速模式(PWMMODE,NONEMODE,SREFMODE)的目标值修改
-    TargetRef_Process();
-    // 启动ATO控制,环路响应,如速度环、转矩环、功率环等
-    Speed_response();
-    //故障保护函数功能,如过欠压保护、启动保护、缺相、堵转等
-    Fault_Detection();
-    // 电机启动ATO爬坡函数处理
-    ATORamp();
-    
-    // 电机状态机的时序处理
-    if (mcFocCtrl.State_Count > 0)
-    { mcFocCtrl.State_Count--; }
-}

+ 16 - 19
User/Source/BEMFDetect.c

@@ -1,13 +1,10 @@
-/*  --------------------------- (C) COPYRIGHT 2022 Fortiortech ShenZhen -----------------------------
-    File Name      : BEMFDetect.c
-    Author         : Fortiortech  Appliction Team
-    Version        : V1.1
-    Date           : 2022-07-08
-    Description    : This file contains Bemf detection function used for Motor Control.
-    ----------------------------------------------------------------------------------------------------
-                                       All Rights Reserved
-    ------------------------------------------------------------------------------------------------- */
-
+/**
+ * @copyright None
+ * @file      BEMFDetect.c
+ * @author    Comment Vivre
+ * @date      2024-08-28
+ * @brief     None
+ */
 #include <MyProject.h>
 
 uint8  code table_Bemf_CWNext[6]   = {3, 6, 2, 5, 1, 4};
@@ -130,15 +127,15 @@ static void Time2_Bemf_Init(void)
 void BEMFDetectInit(void)
 {
     //BEMF检测前关闭mos输出
-    mcBemf.BEMFSpeed            = 0;
-    mcBemf.BEMFSpeedBase        = 0;
-    mcBemf.Status               = 0;
-    mcBemf.FR                   = BEMF_FR_ERR;
-    mcBemf.FRPre                = BEMF_FR_ERR;
-    mcBemf.SpeedUpdate          = 0;
-    mcBemf.BEMFSpeedBase        = BEMFSpeedCalBase;
-    mcBemf.HighSpdStart          = 0;
-    mcBemf.FR_SET               = mcFocCtrl.FR;
+    mcBemf.BEMFSpeed = 0;
+    mcBemf.BEMFSpeedBase = 0;
+    mcBemf.Status = 0;
+    mcBemf.FR = BEMF_FR_ERR;
+    mcBemf.FRPre = BEMF_FR_ERR;
+    mcBemf.SpeedUpdate = 0;
+    mcBemf.BEMFSpeedBase = BEMFSpeedCalBase;
+    mcBemf.HighSpdStart = 0;
+    mcBemf.FR_SET = mcFocCtrl.FR;
     /* -----使能比较器----- */
     Cmp_Bemf_Init();
     /* -----使能定时器1用于检测时间----- */

+ 75 - 0
User/Source/MotorControl.c

@@ -235,3 +235,78 @@ void FiniteStateManger(void)
         }
     }
 }
+
+/**
+    @brief        默认1ms周期服务函数,运行信号采样,调速信号处理,闭环控制,故障检测,ATO爬坡函数
+                 该函数运行于大循环中,由SYSTICK定时器间隔1ms触发运行。
+    @date         2022-07-14
+*/
+
+void TickCycle(void)
+{
+    #if (VoltageCompensationEn == 1)
+    {
+        if (VoltageComp.cpscnt <= VoltageCompensationDelayCnt)
+        { SetBit(ADC_CR, ADCBSY);}
+    }
+    #else
+    // 使能ADC的DCBUS采样
+    SetBit(ADC_CR, ADCBSY);
+    #endif
+    
+    if ((mcState != mcInit) && (mcState != mcReady))
+    {
+        // 速度滤波
+        mcFocCtrl.SpeedFlt = LPFFunction(FOC__EOME, mcFocCtrl.SpeedFlt, 50); // 注意低通滤波器系数范围为0---127
+        mcFocCtrl.EMFsquare = Sqrt_alpbet(FOC__EALP, FOC__EBET);
+        mcFocCtrl.Is = Sqrt_alpbet(FOC__IA, FOC__IBET);
+        
+        if (mcState == mcRun)
+        { mcFocCtrl.Power = LPFFunction(FOC__POW << 3, mcFocCtrl.Power, 10); }
+    }
+    else
+    {
+        mcFocCtrl.SpeedFlt = 0;
+        mcFocCtrl.Power = 0;
+    }
+    
+    // DCbus的采样获取值并滤波
+    #if (VoltageCompensationEn == 1)
+    {
+        // 未进入电压补偿之前在1ms中断里面采集电压,进入之后在载波中断里面采集电压
+        if (VoltageComp.cpscnt <= VoltageCompensationDelayCnt)
+        { mcFocCtrl.mcDcbusFlt = LPFFunction(ADC2_DR, mcFocCtrl.mcDcbusFlt, 50); }
+        
+        if ((mcFocCtrl.CtrlMode == 1) && (mcState == mcRun) && (mcFaultSource == FaultNoSource)) // 进入速度环后进行延时计数
+        {
+            if (VoltageComp.cpscnt < VoltageCompensationDelayCnt + 10)
+            { VoltageComp.cpscnt++; }
+            else
+            { VoltageComp.cpscnt = VoltageCompensationDelayCnt + 10; }
+        }
+        else
+        { VoltageComp.cpscnt = 0; }
+        
+        // 母线电压平均值
+        BusAverageVoltage();
+    }
+    #else
+    mcFocCtrl.mcDcbusFlt = LPFFunction(ADC2_DR, mcFocCtrl.mcDcbusFlt, 50); // 母线电压值滤波
+    #endif
+    mcFocCtrl.NTCValue = LPFFunction(ADC8_DR, mcFocCtrl.NTCValue, 100);
+    mcFocCtrl.SREFValue = LPFFunction(ADC9_DR, mcFocCtrl.SREFValue, 100);
+    mcFocCtrl.UqFlt = LPFFunction(FOC__UQ, mcFocCtrl.UqFlt, 50);
+    mcFocCtrl.UdFlt = LPFFunction(FOC__UD, mcFocCtrl.UdFlt, 50);
+    // 获取调速信号,不同调速模式(PWMMODE,NONEMODE,SREFMODE)的目标值修改
+    GetTargetRef();
+    // 启动ATO控制,环路响应,如速度环、转矩环、功率环等
+    LoopResponse();
+    //故障保护函数功能,如过欠压保护、启动保护、缺相、堵转等
+    Fault_Detection();
+    // 电机启动ATO爬坡函数处理
+    ATORamp();
+    
+    // 电机状态机的时序处理
+    if (mcFocCtrl.State_Count > 0)
+    { mcFocCtrl.State_Count--; }
+}

+ 15 - 37
User/Source/MotorProtect.c

@@ -21,7 +21,7 @@ void Fault_Temperature(void)
 {
     if (mcFaultSource == FaultNoSource)
     {
-        if (mcFocCtrl.NTCValueFlt <= OVER_Temperature) // 过温保护
+        if (mcFocCtrl.NTCValue <= OVER_Temperature) // 过温保护
         {
             if (fault.Temperature.DetecCnt < TemperatureProtectTime)
             {
@@ -133,14 +133,12 @@ void Fault_OverCurrent(void)
     {
         if (mcState == mcStart || mcState == mcAlign || mcState == mcRun || mcState == mcStop)
         {
-            fault.Current.Is = Sqrt_alpbet(FOC__IA, FOC__IBET);
+            fault.Current.Is = mcFocCtrl.Is;
             
             if (fault.Current.Is >= SW_OC_CurrentVal)
             {
                 if (fault.Current.SWOC_DectTimeCnt < SW_OC_DectTime)
-                {
-                    fault.Current.SWOC_DectTimeCnt++;
-                }
+                { fault.Current.SWOC_DectTimeCnt++; }
                 else
                 {
                     fault.Current.SWOC_DectTimeCnt = 0;
@@ -148,9 +146,7 @@ void Fault_OverCurrent(void)
                 }
             }
             else
-            {
-                fault.Current.SWOC_DectTimeCnt = 0;
-            }
+            { fault.Current.SWOC_DectTimeCnt = 0; }
         }
     }
 }
@@ -165,7 +161,7 @@ void Fault_Stall(void)
     {
         fault.Stall.EsValue = mcFocCtrl.EMFsquare;
         
-        if (fault.Stall.DectDealyCnt < 3000) /* Delay for a period of time to test */
+        if (fault.Stall.DectDealyCnt < 3000)
         { fault.Stall.DectDealyCnt++; }
         else
         {
@@ -192,13 +188,8 @@ void Fault_Stall(void)
                     fault.Stall.Type = 12;
                 }
             }
-            else
-            {
-                if (fault.Stall.EsDectCnt > 0)
-                {
-                    fault.Stall.EsDectCnt--;
-                }
-            }
+            else if (fault.Stall.EsDectCnt > 0)
+                { fault.Stall.EsDectCnt--; }
             
             /* ****** 2 ****** */
             if (mcFocCtrl.SpeedFlt < STALL_SPEED_MIN || mcFocCtrl.SpeedFlt > STALL_SPEED_MAX)
@@ -212,13 +203,8 @@ void Fault_Stall(void)
                     fault.Stall.Type = 21;
                 }
             }
-            else
-            {
-                if (fault.Stall.SpeedMinCnt > 0)
-                {
-                    fault.Stall.SpeedMinCnt--;
-                }
-            }
+            else if (fault.Stall.SpeedMinCnt > 0)
+                { fault.Stall.SpeedMinCnt--; }
         }
         
         /* ****** 3 ****** */
@@ -234,9 +220,7 @@ void Fault_Stall(void)
             }
         }
         else
-        {
-            fault.Stall.Mode0DectCnt = 0;
-        }
+        { fault.Stall.Mode0DectCnt = 0; }
     }
 }
 
@@ -249,9 +233,7 @@ void Fault_PhaseLoss(void)
     if (mcState == mcRun)
     {
         if (fault.PhaseLoss.DectDealyCnt < LP_DectDealyTIME)
-        {
-            fault.PhaseLoss.DectDealyCnt++;
-        }
+        { fault.PhaseLoss.DectDealyCnt++; }
         else
         {
             if (fault.PhaseLoss.DectCycleCnt < LP_DectCycleTIME)
@@ -323,7 +305,7 @@ void Fault_Power(void)
 {
     if (mcFaultSource == FaultNoSource) // 程序无其他保护下
     {
-        if ((mcFocCtrl.PowerFlt > OverPowerValue) && (mcState == mcRun)) // 功率大于保护值时计数,超过20次,判断为过载保护,关闭输出;反之,计数器慢慢减
+        if ((mcFocCtrl.Power > OverPowerValue) && (mcState == mcRun)) // 功率大于保护值时计数,超过20次,判断为过载保护,关闭输出;反之,计数器慢慢减
         {
             fault.Power.OverPowerDetecCnt++;
             
@@ -376,14 +358,10 @@ static void Fault_Recovery(void)
                     }
                     
                     if (Restart.DC_DelayTcnt > 40)
-                    {
-                        VoltageComp.Undervoltage_flag = 0;
-                    }
+                    { VoltageComp.Undervoltage_flag = 0; }
                 }
                 else
-                {
-                    Restart.DC_DelayTcnt = 0;
-                }
+                { Restart.DC_DelayTcnt = 0; }
                 
                 if (mcFaultSource == FaultUnderVoltageDC)
                 {
@@ -405,7 +383,7 @@ static void Fault_Recovery(void)
         /* 过温保护恢复 */
         if (mcFaultSource == FaultNtcOTErr)
         {
-            if (mcFocCtrl.NTCValueFlt >= UNDER_Temperature)
+            if (mcFocCtrl.NTCValue >= UNDER_Temperature)
             {
                 if (Restart.OT_Times <= OT_RecoveryTimes)
                 {

+ 1 - 3
User/Source/main.c

@@ -12,8 +12,6 @@
 uint8 data g_1mTick = 0; ///< 1ms滴答信号,每隔1ms在SYSTICK定时器被置1,需在大循环使用处清零
 
 
-
-
 /**
     @brief        参考电压,偏置电压配置
     @date         2022-07-14
@@ -158,7 +156,7 @@ void main(void)
             
             if (g_1mTick)
             {
-                TickCycle_1ms();
+                TickCycle();
                 g_1mTick = 0;
             }
         }