Browse Source

更新

代码格式调整
avery 6 months ago
parent
commit
b210c58f0b

+ 14 - 50
KeilC51/Fortior.uvopt

@@ -413,42 +413,6 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\User\Function\FiledWeaken.c</PathWithFileName>
-      <FilenameWithoutPath>FiledWeaken.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>8</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\User\Function\VoltageCompensation.c</PathWithFileName>
-      <FilenameWithoutPath>VoltageCompensation.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>9</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\User\Function\AddFunction.c</PathWithFileName>
-      <FilenameWithoutPath>AddFunction.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>10</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
       <PathWithFileName>..\User\Function\FocControl.c</PathWithFileName>
       <FilenameWithoutPath>FocControl.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
@@ -456,7 +420,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <FileNumber>8</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -468,7 +432,7 @@
     </File>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>9</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -488,7 +452,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>10</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -500,7 +464,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>11</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -512,7 +476,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -524,7 +488,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -536,7 +500,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -548,7 +512,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -560,7 +524,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -572,7 +536,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -584,7 +548,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -596,7 +560,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -608,7 +572,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -628,7 +592,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 0 - 15
KeilC51/Fortior.uvproj

@@ -411,21 +411,6 @@
         <Group>
           <GroupName>Function</GroupName>
           <Files>
-            <File>
-              <FileName>FiledWeaken.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\User\Function\FiledWeaken.c</FilePath>
-            </File>
-            <File>
-              <FileName>VoltageCompensation.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\User\Function\VoltageCompensation.c</FilePath>
-            </File>
-            <File>
-              <FileName>AddFunction.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\User\Function\AddFunction.c</FilePath>
-            </File>
             <File>
               <FileName>FocControl.c</FileName>
               <FileType>1</FileType>

+ 109 - 0
User/Application/Control.c

@@ -7,6 +7,115 @@
 */
 #include <MyProject.h>
 
+
+/**
+    @function     Ref_Ramp
+    @brief        控制量步进控制
+    @date         2025-11-08
+*/
+void Ref_Ramp(void)
+{
+    if ( motorControl.ActualRef < ( motorControl.TargetRef - motorControl.RampInc))
+    { motorControl.ActualRef += motorControl.RampInc; }
+    else if (motorControl.ActualRef > ( motorControl.TargetRef + motorControl.RampDec))
+    { motorControl.ActualRef -= motorControl.RampDec; }
+    else
+    { motorControl.ActualRef = motorControl.TargetRef; }
+}
+
+
+/**
+    @function     Loop_Control
+    @brief        环路控制
+    @date         2025-11-08
+*/
+void Loop_Control(void)
+{
+    if ((mcState == mcRun) || (mcState == mcStop))
+    {
+        switch (motorControl.LoopState)
+        {
+            case OPEN_MODE:
+            {
+                if (motorControl.ActualSpeed > MOTOR_LOOP_RPM)
+                {
+                    motorControl.LoopTime ++;
+                    
+                    if (motorControl.LoopTime > 15)
+                    {
+                        motorControl.ISRef =  FOC_IQREF;
+                        #if (LOOP_MODE == SPEED_CONTROL_MODE)
+                        motorControl.ActualRef = motorControl.ActualSpeed + _Q15(200.0 / MOTOR_SPEED_BASE);
+                        #endif
+                        motorControl.LoopTime = 10;
+                        motorControl.LoopState = 1;
+                        PI0_UKH = motorControl.ISRef;
+                    }
+                }
+            }
+            break;
+            
+            case CLOSE_MODE:
+            {
+                motorControl.LoopTime++;
+                
+                if (motorControl.LoopTime > LOOP_CYCLE)
+                {
+                    #if (OUT_LOOP_CONTROL)
+                    {
+                        Ref_Ramp();
+                        #if (LOOP_MODE == SPEED_CONTROL_MODE)
+                        {
+                        
+                        
+                            // 速度外环
+                            motorControl.ISRef = HW_Zero_Calc(motorControl.ActualRef - motorControl.ActualSpeed);
+                            FOC_IQREF = motorControl.ISRef;
+                            
+                            #if (FiledWeakenCompEnable)
+                            {
+                                FiledWeakenControl(FOC__UD, FOC__UQ, udc.WeakenUsRef, motorControl.ISRef);
+                                
+                                if (mcFieldWeaken.mcIdref < ID_Limit)
+                                {mcFieldWeaken.mcIdref = ID_Limit;}
+                                
+                                FOC_IQREF = mcFieldWeaken.mcIdref;
+                                FOC_IDREF = mcFieldWeaken.mcIqref;
+                            }
+                            #else
+                            {
+                                FOC_IQREF = motorControl.ISRef;
+                                FOC_IDREF = 0;
+                            }
+                            #endif
+                        }
+                        #endif
+                        
+                    }
+                    #else
+                    {
+                        // 纯电流环
+                        motorControl.ActualQOutValue = FOC_IQREF;
+                    
+                        if (motorControl.ActualQOutValue < (motorControl.QOutRef - QOUTINC))
+                        { motorControl.ActualQOutValue = motorControl.QOutRef + QOUTINC; }
+                        else if (motorControl.ActualQOutValue > (motorControl.QOutRef + QOUTINC))
+                        { motorControl.ActualQOutValue = motorControl.QOutRef - QOUTINC; }
+                        else
+                        { motorControl.ActualQOutValue = motorControl.QOutRef; }
+                    
+                        FOC_IQREF = motorControl.ActualQOutValue;
+                    
+                    }
+                    #endif
+                    motorControl.LoopTime = 0;
+                }
+            }
+            break;
+        }
+    }
+}
+
 /**
     @function     Get_Target_Ref
     @brief        速度给定

+ 0 - 28
User/Application/Interrupt.c

@@ -64,34 +64,6 @@ void DRV_ISR(void) interrupt 3
     if (ReadBit(DRV_SR, DCIF))    // 比较中断
     {
         Fault_Overcurrent(); //软件过流保护
-        #if 0
-        #if (FiledWeakenCompEnable)
-        {
-            FiledWeakenControl(FOC__UD, FOC__UQ, udc.WeakenUsRef, mcFocCtrl.IsRef);
-            
-            if (mcFieldWeaken.mcIdref < ID_Limit)
-            {mcFieldWeaken.mcIdref = ID_Limit;}
-            
-            mcFocCtrl.IdRef = mcFieldWeaken.mcIdref;
-            mcFocCtrl.IqRef = mcFieldWeaken.mcIqref;
-        }
-        #else
-        {
-            mcFocCtrl.IqRef = mcFocCtrl.IsRef;
-            mcFocCtrl.IdRef = 0;
-        }
-        #endif
-        
-        if (mcFocCtrl.CtrlMode)
-        {
-            FOC_IQREF = mcFocCtrl.IqRef;
-            FOC_IDREF = mcFocCtrl.IdRef;
-        }
-        
-        #if (VoltageCompensationEn)
-        VoltageCompensation();//电压补偿
-        #endif
-        #endif
         DRV_SR = (DRV_SR | SYSTIF) & (~DCIF);
     }
 }

+ 12 - 20
User/Application/main.c

@@ -13,6 +13,10 @@ bool data isCtrlPowOn = false;
 Curr_Offset_t xdata currOffset;
 Motor_Control_t motorControl;
 
+
+CurrentVarible     xdata   mcCurVarible;
+FOCCTRL            xdata   mcFocCtrl;
+
 void HardwareInit(void)
 {
     // 上电等待
@@ -49,25 +53,13 @@ void HardwareInit(void)
     ----------------------------------------------------------------------------------*/
 void SoftwareInit(void)
 {
-    memset(&mcFaultDect, 0, sizeof(FaultVarible));        // FaultVarible变量清零
-    /************保护次数*************/
-    memset(&mcProtectTime, 0, sizeof(ProtectVarible));    // ProtectVarible保护次数清零
-    /***********过流保护**************/
-    memset(&mcCurVarible, 0, sizeof(CurrentVarible));     // 电流保护的变量清零
-    /*****电机状态机时序变量***********/
+    // FaultVarible变量清零
+    memset(&mcFaultDect, 0, sizeof(FaultVarible));
+    // ProtectVarible保护次数清零
+    memset(&mcProtectTime, 0, sizeof(ProtectVarible));
+    /// 电流保护的变量清零
+    memset(&mcCurVarible, 0, sizeof(CurrentVarible));
     McStaSet.SetMode = 0;
-    /*************外部控制环************/
-    memset(&mcFocCtrl, 0, sizeof(FOCCTRL));             // mcFocCtrl变量清零
-    mcFocCtrl.mcDcbus_chazhi = 32760;
-    // 电流校准变量初始化
-    memset(&currOffset, 0, sizeof(Curr_Offset_t));
-    currOffset.IuOffsetSum = 16383;
-    currOffset.IvOffsetSum = 16383;
-    currOffset.IwBusOffsetSum = 16383;
-    /*****速度环的响应***/
-    memset(&mcSpeedRamp, 0, sizeof(MCRAMP));          // mcSpeedRamp变量清零
-    mcSpeedRamp.IncValue = Motor_Speed_Inc;
-    mcSpeedRamp.DecValue = Motor_Speed_Dec;
     mcState = mcReady;
     mcFaultSource = 0;
 }
@@ -93,14 +85,14 @@ void main(void)
             // 目标转速设置
             Get_Target_Ref();
             // 环路响应
-            Speed_response();
+            Loop_Control();
             // 上电控制
             Power_In_Control();
             // LED灯故障显示
             LED_State_Display(mcFaultSource);
-            Tick_Task();
             // 故障保护函数功能
             Fault_Detection();
+            Tick_Task();
             // 调试信息上载
             Dabug_Data_Update();
             // 喂狗

+ 0 - 281
User/Function/AddFunction.c

@@ -1,281 +0,0 @@
-#include <Myproject.h>
-
-extern uint16 SKI1, SKP1;
-
-CurrentVarible     xdata   mcCurVarible;
-FOCCTRL            xdata   mcFocCtrl;
-MCRAMP             xdata   mcSpeedRamp;
-
-
-void FaultProcess(void)
-{
-    PRE_DRIVER_RST = 0;
-    ClrBit(DRV_CR, FOCEN);
-    MOE = 0;
-}
-
-
-/*---------------------------------------------------------------------------*/
-/*  Name     :   int32 Abs_F32(int32 value)
-    /* Input    :   value
-    /* Output   :   int16
-    /* Description: 对变量取16位的绝对值
-    /*---------------------------------------------------------------------------*/
-uint32 Abs_F32(int32 value)
-{
-    if (value < 0)
-    {
-        return (-value);
-    }
-    else
-    {
-        return (value);
-    }
-}
-
-/*---------------------------------------------------------------------------*/
-/*  Name     :   void Speed_response(void)
-    /* Input    :   NO
-    /* Output   :   NO
-    /* Description: 速度响应函数,可根据需求加入控制环,如恒转矩控制、恒转速控制、恒功率控制
-    /*---------------------------------------------------------------------------*/
-void Speed_response(void)
-{
-    static uint8 Start_CNT = 0;
-    
-    if ((mcState == mcRun) || (mcState == mcStop))
-    {
-        switch (mcFocCtrl.CtrlMode)
-        {
-            case 0:
-            {
-                if (motorControl.ActualSpeed > MOTOR_LOOP_RPM)
-                {
-                    Start_CNT ++;
-                    
-                    if (Start_CNT > 15)
-                    {
-                        mcFocCtrl.CtrlMode = 1;
-                        Start_CNT = 0;
-                        #if (LOOP_MODE == SPEED_CONTROL_MODE)
-                        mcSpeedRamp.ActualValue = motorControl.ActualSpeed + _Q15(150.0 / MOTOR_SPEED_BASE);
-                        #endif
-                        mcFocCtrl.LoopTime = 1;
-                        PI0_UKH = mcFocCtrl.mcIqref;
-                        mcFocCtrl.IsRef = mcFocCtrl.mcIqref;
-                    }
-                }
-            }
-            break;
-            
-            case 1:
-            {
-                mcFocCtrl.LoopTime++;
-                
-                if (mcFocCtrl.LoopTime > SPEED_LOOP_TIME)
-                {
-                    #if (OUT_LOOP_CONTROL)
-                    {
-                        #if (LOOP_MODE == SPEED_CONTROL_MODE)
-                        FOC_IQREF = HW_Zero_Calc(motorControl.TargetRef - motorControl.ActualSpeed);
-                        #endif
-                        
-                    }
-                    #else
-                    {
-                        FOC_IQREF = motorControl.QOutRef;
-                    }
-                    #endif
-                    mcFocCtrl.LoopTime = 0;
-                }
-            }
-            break;
-        }
-    }
-}
-
-
-/*---------------------------------------------------------------------------*/
-/*  Name     :   void mc_ramp(void)
-    /* Input    :   hTarget,MC_RAMP *hSpeedramp
-    /* Output   :   NO
-    /* Description:
-    /*---------------------------------------------------------------------------*/
-
-void mc_ramp(MCRAMP * hSpeedramp)
-{
-    if (hSpeedramp->ActualValue < hSpeedramp->TargetValue)
-    {
-        if (hSpeedramp->ActualValue + hSpeedramp->IncValue < hSpeedramp->TargetValue)
-        {
-            hSpeedramp->ActualValue += hSpeedramp->IncValue;
-        }
-        else
-        {
-            hSpeedramp->ActualValue = hSpeedramp->TargetValue;
-        }
-    }
-    else
-    {
-        if (hSpeedramp->ActualValue - hSpeedramp->DecValue > hSpeedramp->TargetValue)
-        {
-            hSpeedramp->ActualValue -= hSpeedramp->DecValue;
-        }
-        else
-        {
-            hSpeedramp->ActualValue = hSpeedramp->TargetValue;
-        }
-    }
-}
-
-
-/*---------------------------------------------------------------------------*/
-/*  Name     :   void StarRampDealwith(void)
-    /* Input    :   NO
-    /* Output   :   NO
-    /* Description:
-    /*---------------------------------------------------------------------------*/
-
-void StarRampDealwith(void)
-{
-    if ((mcState == mcRun) || (mcState == mcStart))
-    {
-        if (mcFocCtrl.State_Count == 1200) //2300
-        {
-            FOC_EKP = OBSW_KP_GAIN_RUN;              // 估算器里的PI的KP
-            FOC_EKI = OBSW_KI_GAIN_RUN;              // 估算器里的PI的KI
-            #if (EstimateAlgorithm == PLL)
-            {
-                FOC_KSLIDE    = OBSE_PLLKP_GAIN2;
-                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN2;
-            }
-            #endif
-        }
-        else if (mcFocCtrl.State_Count == 1000) //2000
-        {
-            FOC_EKP = OBSW_KP_GAIN_RUN1;             // 估算器里的PI的KP
-            FOC_EKI = OBSW_KI_GAIN_RUN1;             // 估算器里的PI的KI
-            #if (EstimateAlgorithm == PLL)
-            {
-                FOC_KSLIDE    = OBSE_PLLKP_GAIN3;
-                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN3;
-            }
-            #endif
-        }
-        else if (mcFocCtrl.State_Count == 600) //1600
-        {
-            FOC_EKP = OBSW_KP_GAIN_RUN2;             // 估算器里的PI的KP
-            FOC_EKI = OBSW_KI_GAIN_RUN2;             // 估算器里的PI的KI
-            #if (EstimateAlgorithm == PLL)
-            {
-                FOC_KSLIDE    = OBSE_PLLKP_GAIN4;
-                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN4;
-            }
-            #endif
-        }
-        else if (mcFocCtrl.State_Count == 400) //1200
-        {
-            FOC_EKP = OBSW_KP_GAIN_RUN3;             // 估算器里的PI的KP
-            FOC_EKI = OBSW_KI_GAIN_RUN3;             // 估算器里的PI的KI
-            #if (EstimateAlgorithm == PLL)
-            {
-                FOC_KSLIDE    = OBSE_PLLKP_GAIN5;
-                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN5;
-            }
-            #endif
-        }
-        else if (mcFocCtrl.State_Count == 300)
-        {
-            FOC_EKP = OBSW_KP_GAIN_RUN4;             // 估算器里的PI的KP
-            FOC_EKI = OBSW_KI_GAIN_RUN4;             // 估算器里的PI的KI
-            #if (EstimateAlgorithm == PLL)
-            {
-                FOC_KSLIDE    = OBSE_PLLKP_GAIN5;
-                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN5;
-            }
-            #endif
-        }
-    }
-}
-
-
-/*PI参数分段处理*/
-void Current_Speed_PI(void)
-{
-    static int16 Skp, Ski, DQkp, DQki;
-    static int16 Skp_1, Ski_1, DQkp_1, DQki_1;
-    
-    if (motorControl.ActualSpeed < _Q15(2000 / MOTOR_SPEED_BASE))
-    {
-        Skp = SKPRun;
-        Ski = SKIRun;
-        DQkp = DQKP;
-        DQki = DQKI;
-    }
-    else if (motorControl.ActualSpeed < _Q15(4200 / MOTOR_SPEED_BASE))
-    {
-        Skp = SKPRun1;
-        Ski = SKIRun1;
-        DQkp = DQKP_zhong;
-        DQki = DQKI_zhong;
-    }
-    else if (motorControl.ActualSpeed > _Q15(4700 / MOTOR_SPEED_BASE))
-    {
-        Skp = SKPRun2;
-        Ski = SKIRun2;
-        DQkp = DQKP_highspeed;
-        DQki = DQKI_highspeed;
-    }
-    
-    Skp_1 = PI0_KP;
-    Ski_1 = PI0_KI;
-    
-    if (Skp_1 < Skp)
-    {
-        Skp_1 += 2;
-    }
-    else if (Skp_1 > Skp)
-    {
-        Skp_1 -= 2;
-    }
-    
-    if (Ski_1 < Ski)
-    {
-        Ski_1 += 2;
-    }
-    else if (Ski_1 > Ski)
-    {
-        Ski_1 -= 2;
-    }
-    
-    PI0_KP = Skp_1;
-    PI0_KI = Ski_1;
-    DQkp_1 = FOC_QKP;
-    DQki_1 = FOC_QKI;
-    
-    if (DQkp_1 < DQkp)
-    {
-        DQkp_1 += 2;
-    }
-    else if (DQkp_1 > DQkp)
-    {
-        DQkp_1 -= 2;
-    }
-    
-    if (DQki_1 < DQki)
-    {
-        DQki_1 += 2;
-    }
-    else if (DQki_1 > DQki)
-    {
-        DQki_1 -= 2;
-    }
-    
-    FOC_DKP = DQkp_1;
-    FOC_DKI = DQki_1;
-    FOC_QKP = DQkp_1;
-    FOC_QKI = DQki_1;
-}
-
-uint16 AimFrequencyMaxVAC = 500;
-

+ 0 - 27
User/Function/FiledWeaken.c

@@ -1,27 +0,0 @@
-#include <Myproject.h>
-
-#if (FiledWeakenCompEnable)
-
-FieldWeakeningTypeDef xdata mcFieldWeaken;
-
-void  FiledWeakenControl(int16 Ud, int16 Uq, uint16 Dcbusk, int16 Is)
-{
-    //获取Us和Udc。
-    SCAT1_COS =  Ud;
-    SCAT1_SIN =  Uq;
-    SMDU_RunBlock(1, 5);
-    mcFieldWeaken.FieldWeakenActualUS_Q15 = SCAT1_RES1;
-    mcFieldWeaken.FieldWeakenActualDcbus_Q15 = Dcbusk;
-    // 计算弱磁角度
-    mcFieldWeaken.FieldWeakenIsTheta = HW_One_Calc(mcFieldWeaken.FieldWeakenActualDcbus_Q15 -  mcFieldWeaken.FieldWeakenActualUS_Q15);
-    //获取D轴电流和Q轴电流参考值。
-    SCAT1_COS = Is;
-    SCAT1_THE = mcFieldWeaken.FieldWeakenIsTheta;
-    SCAT1_SIN = 0;
-    SMDU_RunBlock(1, 4);
-    mcFieldWeaken.mcIdref = SCAT1_RES2 ;//sin的结果
-    mcFieldWeaken.mcIqref = SCAT1_RES1;//cos的结果
-}
-
-
-#endif

+ 30 - 17
User/Function/FocControl.c

@@ -36,8 +36,15 @@ void Motor_Control_State(void)
                     {
                         ClrBit(DRV_CR, FOCEN);
                         MOE = 0;
+                        // 使能ADC转换通道
                         SetBit(ADC_MASK, CH1EN | CH0EN);
-                        currOffset.OffsetCount = 0;
+                        // 电流校准变量初始化
+                        memset(&currOffset, 0, sizeof(Curr_Offset_t));
+                        // 配置初始值
+                        currOffset.IuOffsetSum = 16383;
+                        currOffset.IvOffsetSum = 16383;
+                        currOffset.IwBusOffsetSum = 16383;
+                        // 跳转状态
                         currOffset.OffsetCalib = GET_OFFSET;
                     }
                     
@@ -99,23 +106,27 @@ void Motor_Control_State(void)
         
         case mcInit:
         {
-            //if ((mcFocCtrl.mcDcbusFlt > _Q15(Under_Protect_Voltage / HW_BOARD_VOLT_MAX)))
+			if (motorControl.DCBus > UNDER_RECOVER_VALUE)
             {
                 // 关闭软件电流采样的ADC
                 mcFaultSource = 0;
                 memset(&mcFaultDect, 0, sizeof(FaultVarible));
                 memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
-                mcFocCtrl.mcDcbus_chazhi = 32760;
                 McStaSet.SetMode = 0;
-                memset(&VoltageComp, 0, sizeof(VOLCOMP));
                 // PI控制器初始化
                 HW_Zero_PI_Init();
-                HW_One_PI_Init();
+                // 弱磁初始化
                 #if (FiledWeakenCompEnable)
                 memset(&mcFieldWeaken, 0, sizeof(FieldWeakeningTypeDef));
+                HW_One_PI_Init();
+                #endif
+                // 环路配置
+                #if (SPEED_CONTROL_MODE)
+                motorControl.RampInc = MOTOR_SPEED_INC;
+                motorControl.RampDec = MOTOR_SPEED_DEC;
                 #endif
                 // 此模块不需要预充电
-                #if 0
+                #if (PRE_DRIVER_CHARGE)
                 mcState = mcCharge;
                 mcFocCtrl.ChargeStep = 0;
                 mcFocCtrl.State_Count = 0;
@@ -127,6 +138,8 @@ void Motor_Control_State(void)
             break;
         }
         
+        #if (PRE_DRIVER_CHARGE)
+        
         case mcCharge:
         {
             switch (mcFocCtrl.ChargeStep)
@@ -188,6 +201,8 @@ void Motor_Control_State(void)
             break;
         }
         
+        #endif
+        
         case mcAlign:
         {
             Motor_Align();
@@ -207,15 +222,8 @@ void Motor_Control_State(void)
         
         case mcStop:
         {
-            #if (StopBrakeFlag == 0)
-            {
-                mcState = mcReady;
-                FOC_CR1 = 0x00;
-                ClrBit(DRV_CR, FOCEN);   //关闭FOC
-                MOE = 0;
-            }
-            #else
-            
+            #if (StopBrakeFlag)
+        
             if (motorControl.ActualSpeed < MOTOR_STOP_SPEED)
             {
                 MOE = 0;
@@ -230,6 +238,13 @@ void Motor_Control_State(void)
                 mcFocCtrl.State_Count = StopWaitTime;
             }
             
+            #else
+            {
+                mcState = mcReady;
+                FOC_CR1 = 0x00;
+                ClrBit(DRV_CR, FOCEN);   //关闭FOC
+                MOE = 0;
+            }
             #endif
             break;
         }
@@ -278,7 +293,6 @@ void Tick_Task(void)
     if ((mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
     {
         mcFocCtrl.Powerlpf =  LPF_Zero_Update(FOC__POW, mcFocCtrl.Powerlpf, LPF_K(1.0));
-        mcFocCtrl.IDQFlt =  LPF_Zero_Update(mcCurVarible.Max_is, mcFocCtrl.IDQFlt, LPF_K(1.0));
         mcFocCtrl.UDFlt =  LPF_Zero_Update(FOC__UD, mcFocCtrl.UDFlt, LPF_K(30.0));          //LPF_K(30.0)
         mcFocCtrl.UQFlt =  LPF_Zero_Update(FOC__UQ, mcFocCtrl.UQFlt, LPF_K(30.0));          //LPF_K(30.0)
         motorControl.ActualSpeed = LPF_Zero_Update(FOC__EOME, motorControl.ActualSpeed, LPF_K(71.0));
@@ -289,7 +303,6 @@ void Tick_Task(void)
     }
     else
     {
-        mcFocCtrl.IDQFlt = 0;
         mcFocCtrl.Powerlpf = 0;
         motorControl.ActualSpeed = 0;
         motorControl.BackEMF = 0;

+ 114 - 12
User/Function/FocControlFunction.c

@@ -1,5 +1,19 @@
 #include <Myproject.h>
 
+/**
+ * @function     Abs_F32
+ * @brief        取绝对值
+ * @param[in]    Xn0: [输入/出] 
+ * @return       None
+ * @date         2025-11-08
+*/
+uint32_t Abs_F32(int32_t Xn0)
+{
+    if (Xn0 < 0)
+    { return (-Xn0); }
+    else
+    { return (Xn0); }
+}
 
 void FOC_Init(void)
 {
@@ -132,12 +146,11 @@ void FOC_Init(void)
     SetBit(DRV_CR, OCS);
 }
 
-/*---------------------------------------------------------------------------*/
-/*  Name     :   void Motor_Align(void)
-    /* Input    :   NO
-    /* Output   :   NO
-    /* Description: 预定位函数,当无逆风判断时,采用预定位固定初始位置;当有逆风判断时,采用预定位刹车
-    /*---------------------------------------------------------------------------*/
+/**
+    @function     Motor_Align
+    @brief        预定位
+    @date         2025-11-08
+*/
 void Motor_Align(void)
 {
     if (McStaSet.SetFlag.AlignSetFlag == 0)
@@ -186,12 +199,11 @@ void Motor_Align(void)
     { mcState = mcStart; }
 }
 
-/*---------------------------------------------------------------------------*/
-/*  Name     :   void Motor_Open(void)
-    /* Input    :   NO
-    /* Output   :   NO
-    /* Description: 开环启动的参数配置
-    /*---------------------------------------------------------------------------*/
+/**
+    @function     Motor_Open
+    @brief        启动
+    @date         2025-11-08
+*/
 void Motor_Open(void)
 {
     static uint8 OpenRampCycles;
@@ -276,3 +288,93 @@ void Motor_Open(void)
 
 
 
+/**
+ * @function     StarRampDealwith
+ * @brief        估算器增益调整
+ * @date         2025-11-08
+*/
+void StarRampDealwith(void)
+{
+    if ((mcState == mcRun) || (mcState == mcStart))
+    {
+        if (mcFocCtrl.State_Count == 1200)
+        {
+            FOC_EKP = OBSW_KP_GAIN_RUN;              // 估算器里的PI的KP
+            FOC_EKI = OBSW_KI_GAIN_RUN;              // 估算器里的PI的KI
+            #if (EstimateAlgorithm == PLL)
+            {
+                FOC_KSLIDE    = OBSE_PLLKP_GAIN2;
+                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN2;
+            }
+            #endif
+        }
+        else if (mcFocCtrl.State_Count == 1000) 
+        {
+            FOC_EKP = OBSW_KP_GAIN_RUN1;             // 估算器里的PI的KP
+            FOC_EKI = OBSW_KI_GAIN_RUN1;             // 估算器里的PI的KI
+            #if (EstimateAlgorithm == PLL)
+            {
+                FOC_KSLIDE    = OBSE_PLLKP_GAIN3;
+                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN3;
+            }
+            #endif
+        }
+        else if (mcFocCtrl.State_Count == 600)
+        {
+            FOC_EKP = OBSW_KP_GAIN_RUN2;             // 估算器里的PI的KP
+            FOC_EKI = OBSW_KI_GAIN_RUN2;             // 估算器里的PI的KI
+            #if (EstimateAlgorithm == PLL)
+            {
+                FOC_KSLIDE    = OBSE_PLLKP_GAIN4;
+                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN4;
+            }
+            #endif
+        }
+        else if (mcFocCtrl.State_Count == 400)
+        {
+            FOC_EKP = OBSW_KP_GAIN_RUN3;             // 估算器里的PI的KP
+            FOC_EKI = OBSW_KI_GAIN_RUN3;             // 估算器里的PI的KI
+            #if (EstimateAlgorithm == PLL)
+            {
+                FOC_KSLIDE    = OBSE_PLLKP_GAIN5;
+                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN5;
+            }
+            #endif
+        }
+        else if (mcFocCtrl.State_Count == 300)
+        {
+            FOC_EKP = OBSW_KP_GAIN_RUN4;             // 估算器里的PI的KP
+            FOC_EKI = OBSW_KI_GAIN_RUN4;             // 估算器里的PI的KI
+            #if (EstimateAlgorithm == PLL)
+            {
+                FOC_KSLIDE    = OBSE_PLLKP_GAIN5;
+                FOC_EKLPFMIN  = OBSE_PLLKI_GAIN5;
+            }
+            #endif
+        }
+    }
+}
+
+#if (FiledWeakenCompEnable)
+
+FieldWeakeningTypeDef xdata mcFieldWeaken;
+
+void  FiledWeakenControl(int16 Ud, int16 Uq, uint16 Dcbusk, int16 Is)
+{
+    //获取Us和Udc
+    SCAT1_COS =  Ud;
+    SCAT1_SIN =  Uq;
+    SMDU_RunBlock(1, 5);
+    mcFieldWeaken.FieldWeakenActualUS_Q15 = SCAT1_RES1;
+    mcFieldWeaken.FieldWeakenActualDcbus_Q15 = Dcbusk;
+    // 计算弱磁角度
+    mcFieldWeaken.FieldWeakenIsTheta = HW_One_Calc(mcFieldWeaken.FieldWeakenActualDcbus_Q15 -  mcFieldWeaken.FieldWeakenActualUS_Q15);
+    //获取D轴电流和Q轴电流参考值。
+    SCAT1_COS = Is;
+    SCAT1_THE = mcFieldWeaken.FieldWeakenIsTheta;
+    SCAT1_SIN = 0;
+    SMDU_RunBlock(1, 4);
+    mcFieldWeaken.mcIdref = SCAT1_RES2 ;//sin的结果
+    mcFieldWeaken.mcIqref = SCAT1_RES1;//cos的结果
+}
+#endif

+ 10 - 3
User/Function/Protect.c

@@ -5,6 +5,14 @@ FaultStateType     xdata   mcFaultSource;
 FaultVarible       idata   mcFaultDect;
 ProtectVarible     xdata   mcProtectTime;
 
+
+void FaultProcess(void)
+{
+    PRE_DRIVER_RST = 0;
+    ClrBit(DRV_CR, FOCEN);
+    MOE = 0;
+}
+
 /*****************************************************************************
     Function:         void   Fault_OverVoltage(mcFaultVarible *h_Fault)
     Description:  过压欠压保护函数:程序每5ms判断一次,母线电压大于过压保护值时,计数器加一,计数器值超过20次,判断为过压保护,关闭输出;反之,计数器慢慢减
@@ -170,7 +178,7 @@ void Fault_Start(void)
             {
                 mcFaultDect.StartDelay = 300;
                 
-                if ((motorControl.BackEMF < 500)) //&&(mcFocCtrl.CtrlMode==0))
+                if ((motorControl.BackEMF < 500))
                 {
                     mcFaultDect.StartESCount++;
                     
@@ -197,8 +205,7 @@ void Fault_Start(void)
             mcFaultDect.StartESCount = 0;
         }
         
-        //方法三,长时间在CtrlMode=0状态
-        if (mcFocCtrl.CtrlMode == 0)        //
+        if (motorControl.LoopState == OPEN_MODE)
         {
             mcFaultDect.StartFocmode++;
             

+ 0 - 54
User/Function/VoltageCompensation.c

@@ -1,54 +0,0 @@
-/*  --------------------------- (C) COPYRIGHT 2021 Fortiortech ShenZhen -----------------------------
-    File Name      : MotorFiledWeaken.c
-    Author         : Fortiortech  Appliction Team
-    Version        : V1.0
-    Date           : 2021-12-08
-    Description    : This file contains motor filed weaken function used for Motor Control.
-    ----------------------------------------------------------------------------------------------------
-                                      All Rights Reserved
-    ------------------------------------------------------------------------------------------------- */
-#include "FU68xx_5.h"
-#include <Myproject.h>
-
-VOLCOMP  xdata VoltageComp;
-/*  -------------------------------------------------------------------------------------------------
-    Function Name  : VoltageCompensation
-    Description    : µçѹ²¹³¥
-    Date           : 2021-12-08
-    Parameter      : None
-    ------------------------------------------------------------------------------------------------- */
-void VoltageCompensation(void)
-{
-    if ((mcFocCtrl.CtrlMode == 1) && (mcFaultSource == FaultNoSource) && (motorControl.ActualSpeed > _Q15(2000 / MOTOR_SPEED_BASE)))
-    {
-        //SetBit(ADC_CR, ADCBSY);
-        while (ReadBit(ADC_CR, ADCBSY));
-        
-        VoltageComp.testUq = FOC__UQ;
-        VoltageComp.testUq1 = VoltageComp.testUq >> 4 ;
-        VoltageComp.mcDcbus          = ADC2_DR;
-        VoltageComp.mcDcbuschazhi    = VoltageComp.mcDcbus - mcFocCtrl.mcDcbus_min;
-        DIV0_DAH = VoltageComp.testUq1;           // rw--
-        DIV0_DAL = 0;                           // rw--
-        DIV0_DB  = mcFocCtrl.mcDcbus_min;        // rw--
-        SMDU_RunBlock(0, DIV);                  // rw--
-        VoltageComp.testUq2 = DIV0_DQL;           // rw--
-        MUL0_MA = VoltageComp.testUq2;            // rw--
-        MUL0_MB = mcFocCtrl.mcDcbus_min + mcFocCtrl.mcDcbus_chazhi + VoltageComp.mcDcbuschazhi; // rw--
-        SMDU_RunBlock(0, S1MUL);                       //
-        VoltageComp.testUq3 = MUL0_MCH;                  // rw--
-        //              if(VoltageComp.testUq3>=4095)                    // rw--
-        //              {
-        //                      VoltageComp.testUq3=4095;
-        //              }
-        VoltageComp.testUq4 = (VoltageComp.testUq3 << 3) - VoltageComp.testUq;  //
-        
-        if (VoltageComp.testUq4 >= 3000)
-        {VoltageComp.testUq4 = 3000;}
-        
-        if (VoltageComp.testUq4 < -3000)
-        {VoltageComp.testUq4 = -3000;}
-        
-        FOC_UQCPS = VoltageComp.testUq4;                                     //
-    }
-}

+ 0 - 3
User/Hardware/UART_4800.C

@@ -1,3 +0,0 @@
-
-#include <Myproject.h>
-

+ 0 - 69
User/include/AddFunction.h

@@ -1,69 +0,0 @@
-#ifndef __AddFunction_H_
-#define __AddFunction_H_
-
-#include <FU68xx_5_Type.h>
-
-typedef struct
-{
-    uint16 Max_ia;                     // IA的最大值
-    uint16 Max_ib;                     // IB的最大值
-    uint16 Max_ic;                     // IC的最大值
-    uint16 Max_is;
-    uint16 time;
-} CurrentVarible;
-
-typedef struct
-{
-    int16  mcDcbusFlt;	// 母线电压
-    int16  mcDcbus;	// 母线电压
-    int16  mcDcbus_max_temp;	// 母线电压最大值
-    int16  mcDcbus_min_temp;	// 母线电压最小值
-    int16  mcDcbus_max;	// 母线电压最大值
-    int16  mcDcbus_min;	// 母线电压最小值
-    int16  mcDcbus_chazhi;	// 母线电压最小值
-    uint16 CtrlMode;	// 控制模式
-    int16  Powerlpf;	// 功率滤波后的值
-    int16  IsRef;	// 速度闭环PI计算结果
-    
-    int16  mcIqref;	// Q轴给定电流
-    int16  mcIdref;	// Q轴给定电流
-    
-    int16  IqRef;	// Q 轴参考电流
-    int16  IdRef;	// D 轴参考电流
-    int16  UQFlt;	// UQ滤波后的值
-    int16  UDFlt;	// UD滤波后的值
-    
-    uint16 IDQFlt;
-    uint16 RunStateCnt;	// 运行状态计数
-    uint16 LoopTime;	// 外环时间
-    uint16 ChargeStep;	// 预充电的步骤
-    uint16 State_Count;	// 电机各个状态的时间计数
-    uint8  CurrentAlignStatus;
-} FOCCTRL;
-
-
-typedef struct
-{
-    int16  TargetValue;
-    int16  ActualValue;
-    int16  IncValue;
-    int16  DecValue;
-} MCRAMP;
-
-
-extern CurrentVarible xdata   mcCurVarible;
-extern FOCCTRL        xdata   mcFocCtrl;
-extern MCRAMP         xdata   mcSpeedRamp;
-
-extern void   Fault_Detection(void);
-extern void   PFCFault_Detection(void);
-extern void   Speed_response(void);
-extern void   mc_ramp(MCRAMP * hSpeedramp);
-extern void   FaultProcess(void);
-extern uint32 Abs_F32(int32 value);
-extern void   StarRampDealwith(void);
-
-extern void Current_Speed_PI(void);
-
-#endif
-

+ 42 - 84
User/include/Customer.h

@@ -48,12 +48,11 @@
 
 
 // 预充电设置值
-#define Charge_Time                    (100) //30                              // (ms) 预充电时间,单位:ms
-#define Calib_Duty                     (0.1)                                   // 预充电占空比
+#define PRE_DRIVER_CHARGE				(0) 						// 预充电使能
+#define Calib_Duty                     (0.1)						// 预充电占空比
 
 
 // 正常运行时估算算法的参数设置值
-#define OBS_KSLIDE                     _Q15(0.85)  //0.65                     // SMO算法里的滑膜增益值
 #define E_BW1                          (80.0)                                 // PLL算法里的反电动势滤波值
 #define E_BW2                          (80.0)                                 // PLL算法里的反电动势滤波值
 #define E_BW3                          (80.0)                                 // PLL算法里的反电动势滤波值
@@ -100,114 +99,73 @@
 #define MOTOR_OMEGA_ACC_MIN             _Q15(200.0 / MOTOR_SPEED_BASE)          // (RPM) omega启动的最小切换转速
 #define MOTOR_OMEGA_ACC_END             _Q15(400.0 / MOTOR_SPEED_BASE)          // (RPM) omega启动的限制转速
 
-#define Motor_Open_Ramp_ACC             _Q15(MOTOR_OPEN_ACC     / MOTOR_SPEED_BASE)
+#define Motor_Open_Ramp_ACC             _Q15(MOTOR_OPEN_ACC / MOTOR_SPEED_BASE)
 #define Motor_Open_Ramp_Min             _Q15(MOTOR_OPEN_ACC_MIN / MOTOR_SPEED_BASE)
 
 
 
-#define TARGET_SPEED_SET                _Q15(2000.0/MOTOR_SPEED_BASE)
 
 #define MOTOR_SPEED_SMOMIN_RPM         (400.0)
 #define MOTOR_LOOP_RPM                  _Q15(500.0 / MOTOR_SPEED_BASE)
 
 
-#define MOTOE_MIN_SPEED                 _Q15(900.0/ MOTOR_SPEED_BASE)
-#define MOTOR_MAX_SPEED                 _Q15(5400.0/ MOTOR_SPEED_BASE)
-#define MOTOR_STALL_MIN_SPEED           _Q15(800.0/ MOTOR_SPEED_BASE)
-#define MOTOR_STALL_MAX_SPEED           _Q15(7000.0/ MOTOR_SPEED_BASE)
-#define MOTOR_STOP_SPEED                _Q15(1300.0/ MOTOR_SPEED_BASE)
-
-
-
-/*电流环参数设置值--------------------------------------------------------------*/
-/*启动*/
-#define DQKPStart                      _Q12(2.5)  //1.1                             
-#define DQKIStart                      _Q15(0.01) //0.01                             
-/*低速*/
-#define DQKP                           _Q12(2.0)  //带载时5.0                            
-#define DQKI                           _Q15(0.002)  //此值不能太大,大了后影响低速性能(与转矩补偿冲突) 
-/*中速*/
-#define DQKP_zhong                     _Q12(1.5)  //带载时5.0                            
-#define DQKI_zhong                     _Q15(0.002)  //      
-/*高速*/
-#define DQKP_highspeed                 _Q12(1.5)  //4.0  切换时易导致转速波动                            
-#define DQKI_highspeed                 _Q15(0.002)  //0.02  0.011                          
-
 
+#define StopBrakeFlag                  (0)
+#define StopWaitTime                   (2000)                                  // (ms) 刹车等待时间
 
-#define QOUTINC                        (1)
-
-/*外环参数设置值----------------------------------------------------------------*/
-#define SPEED_LOOP_TIME                (1)  //2                                  // (ms) 速度环调节周期 SPEED_INC_DEC_TIME
-#define WEAK_LOOP_TIME                 (1)  //2                                  // (ms) 速度环调节周期 SPEED_INC_DEC_TIME
-#define SPEED_INC_DEC_TIME             (200)                                    // (ms) 速度环爬坡周期
-
-
-/*启动*/
-#define SKP                            _Q12(0.65)  //0.25                            // 外环KP
-#define SKI                            _Q15(0.010) //0.00251
-/*低速*/
-#define SKPRun                         _Q12(0.45)         //0.35                                 // 外环KP
-#define SKIRun                         _Q15(0.03)    //0.03                                      // 外环KI    0.01 ,影响转矩补偿
-/*中速*/
-#define SKPRun1                        _Q12(0.30)//0.2  太大高速时波动,太小
-#define SKIRun1                        _Q15(0.01) //0.0005   
-/*高速*/
-#define SKPRun2                        _Q12(0.30)//0.15  太大高速时波动,太小
-#define SKIRun2                        _Q15(0.01) //0.0002  // 外环KI  
-
-#define SOUTMAX                        I_Value(5.0) // (A) 外环最大限幅值
-#define SOUTMIN                        I_Value(0.0)  //0.02                         // (A) 外环最小限幅值
-
-#define I_OVER                         I_Value(78.0) //   降频点  超过此值降频率
-#define I_LIMIT                        I_Value(77.0) //   限制电流值 
-#define P_OVER                         P_Power(15180) //   降频点  超过此值降频率
-#define P_LIMIT                        P_Power(15150) //   限制功率值 
 
+// 弱磁控制
+#define FiledWeakenCompEnable           (0)
+#define DcbusK                          _Q15(0.8)
+#define FiledWeakenKp                   _Q12(0.4)
+#define FiledWeakenKi                   _Q15(0.0001)
 
-/*外环增量*/
-#define SPEED_INC_Start                (200.0)
-#define SPEED_INC                      (200.0) //150                                // 速度环增量
-#define SPEED_DEC                      (200.0) //150                                // 速度环减量
-#define SPEED_DEC1                     (800.0) //150                              // 速度环减量  停机时使用
-#define SpeedRampStartInc              (_Q15(SPEED_INC_Start/MOTOR_SPEED_BASE))/(1000/SPEED_INC_DEC_TIME)
-#define Motor_Speed_Inc                (_Q15(SPEED_INC/MOTOR_SPEED_BASE)) /(1000/(SPEED_LOOP_TIME*20.0))
-#define Motor_Speed_Dec                (_Q15(SPEED_DEC/MOTOR_SPEED_BASE)) /(1000/(SPEED_LOOP_TIME*20.0))
-#define Motor_Speed_Dec1               (_Q15(SPEED_DEC1/MOTOR_SPEED_BASE)) /(1000/SPEED_INC_DEC_TIME)
 
+#define IFFDebugg						(0)							//  强拖测试模式 
 
-#define MotorStartHoldTime              (15000)                                 //上油时间  15000
-#define Motor_Start_Hold_Speed          _Q15(2700.0 / MOTOR_SPEED_BASE)
 
+// ------------------------------------------------------------------------------------------------------------------
+// 3.环路相关
+#define OUT_LOOP_CONTROL                (1)							// 外环控制使能
+#define LOOP_MODE                       (SPEED_CONTROL_MODE)		// 外环配置
+#define CONTROL_MODE                    (NONEMODE)					// 控制模式
 
 
-#define OUT_LOOP_CONTROL                (1)
-#define LOOP_MODE                       (SPEED_CONTROL_MODE)
-#define CONTROL_MODE                    (NONEMODE)
+#define LOOP_CYCLE                		(1)						// 速度环调节周期 
 
 
-#define StopBrakeFlag                  (0)
-#define StopWaitTime                   (2000)                                  // (ms) 刹车等待时间
+// 电流环KPKI
+#define DQKPStart                      _Q12(2.5)                             
+#define DQKIStart                      _Q15(0.01)                           
+#define DQKP                           _Q12(2.0)                           
+#define DQKI                           _Q15(0.002)
 
+// 电流环控制步进参数
+#define QOUTINC                        (1)
 
-// 弱磁控制
-#define FiledWeakenCompEnable           (0)
-#define DcbusK                          _Q15(0.8)
-#define FiledWeakenKp                   _Q12(0.4)
-#define FiledWeakenKi                   _Q15(0.0001)
 
+// 速度环输入值步进参数
+#define MOTOR_SPEED_INC					((float)_Q15(200.0 / MOTOR_SPEED_BASE) / (1000 / LOOP_CYCLE))
+#define MOTOR_SPEED_DEC					((float)_Q15(200.0 / MOTOR_SPEED_BASE) / (1000 / LOOP_CYCLE))
+#define MOTOR_STOP_SPEED_DEC			((float)_Q15(800.0 / MOTOR_SPEED_BASE) / (1000 / LOOP_CYCLE))
 
-#define IFFDebugg                      (0)            //  强拖测试模式 
+// 外环KPKI
+#define SKP								_Q12(0.5)
+#define SKI								_Q15(0.002)
 
+// 外环输出限幅
+#define SOUTMAX							I_Value(5.0)
+#define SOUTMIN							I_Value(0.0)
 
-#define VoltageCompensationEn           (0)//电压补偿使能位
 
-//电压限频
-#define VAC_Min_F                         900
-#define VAC_Max_F                         900
-#define VAC_Min                           _Q15((290.0*1.414) / HW_L_VOLT_MAX)
-#define VAC_Max                           _Q15((360.0*1.414) / HW_L_VOLT_MAX)
-#define VAC_Max_K                        ((float)(VAC_Max_F-VAC_Min_F)/(float)(VAC_Max-VAC_Min))
+// 极限速度限制
+#define MOTOE_MIN_SPEED                 _Q15(900.0/ MOTOR_SPEED_BASE)
+#define MOTOR_MAX_SPEED                 _Q15(5400.0/ MOTOR_SPEED_BASE)
+#define MOTOR_STOP_SPEED                _Q15(1300.0/ MOTOR_SPEED_BASE)
+#define MOTOR_STALL_MIN_SPEED           _Q15(800.0/ MOTOR_SPEED_BASE)
+#define MOTOR_STALL_MAX_SPEED           _Q15(7000.0/ MOTOR_SPEED_BASE)
 
+// 测试转速
+#define TARGET_SPEED_SET                _Q15(3000.0/MOTOR_SPEED_BASE)
 
 #endif

+ 27 - 15
User/include/Definition.h

@@ -123,21 +123,22 @@
 // 速度带宽的滤波值,经典值为5.0-40.0
 #define SPD_BW                          (25.0)
 #define ATT_COEF                        (0.95)
+#define OBS_KSLIDE                     _Q15(0.85)											// SMO算法里的滑膜增益值
 
-#define PWM_CYCLE                       (1000.0 / PWM_FREQUENCY)                      // 周期us
-#define SAMP_FREQ                       (PWM_FREQUENCY * 1000)                        // 采样频率(HZ)
-#define TPWM_VALUE                      (1.0 / SAMP_FREQ)                             // 载波周期(S)
-#define PWM_VALUE_LOAD                  (uint16)(MCU_CLOCK * 1000 *2 / PWM_FREQUENCY) // PWM 定时器重载值
+#define PWM_CYCLE                       (1000.0 / PWM_FREQUENCY)							// 周期us
+#define SAMP_FREQ                       (PWM_FREQUENCY * 1000)								// 采样频率(HZ)
+#define TPWM_VALUE                      (1.0 / SAMP_FREQ)									// 载波周期(S)
+#define PWM_VALUE_LOAD                  (uint16)(MCU_CLOCK * 1000 *2 / PWM_FREQUENCY) 		// PWM 定时器重载值
 
-#define PWM_LOAD_DEADTIME               (PWM_DEADTIME * MCU_CLOCK)             // 死区设置值
-#define PWM_OVERMODULE_TIME             (OVERMOD_TIME * MCU_CLOCK / 2)         // 过调制时间
-#define PWM_DLOWL_TIME                  (DLL_TIME * MCU_CLOCK / 2)             //下桥臂最小时间
+#define PWM_LOAD_DEADTIME               (PWM_DEADTIME * MCU_CLOCK)             				// 死区设置值
+#define PWM_OVERMODULE_TIME             (OVERMOD_TIME * MCU_CLOCK / 2)         				// 过调制时间
+#define PWM_DLOWL_TIME                  (DLL_TIME * MCU_CLOCK / 2)             				//下桥臂最小时间
 
-#define PWM_TS_LOAD                     (uint16)(_Q16 / PWM_CYCLE * MIN_WIND_TIME / 16)            // 单电阻采样设置值
-#define PWM_DT_LOAD                     (uint16)(_Q16 / PWM_CYCLE * DT_TIME / 16)                  // 死区补偿值
+#define PWM_TS_LOAD                     (uint16)(_Q16 / PWM_CYCLE * MIN_WIND_TIME / 16)		// 单电阻采样设置值
+#define PWM_DT_LOAD                     (uint16)(_Q16 / PWM_CYCLE * DT_TIME / 16)			// 死区补偿值
 #define PWM_TGLI_LOAD                   (uint16)(_Q16 / PWM_CYCLE * (GLI_TIME + PWM_DEADTIME) / 16)  // 最小脉冲
 
-#define BASE_FREQ                       ((MOTOR_SPEED_BASE / 60) * Pole_Pairs)  // 基准频率
+#define BASE_FREQ                       ((MOTOR_SPEED_BASE / 60) * Pole_Pairs)				// 基准频率
 
 
 #define MAX_BEMF_VOLTAGE                ((MOTOR_SPEED_BASE*Ke)/(1000.0))
@@ -284,17 +285,27 @@ typedef struct
     uint16_t ACBusMin;
     
     // 速度相关
-    int16_t RampInc;
-    int16_t RampDec;
+	enum
+	{
+		OPEN_MODE,
+		CLOSE_MODE
+	}LoopState;
+	uint8_t LoopTime;
+	
+    float RampInc;
+    float RampDec;
+	
     int16_t TargetRef;
-    int16_t ActualRef;
+    float ActualRef;
     int16_t ActualSpeed;
+	
     int16_t ActualQOutValue;
     int16_t QOutRef;
     
     int16_t IQRef;
     int16_t IDRef;
-    
+    int16_t ISRef;
+	
     // 保护相关
     uint16_t BackEMF;
     // 测试
@@ -374,7 +385,8 @@ extern bool data isCtrlPowOn;
 void Tick_Task(void);
 void Motor_Control_State(void);
 
-
+void Loop_Control(void);
+void Ref_Ramp(void);
 void Get_Target_Ref(void);
 #endif
 

+ 128 - 4
User/include/Myproject.h

@@ -5,11 +5,7 @@
 #include <FU68xx_5_Type.h>
 
 #include <Customer.h>
-#include <Parameter.h>
-#include <AddFunction.h>
-#include <Protect.h>
 #include <ProtectSet.h>
-#include <VoltageCompensation.h>
 
 
 // math.h包含算术运算的数学函数
@@ -89,6 +85,134 @@ void  FiledWeakenControl(int16 Ud, int16 Uq , uint16 Dcbusk,int16 Is);
 #define P_Power(POWER)                  _Q15(POWER*2/HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE/1.5)
 #define DAC_OvercurrentValue            (_Q8(I_ValueX(OverHardcurrentValue ))+0x7F)
 
+typedef struct
+{
+    uint16 Max_ia;                     // IA的最大值
+    uint16 Max_ib;                     // IB的最大值
+    uint16 Max_ic;                     // IC的最大值
+    uint16 Max_is;
+    uint16 time;
+} CurrentVarible;
+
+typedef struct
+{
+    int16  mcDcbusFlt;	// 母线电压
+    int16  mcDcbus_max;	// 母线电压最大值
+    int16  mcDcbus_min;	// 母线电压最小值
+    int16  mcDcbus_chazhi;	// 母线电压最小值
+    int16  Powerlpf;	// 功率滤波后的值
+    
+    int16  UQFlt;	// UQ滤波后的值
+    int16  UDFlt;	// UD滤波后的值
+    
+    uint16 ChargeStep;	// 预充电的步骤
+    uint16 State_Count;	// 电机各个状态的时间计数
+    uint8  CurrentAlignStatus;
+} FOCCTRL;
+
+extern CurrentVarible xdata   mcCurVarible;
+extern FOCCTRL        xdata   mcFocCtrl;
+
+extern void   Fault_Detection(void);
+extern void   FaultProcess(void);
+extern void   StarRampDealwith(void);
+
+
+uint32_t Abs_F32(int32_t Xn0);
+
 
 
+
+typedef enum
+{
+    FaultNoSource      = 0,                // 无故障
+    FaultHardOVCurrent = 1,                // 硬件过流
+    FaultSoftOVCurrent = 2,                // 软件过流
+    FaultUnderVoltage  = 3,                // 欠压保护
+    FaultOverVoltage   = 4,                // 过压保护
+    FaultLossPhase     = 5,                // 缺相保护
+    FaultStall         = 6,                // 堵转保护
+    FaultStart         = 7,                // 启动保护
+	FaultIpmTemp       = 9,                // IPM温度保护
+	FaultIbusOffset    = 11,               // pianzhi
+	FaultshuruLoss     = 14,
+	
+} FaultStateType;
+
+
+typedef struct
+{
+    uint16 SecondStartTimes;           // 二次启动保护的次数
+    uint16 StallTimes;                 // 堵转保护次数
+    uint16 LossPHTimes;                // 缺相保护次数
+    uint16 CurrentPretectTimes;        // 过流保护次数
+    uint8  StartFlag;                  // 启动保护的标志位,用于判断哪个方法起作用
+    uint8  StallFlag;                  // 堵转保护的标志位,用于判断哪个方法起作用
+	  uint8  IbusOffsetProtectTimes;     //偏执电压保护次数
+	  uint8  shurulossTimes;
+	
+}ProtectVarible;
+
+typedef struct
+{
+    uint8 segment;                    // 分段执行
+
+    //voltage protect
+    uint16 OverVoltDetecCnt;           // 过压检测计数
+    uint16 UnderVoltDetecCnt;          // 欠压检测计数
+    uint16 VoltRecoverCnt;             // 过压恢复计数
+	  uint16 OverTempDetecCnt;           // 过温检测计数
+	  uint16 OverHuantempDetecCnt;           // 过温检测计数
+	  uint16 OverGuantempDetecCnt;           // 过温检测计数
+	  uint16 TempRecoverCnt;             // 过温恢复计数
+	  uint16 HuantempRecoverCnt;             // 过温恢复计数
+	  uint16 GuantempRecoverCnt;             // 过温恢复计数
+    uint32 CurrentRecoverCnt;          // 过流保护恢复计数
+
+	  uint8  IbusOffsetRecoverCnt;     ///偏执电压保护恢复次数
+    //stall protect
+    uint16 StallDelayCnt;              // 堵转延迟判断计时
+    uint16 StallDectEs;                // method 1,与ES相关
+	  uint16 StallDectEs2;                // method 1,与ES相关
+    uint16 StallDectSpeed;             // method 2,与速度相关
+    uint32 StallReCount;               // 堵转保护恢复计数
+	
+    //Loss Phase protect
+    uint16 Lphasecnt;                  // 缺相保护计时
+    uint16 AOpencnt ;                  // A缺相计数
+    uint16 BOpencnt ;                  // B缺相计数
+    uint16 COpencnt ;                  // C缺相计数
+    uint16 mcLossPHRecCount;           // 缺相恢复计数
+		uint16 shurulossRecCount;           // 缺相恢复计数
+		int16  shurulossCnt;
+		
+    int32 CurrentASum;
+    int32 CurrentBSum;
+    int32 CurrentCSum;
+    
+    int16 CurrentAAlign;
+    int16 CurrentBAlign;
+    int16 CurrentCAlign;
+    
+		//start protect
+    int16 StartESCount;                // 启动保护判断ES的计数
+    int16 StartEsCnt;                  // 启动保护判断ES的计时
+    int16 StartDelay;                  // 启动保护判断ES的延迟
+    int16 StartFocmode;                // 启动保护判断FOCMODE状态的计时
+    int16 StartSpeedCnt;               // 启动保护判断速度和ES的计时
+		uint32 commu_time;
+}FaultVarible;
+
+extern FaultStateType     xdata    mcFaultSource;
+extern ProtectVarible     xdata    mcProtectTime;
+extern FaultVarible       idata    mcFaultDect;
+
+
+extern void   Fault_OverUnderVoltage(void);
+extern void   Fault_Overcurrent(void);
+extern void   Fault_OverCurrentRecover(void);
+extern void   Fault_Stall(void);
+extern void   Fault_phaseloss(void);
+extern void   Fault_IPMOverTemp(void);
+extern void   Fault_Detection(void);
 #endif

+ 0 - 104
User/include/Protect.h

@@ -1,104 +0,0 @@
-#ifndef __Protect_H_
-#define __Protect_H_
-
-#include <Myproject.h>
-
-typedef enum
-{
-    FaultNoSource      = 0,                // 无故障
-    FaultHardOVCurrent = 1,                // 硬件过流
-    FaultSoftOVCurrent = 2,                // 软件过流
-    FaultUnderVoltage  = 3,                // 欠压保护
-    FaultOverVoltage   = 4,                // 过压保护
-    FaultLossPhase     = 5,                // 缺相保护
-    FaultStall         = 6,                // 堵转保护
-    FaultStart         = 7,                // 启动保护
-	FaultIpmTemp       = 9,                // IPM温度保护
-	FaultIbusOffset    = 11,               // pianzhi
-	FaultshuruLoss     = 14,
-	
-} FaultStateType;
-
-
-typedef struct
-{
-    uint16 SecondStartTimes;           // 二次启动保护的次数
-    uint16 StallTimes;                 // 堵转保护次数
-    uint16 LossPHTimes;                // 缺相保护次数
-    uint16 CurrentPretectTimes;        // 过流保护次数
-    uint8  StartFlag;                  // 启动保护的标志位,用于判断哪个方法起作用
-    uint8  StallFlag;                  // 堵转保护的标志位,用于判断哪个方法起作用
-	  uint8  IbusOffsetProtectTimes;     //偏执电压保护次数
-	  uint8  shurulossTimes;
-	
-}ProtectVarible;
-
-typedef struct
-{
-    uint8 segment;                    // 分段执行
-
-    //voltage protect
-    uint16 OverVoltDetecCnt;           // 过压检测计数
-    uint16 UnderVoltDetecCnt;          // 欠压检测计数
-    uint16 VoltRecoverCnt;             // 过压恢复计数
-	  uint16 OverTempDetecCnt;           // 过温检测计数
-	  uint16 OverHuantempDetecCnt;           // 过温检测计数
-	  uint16 OverGuantempDetecCnt;           // 过温检测计数
-	  uint16 TempRecoverCnt;             // 过温恢复计数
-	  uint16 HuantempRecoverCnt;             // 过温恢复计数
-	  uint16 GuantempRecoverCnt;             // 过温恢复计数
-    uint32 CurrentRecoverCnt;          // 过流保护恢复计数
-
-	  uint8  IbusOffsetRecoverCnt;     ///偏执电压保护恢复次数
-    //stall protect
-    uint16 StallDelayCnt;              // 堵转延迟判断计时
-    uint16 StallDectEs;                // method 1,与ES相关
-	  uint16 StallDectEs2;                // method 1,与ES相关
-    uint16 StallDectSpeed;             // method 2,与速度相关
-    uint32 StallReCount;               // 堵转保护恢复计数
-	
-    //Loss Phase protect
-    uint16 Lphasecnt;                  // 缺相保护计时
-    uint16 AOpencnt ;                  // A缺相计数
-    uint16 BOpencnt ;                  // B缺相计数
-    uint16 COpencnt ;                  // C缺相计数
-    uint16 mcLossPHRecCount;           // 缺相恢复计数
-		uint16 shurulossRecCount;           // 缺相恢复计数
-		int16  shurulossCnt;
-		
-    int32 CurrentASum;
-    int32 CurrentBSum;
-    int32 CurrentCSum;
-    
-    int16 CurrentAAlign;
-    int16 CurrentBAlign;
-    int16 CurrentCAlign;
-    
-		//start protect
-    int16 StartESCount;                // 启动保护判断ES的计数
-    int16 StartEsCnt;                  // 启动保护判断ES的计时
-    int16 StartDelay;                  // 启动保护判断ES的延迟
-    int16 StartFocmode;                // 启动保护判断FOCMODE状态的计时
-    int16 StartSpeedCnt;               // 启动保护判断速度和ES的计时
-		uint32 commu_time;
-}FaultVarible;
-
-extern FaultStateType     xdata    mcFaultSource;
-extern ProtectVarible     xdata    mcProtectTime;
-extern FaultVarible       idata    mcFaultDect;
-
-
-extern void   Fault_OverUnderVoltage(void);
-extern void   Fault_Overcurrent(void);
-extern void   Fault_OverCurrentRecover(void);
-extern void   Fault_Stall(void);
-extern void   Fault_phaseloss(void);
-extern void   Fault_IPMOverTemp(void);
-extern void   PFCFault_OverUnderVoltage(void);
-extern void   PFCFault_Overcurrent(void);
-extern void   Fault_Detection(void);
-extern void   PFCFault_Detection(void);
-
-
-
-#endif

+ 0 - 22
User/include/VoltageCompensation.h

@@ -1,22 +0,0 @@
-#ifndef __VoltageCompensation_H_
-#define __VoltageCompensation_H_
-
-typedef struct
-{    
-	  uint16 mcDcbus; 
-    int16 mcDcbuschazhi; 
-		uint16 Uqcps;
-		uint16 testUq;
-		uint16 testUq1;
-		uint16 testUq2;
-		uint16 testUq3;
-		int16 testUq4;	
-}VOLCOMP;
-
-
-extern VOLCOMP xdata VoltageComp;
-
-extern void VoltageCompensation(void);   //VoltageCompensationEn????
-
-
-#endif