ソースを参照

更新

1.预定位重写
2.头文件整理
avery 6 ヶ月 前
コミット
27957748f5

+ 1 - 0
.gitignore

@@ -5,3 +5,4 @@
 *.bak
 KeilC51/Listing/
 KeilC51/Output/
+*..DS_Store

+ 12 - 8
User/Application/main.c

@@ -17,6 +17,11 @@ Motor_Control_t motorControl;
 CurrentVarible     xdata   mcCurVarible;
 FOCCTRL            xdata   mcFocCtrl;
 
+/**
+ * @function     HardwareInit
+ * @brief        硬件初始化
+ * @date         2025-11-11
+*/
 void HardwareInit(void)
 {
     // 上电等待
@@ -45,21 +50,20 @@ void HardwareInit(void)
     EA = 1;
 }
 
-/*  ---------------------------------------------------------------------------------
-    Function Name : void SoftwareInit(void)
-    Description   : 软件初始化,初始化所有定义变量,按键初始化扫描
-    Input         : 无
-    Output        : 无
-    ----------------------------------------------------------------------------------*/
+
+/**
+ * @function     SoftwareInit
+ * @brief        软件初始化
+ * @date         2025-11-11
+*/
 void SoftwareInit(void)
 {
     // FaultVarible变量清零
     memset(&mcFaultDect, 0, sizeof(FaultVarible));
     // ProtectVarible保护次数清零
     memset(&mcProtectTime, 0, sizeof(ProtectVarible));
-    /// 电流保护的变量清零
+    // 电流保护的变量清零
     memset(&mcCurVarible, 0, sizeof(CurrentVarible));
-    McStaSet.SetMode = 0;
     mcState = mcReady;
     mcFaultSource = 0;
 }

+ 119 - 84
User/Function/FocControl.c

@@ -1,7 +1,6 @@
 #include <Myproject.h>
 
 MotStaType   mcState;
-MotStaM      McStaSet;
 
 /**
     @function     Motor_Control_State
@@ -26,12 +25,10 @@ void Motor_Control_State(void)
     switch (mcState)
     {
         case mcReady:
-        {
             switch (currOffset.OffsetCalib)
             {
                 // 初始化状态
                 case CALIB_INIT:
-                {
                     if (powerControl.PowerSate == POWER_RUN)
                     {
                         ClrBit(DRV_CR, FOCEN);
@@ -49,11 +46,9 @@ void Motor_Control_State(void)
                     }
                     
                     break;
-                }
-                
+                    
                 // 检查状态
                 case GET_OFFSET:
-                {
                     SetBit(ADC_CR, ADCBSY);
                     
                     while (ReadBit(ADC_CR, ADCBSY));
@@ -81,11 +76,9 @@ void Motor_Control_State(void)
                     }
                     
                     break;
-                }
-                
+                    
                 // 启动状态
                 case OFFSET_READY:
-                {
                     if (isCtrlPowOn)
                     {
                         mcState = mcInit;
@@ -98,21 +91,17 @@ void Motor_Control_State(void)
                     }
                     
                     break;
-                }
             }
             
             break;
-        }
-        
+            
         case mcInit:
-        {
-			if (motorControl.DCBus > UNDER_RECOVER_VALUE)
+            if (motorControl.DCBus > UNDER_RECOVER_VALUE)
             {
                 // 关闭软件电流采样的ADC
                 mcFaultSource = 0;
                 memset(&mcFaultDect, 0, sizeof(FaultVarible));
                 memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
-                McStaSet.SetMode = 0;
                 // PI控制器初始化
                 HW_Zero_PI_Init();
                 // 弱磁初始化
@@ -128,102 +117,157 @@ void Motor_Control_State(void)
                 // 此模块不需要预充电
                 #if (PRE_DRIVER_CHARGE)
                 mcState = mcCharge;
-                mcFocCtrl.ChargeStep = 0;
-                mcFocCtrl.State_Count = 0;
+                motorControl.ChargeState = CHARGE_INIT;
                 #else
                 mcState = mcAlign;
-                mcFocCtrl.State_Count = Align_Time;
                 #endif
             }
+            
             break;
-        }
-        
-        #if (PRE_DRIVER_CHARGE)
-        
+            #if (PRE_DRIVER_CHARGE)
+            
         case mcCharge:
-        {
-            switch (mcFocCtrl.ChargeStep)
+            switch (motorControl.ChargeState)
             {
-                case 0:
-                {
+                case CHARGE_INIT:
                     // 配置占空比
-                    DRV_DR = Calib_Duty * DRV_ARR;
+                    DRV_DR = CALIB_DUTY * DRV_ARR;
                     // DRV_CTL:PWM来源选择
                     // OCS = 0, DRV_COMR
                     // OCS = 1, FOC/SVPWM/SPWM
                     ClrBit(DRV_CR, OCS);
-                    mcFocCtrl.ChargeStep = 1;
+                    motorControl.ChargeState = U_BRIDGE;
                     mcFocCtrl.State_Count = 30;
                     break;
-                }
-                
+                    
                 // U相下桥臂通
-                case 1:
-                {
+                case U_BRIDGE:
                     DRV_CMR |= 0x01;
                     MOE = 1;
+                    
+                    if (!mcFocCtrl.State_Count)
+                    {
+                        mcFocCtrl.State_Count = 30;
+                        motorControl.ChargeState = V_BRIDGE
+                    }
+                    
                     break;
-                }
-                
+                    
                 // V相下桥臂导通
-                case 2:
-                {
+                case V_BRIDGE:
                     DRV_CMR |= 0x04;
+                    
+                    if (!mcFocCtrl.State_Count)
+                    {
+                        mcFocCtrl.State_Count = 30;
+                        motorControl.ChargeState = W_BRIDGE
+                    }
+                    
                     break;
-                }
-                
+                    
                 // W相下桥臂导通
-                case 3:
-                {
+                case W_BRIDGE:
                     DRV_CMR |= 0x10;
+                    
+                    if (!mcFocCtrl.State_Count)
+                    { motorControl.ChargeState = CHARGE_END; }
+                    
                     break;
-                }
-                
-                case 4:
-                {
-                    #if (1)
+                    
+                // 启动
+                case CHARGE_END:
+                    #if (0)
                     DRV_CMR |= 0x3F;
                     #else
                     MOE = 0;
                     mcState = mcAlign;
-                    mcFocCtrl.State_Count = Align_Time;
                     #endif
                     break;
-                }
             }
             
-            if ((mcFocCtrl.State_Count == 0) && (mcFocCtrl.ChargeStep != 4 ))
+            break;
+            #endif
+            
+        case mcAlign:
+            switch (motorControl.AlignState)
             {
-                mcFocCtrl.ChargeStep ++;
-                mcFocCtrl.State_Count = 30;
+                // 预定位初始化
+                case ALIGN_INIT:
+                    // FOC初始化
+                    FOC_Init();
+                    // 配置预定位的电流、KP、KI
+                    FOC_IDREF = 0;
+                    FOC_IQREF = 0;
+                    FOC_DKP   = DQKP_Alignment;
+                    FOC_DKI   = DQKI_Alignment;
+                    FOC_QKP   = DQKP_Alignment;
+                    FOC_QKI   = DQKI_Alignment;
+                    FOC_EKP   = OBSW_KP_GAIN;
+                    FOC_EKI   = OBSW_KI_GAIN;
+                    // 配置预定位角度
+                    #if (EstimateAlgorithm == SMO)
+                    FOC__ETHETA   = FOC__THETA - 4836;
+                    #elif (EstimateAlgorithm == PLL)
+                    FOC__ETHETA   = FOC__THETA;
+                    #endif
+                    DRV_CMR |= 0x03F;
+                    MOE = 1;
+                    mcFocCtrl.State_Count = 500;
+                    motorControl.AlignState = ALIGN_CURR_RAMP;
+                    break;
+                    
+                // 第一角度预定位电流爬坡
+                case ALIGN_CURR_RAMP:
+                    FOC__THETA = ALIGN_ANGLE_1;
+                    FOC_IQREF = IQ_ALIGN_CURRENT * (AlignmentRampTime - mcFocCtrl.State_Count) / AlignmentRampTime;
+                    
+                    if (!mcFocCtrl.State_Count)
+                    {
+                        mcFocCtrl.State_Count = 500;
+                        motorControl.AlignState = ALIGN_FIRST_ANGLE;
+                    }
+                    
+                    break;
+                    
+                // 第一角度预定位
+                case ALIGN_FIRST_ANGLE:
+                    FOC_IQREF = IQ_ALIGN_CURRENT;
+                    FOC__THETA = ALIGN_ANGLE_1;
+                    
+                    if (!mcFocCtrl.State_Count)
+                    {
+                        mcFocCtrl.State_Count = 500;
+                        motorControl.AlignState = ALIGN_SECOND_ANGLE;
+                    }
+                    
+                    break;
+                    
+                // 第二角度预定位
+                case ALIGN_SECOND_ANGLE:
+                    FOC_IQREF = IQ_ALIGN_CURRENT;
+                    FOC__THETA = ALIGN_ANGLE_2;
+                    
+                    if (!mcFocCtrl.State_Count)
+                    {
+                        mcFocCtrl.State_Count = 500;
+                        motorControl.AlignState = ALIGN_INIT;
+                        mcState = mcStart;
+                    }
+                    
+                    break;
             }
             
             break;
-        }
-        
-        #endif
-        
-        case mcAlign:
-        {
-            Motor_Align();
-            break;
-        }
-        
+            
         case mcStart:   // 配置电机启动参数,进入mcRun状态。
-        {
             Motor_Open();
             break;
-        }
-        
-        case mcRun:     // 运行状态,若运行状态的给定变为0,进入mcStop状态。
-        {
+            
+        case mcRun:
             break;
-        }
-        
+            
         case mcStop:
-        {
             #if (StopBrakeFlag)
-        
             if (motorControl.ActualSpeed < MOTOR_STOP_SPEED)
             {
                 MOE = 0;
@@ -247,14 +291,12 @@ void Motor_Control_State(void)
             }
             #endif
             break;
-        }
-        
+            
         case mcBrake:
-        {
             if (isCtrlPowOn)
             {
                 mcState = mcReady;
-                mcFocCtrl.State_Count = 0;      //单位:1ms  强制关机时间
+                mcFocCtrl.State_Count = 0;
             }
             else if (mcFocCtrl.State_Count == 0)
             {
@@ -264,21 +306,16 @@ void Motor_Control_State(void)
             }
             
             break;
-        }
-        
+            
         case mcFault:
-        {
             if (mcFaultSource == FaultNoSource)
             { mcState = mcReady;}
             
             break;
-        }
-        
+            
         default:
-        {
             mcState = mcReady;
             break;
-        }
     }
 }
 
@@ -293,8 +330,8 @@ 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.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)
+        mcFocCtrl.UDFlt =  LPF_Zero_Update(FOC__UD, mcFocCtrl.UDFlt, LPF_K(30.0));
+        mcFocCtrl.UQFlt =  LPF_Zero_Update(FOC__UQ, mcFocCtrl.UQFlt, LPF_K(30.0));
         motorControl.ActualSpeed = LPF_Zero_Update(FOC__EOME, motorControl.ActualSpeed, LPF_K(71.0));
         motorControl.BackEMF = LPF_Zero_Update(FOC__EMF, motorControl.BackEMF, LPF_K(5.0));
         
@@ -307,6 +344,4 @@ void Tick_Task(void)
         motorControl.ActualSpeed = 0;
         motorControl.BackEMF = 0;
     }
-    
-    // StarRampDealwith();
 }

+ 16 - 63
User/Function/FocControlFunction.c

@@ -1,11 +1,11 @@
 #include <Myproject.h>
 
 /**
- * @function     Abs_F32
- * @brief        取绝对值
- * @param[in]    Xn0: [输入/出] 
- * @return       None
- * @date         2025-11-08
+    @function     Abs_F32
+    @brief        取绝对值
+    @param[in]    Xn0: [输入/出]
+    @return       None
+    @date         2025-11-08
 */
 uint32_t Abs_F32(int32_t Xn0)
 {
@@ -15,6 +15,11 @@ uint32_t Abs_F32(int32_t Xn0)
     { return (Xn0); }
 }
 
+/**
+    @function     FOC_Init
+    @brief        硬件FOC初始化
+    @date         2025-11-11
+*/
 void FOC_Init(void)
 {
     DRV_CMR = 0x0ABF;
@@ -66,6 +71,7 @@ void FOC_Init(void)
         FOC_EKLPFMIN  = OBSE_PLLKI_GAIN1;
     }
     #endif
+    // 估算器参数初始化
     FOC_EK1         = OBS_K1T;
     FOC_EK2         = OBS_K2T;
     FOC_EK3         = OBS_K3T;
@@ -146,59 +152,6 @@ void FOC_Init(void)
     SetBit(DRV_CR, OCS);
 }
 
-/**
-    @function     Motor_Align
-    @brief        预定位
-    @date         2025-11-08
-*/
-void Motor_Align(void)
-{
-    if (McStaSet.SetFlag.AlignSetFlag == 0)
-    {
-        McStaSet.SetFlag.AlignSetFlag = 1;
-        // FOC初始化
-        FOC_Init();
-        // 配置预定位的电流、KP、KI
-        FOC_IDREF = 0;
-        FOC_IQREF = 0;
-        FOC_DKP   = DQKP_Alignment;
-        FOC_DKI   = DQKI_Alignment;
-        FOC_QKP   = DQKP_Alignment;
-        FOC_QKI   = DQKI_Alignment;
-        FOC_EKP   = OBSW_KP_GAIN;
-        FOC_EKI   = OBSW_KI_GAIN;
-        // 配置预定位角度
-        #if (EstimateAlgorithm == SMO)
-        FOC__ETHETA   = FOC__THETA - 4836;
-        #elif (EstimateAlgorithm == PLL)
-        FOC__ETHETA   = FOC__THETA;
-        #endif
-        DRV_CMR |= 0x03F;
-        MOE = 1;
-    }
-    
-    if (mcFocCtrl.State_Count > (AlignmentHoldTime1 + AlignmentHoldTime2))
-    {
-        mcFocCtrl.CurrentAlignStatus = 0;
-        FOC__THETA = Align_Angle1;
-        FOC_IQREF = ID_Align_CURRENT_End * (Align_Time - mcFocCtrl.State_Count) / AlignmentRampTime;
-    }
-    else if (mcFocCtrl.State_Count > AlignmentHoldTime2)
-    {
-        mcFocCtrl.CurrentAlignStatus = 1;
-        FOC__THETA = Align_Angle1;
-        FOC_IQREF = ID_Align_CURRENT_End;
-    }
-    else if (mcFocCtrl.State_Count > 0)
-    {
-        mcFocCtrl.CurrentAlignStatus = 2;
-        FOC__THETA = Align_Angle2;
-        FOC_IQREF = ID_Align_CURRENT_End;
-    }
-    else
-    { mcState = mcStart; }
-}
-
 /**
     @function     Motor_Open
     @brief        启动
@@ -283,15 +236,15 @@ void Motor_Open(void)
     }
     #endif
     // Q轴启动电流
-    FOC_IQREF = IQ_Start_CURRENT ;
+    FOC_IQREF = IQ_START_CURRENT ;
 }
 
 
 
 /**
- * @function     StarRampDealwith
- * @brief        估算器增益调整
- * @date         2025-11-08
+    @function     StarRampDealwith
+    @brief        估算器增益调整
+    @date         2025-11-08
 */
 void StarRampDealwith(void)
 {
@@ -308,7 +261,7 @@ void StarRampDealwith(void)
             }
             #endif
         }
-        else if (mcFocCtrl.State_Count == 1000) 
+        else if (mcFocCtrl.State_Count == 1000)
         {
             FOC_EKP = OBSW_KP_GAIN_RUN1;             // 估算器里的PI的KP
             FOC_EKI = OBSW_KI_GAIN_RUN1;             // 估算器里的PI的KI

+ 3 - 3
User/Function/Protect.c

@@ -338,13 +338,13 @@ void Fault_phaseloss(void)
 {
     if (mcState == mcAlign)
     {
-        if (mcFocCtrl.CurrentAlignStatus == 0)
+        if (motorControl.AlignState == ALIGN_CURR_RAMP)
         {
             mcFaultDect.CurrentASum += FOC__IA;
             mcFaultDect.CurrentBSum += FOC__IB;
             mcFaultDect.CurrentCSum += FOC__IC;
         }
-        else if (mcFocCtrl.CurrentAlignStatus == 1)
+        else if (motorControl.AlignState == ALIGN_FIRST_ANGLE)
         {
             mcFaultDect.CurrentAAlign =  mcFaultDect.CurrentASum / AlignmentHoldTime1 ;
             mcFaultDect.CurrentBAlign = -(mcFaultDect.CurrentBSum << 1) / AlignmentHoldTime1;
@@ -368,7 +368,7 @@ void Fault_phaseloss(void)
         mcCurVarible.Max_ic = FOC__ICMAX;
         mcFaultDect.Lphasecnt++;
         
-        if (mcFaultDect.Lphasecnt > 40) //100*5=500ms
+        if (mcFaultDect.Lphasecnt > 40)
         {
             mcFaultDect.Lphasecnt = 0;
             

+ 93 - 99
User/include/Customer.h

@@ -17,145 +17,124 @@
 
 // ------------------------------------------------------------------------------------------------------------------
 // 2.硬件相关:载波频率(KHz) 死区(us) 单电阻最小窗口(us) 驱动电平 基准电压(V)
+
 #define PWM_FREQUENCY                  (5.0)
 #define PWM_DEADTIME                   (5.0)
 #define MIN_WIND_TIME                  (5.9)
 #define HW_ADC_VREF                    (VREF5_0)
+
 #define HW_ADC_REF                     (5.0)
+
 // 运放配置 运放倍数
 #define HW_AMP_MODE                    (AMP_NOMAL)
 #define HW_AMPGAIN                     (0.5)
 
+// 等效采样电阻
+#define HW_RSHUNT                      (0.04)
 
-// ------------------------------------------------------------------------------------------------------------------
-// 3.其他
-
-#define HW_RSHUNT                      (0.04)                                  // (Ω)  采样电阻
-
-
-#define RV1                            (940.0)                                  // (kΩ) 母线电压分压电阻1
-#define RV2                            (940.0)                                  // (kΩ) 母线电压分压电阻2
-#define RV3                            (0.3)                                    // (kΩ) 母线电压分压电阻3
+// 直流母线分压
+#define RV1                            (940.0)
+#define RV2                            (940.0)
+#define RV3                            (0.3)
 
+// 交流输入分压
+#define RL1                            (450.0)
+#define RL2                            (2.0)
+#define RL                             ((RL1 + RL2) / RL2)
+#define HW_L_VOLT_MAX                  (HW_ADC_REF * RL)
 
-#define RL1                            (450.0)                                  // (kΩ) 母线电压分压电阻1
-#define RL2                            (2.0)                                    // (kΩ) 母线电压分压电阻2
-#define RL                             ((RL1 + RL2) / RL2)                // 分压比    
-#define HW_L_VOLT_MAX                  (HW_ADC_REF * RL)                        // (V)  ADC可测得的最大母线电压  
-
-
-#define Udcmax_ms                      (20.0* PWM_FREQUENCY )                       //  60*ms读取一次UDC最大值和最小值         
-
-
-// 预充电设置值
-#define PRE_DRIVER_CHARGE				(0) 						// 预充电使能
-#define Calib_Duty                     (0.1)						// 预充电占空比
+// ------------------------------------------------------------------------------------------------------------------
+// 3.预充电
 
+// 预充电使能
+#define PRE_DRIVER_CHARGE               (0)
+// 预充电占空比
+#define CALIB_DUTY                      (0.1)
 
-// 正常运行时估算算法的参数设置值
-#define E_BW1                          (80.0)                                 // PLL算法里的反电动势滤波值
-#define E_BW2                          (80.0)                                 // PLL算法里的反电动势滤波值
-#define E_BW3                          (80.0)                                 // PLL算法里的反电动势滤波值
-#define E_BW4                          (80.0)                                 // PLL算法里的反电动势滤波值
-#define E_BW5                          (80.0)                                 // PLL算法里的反电动势滤波值
+// ------------------------------------------------------------------------------------------------------------------
+// 4.预定位
 
+// 预定位电流环KPKI
 #define DQKP_Alignment                  _Q12(2.0)
 #define DQKI_Alignment                  _Q15(0.05)
 
-#define IQ_Align_CURRENT                I_Value(0.0)
-#define ID_Align_CURRENT_Start          I_Value(2.0)
-#define ID_Align_CURRENT_End            ID_Align_CURRENT_Start
+#define IQ_ALIGN_CURRENT                I_Value(2.0)                // 预定位电流
 
-#define Align_Angle1                    _Q15((float)0.0 / 180.0)
-#define Align_Angle2                    _Q15((float)90.0 / 180.0)
-#define Align_Start                     (Align_Angle2 - _Q15((float)30.0 / 180.0))
+// 预定位角度
+#define ALIGN_ANGLE_1                   _Q15(0.0 / 180.0)
+#define ALIGN_ANGLE_2                   _Q15(90.0 / 180.0)
 
+// 预定位时间
 #define AlignmentRampTime               (500.0)
 #define AlignmentHoldTime1              (500.0)
 #define AlignmentHoldTime2              (500.0)
 #define Align_Time                      (AlignmentRampTime + AlignmentHoldTime1+AlignmentHoldTime2)
 
-// 启动电流
-#define ID_Start_CURRENT               I_Value(0.0)                            // (A) D轴启动电流
-#define IQ_Start_CURRENT               I_Value(2.0)                            // (A) Q轴启动电流
-
-
-/*************Omega启动的参数***************/
-#define ATO_BW                         (100.0)                               // 观测器带宽的滤波值,经典值为1.0-200.0
-#define ATO_BW_RUN                     (130.0)
-#define ATO_BW_RUN1                    (140.0)
-#define ATO_BW_RUN2                    (150.0)
-#define ATO_BW_RUN3                    (160.0)
-#define ATO_BW_RUN4                    (190.0)
+// ------------------------------------------------------------------------------------------------------------------
+// 5.启动
 
-//open 算法启动参数
-#define MOTOR_OPEN_ACC                 _Q15(1.0 / MOTOR_SPEED_BASE)             // 强拖启动的增量(每载波周期加一次)
-#define MOTOR_OPEN_ACC_MIN             _Q15(100.0 / MOTOR_SPEED_BASE)           // 强拖启动的初始速度
-#define MOTOR_OPEN_ACC_CNT             (250.0)                                  // 强拖启动的执行次数(MOTOR_OPEN_ACC_CNT*256)
-#define MOTOR_OPEN_ACC_CYCLE           (100)                                    // 强拖启动循环拖动的次数
+// 电流环KPKI
+#define DQKPStart                       _Q12(2.5)
+#define DQKIStart                       _Q15(0.01)
+#define DQKP                            _Q12(2.0)
+#define DQKI                            _Q15(0.002)
 
-//OMEGA启动参数
+// 启动电流
+#define ID_START_CURRENT                I_Value(0.0)
+#define IQ_START_CURRENT                I_Value(2.0)
+
+// 观测器带宽
+#define ATO_BW                          (100.0)
+#define ATO_BW_RUN                      (130.0)
+#define ATO_BW_RUN1                     (140.0)
+#define ATO_BW_RUN2                     (150.0)
+#define ATO_BW_RUN3                     (160.0)
+#define ATO_BW_RUN4                     (190.0)
+
+// PLL算法里的反电动势滤波值
+#define E_BW1                           (80.0)
+#define E_BW2                           (80.0)
+#define E_BW3                           (80.0)
+#define E_BW4                           (80.0)
+#define E_BW5                           (80.0)
+
+// open 算法启动参数
+#define MOTOR_OPEN_ACC                  _Q15(1.0 / MOTOR_SPEED_BASE)            // 强拖启动的增量(每载波周期加一次)
+#define MOTOR_OPEN_ACC_MIN              _Q15(100.0 / MOTOR_SPEED_BASE)          // 强拖启动的初始速度
+#define MOTOR_OPEN_ACC_CNT              (250.0)                                 // 强拖启动的执行次数(MOTOR_OPEN_ACC_CNT*256)
+#define MOTOR_OPEN_ACC_CYCLE            (100)                                   // 强拖启动循环拖动的次数
+
+// OMEGA启动参数
 #define MOTOR_OMEGA_RAMP_ACC            (300.0)                                 // omega启动的增量   12
 #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_Min             _Q15(MOTOR_OPEN_ACC_MIN / MOTOR_SPEED_BASE)
-
-
-
-
-#define MOTOR_SPEED_SMOMIN_RPM         (400.0)
-#define MOTOR_LOOP_RPM                  _Q15(500.0 / MOTOR_SPEED_BASE)
-
-
-
-#define StopBrakeFlag                  (0)
-#define StopWaitTime                   (2000)                                  // (ms) 刹车等待时间
-
-
-// 弱磁控制
-#define FiledWeakenCompEnable           (0)
-#define DcbusK                          _Q15(0.8)
-#define FiledWeakenKp                   _Q12(0.4)
-#define FiledWeakenKi                   _Q15(0.0001)
-
-
-#define IFFDebugg						(0)							//  强拖测试模式 
 
+#define MOTOR_SPEED_SMOMIN_RPM          (400.0)                                 // 滑膜运行最小速度
+#define MOTOR_LOOP_RPM                  _Q15(500.0 / MOTOR_SPEED_BASE)          // 闭环切换转速
 
 // ------------------------------------------------------------------------------------------------------------------
-// 3.环路相关
-#define OUT_LOOP_CONTROL                (1)							// 外环控制使能
-#define LOOP_MODE                       (SPEED_CONTROL_MODE)		// 外环配置
-#define CONTROL_MODE                    (NONEMODE)					// 控制模式
-
-
-#define LOOP_CYCLE                		(1)						// 速度环调节周期 
-
-
-// 电流环KPKI
-#define DQKPStart                      _Q12(2.5)                             
-#define DQKIStart                      _Q15(0.01)                           
-#define DQKP                           _Q12(2.0)                           
-#define DQKI                           _Q15(0.002)
+// 6.环路相关
 
-// 电流环控制步进参数
-#define QOUTINC                        (1)
 
+#define OUT_LOOP_CONTROL                (1)                                     // 外环控制使能
+#define LOOP_MODE                       (SPEED_CONTROL_MODE)                    // 外环配置
+#define CONTROL_MODE                    (NONEMODE)                              // 控制模式
+#define LOOP_CYCLE                      (1)                                     // 速度环调节周期
+#define QOUTINC                         (1)                                     // 电流环控制步进参数
 
 // 速度环输入值步进参数
-#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 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))
 
 // 外环KPKI
-#define SKP								_Q12(0.5)
-#define SKI								_Q15(0.002)
+#define SKP                             _Q12(0.5)
+#define SKI                             _Q15(0.01)
 
 // 外环输出限幅
-#define SOUTMAX							I_Value(5.0)
-#define SOUTMIN							I_Value(0.0)
+#define SOUTMAX                         I_Value(5.0)
+#define SOUTMIN                         I_Value(0.01)
 
 
 // 极限速度限制
@@ -165,7 +144,22 @@
 #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)
+
+#define TARGET_SPEED_SET                _Q15(3000.0/MOTOR_SPEED_BASE)           // 测试转速
+
+
+#define StopBrakeFlag                   (0)
+#define StopWaitTime                    (2000)                                  // (ms) 刹车等待时间
+
+
+// ------------------------------------------------------------------------------------------------------------------
+// 7.附加功能
+
+// 弱磁控制
+#define FiledWeakenCompEnable           (0)
+#define DcbusK                          _Q15(0.8)
+#define FiledWeakenKp                   _Q12(0.4)
+#define FiledWeakenKi                   _Q15(0.0001)
+
 
 #endif

+ 46 - 25
User/include/Definition.h

@@ -123,22 +123,22 @@
 // 速度带宽的滤波值,经典值为5.0-40.0
 #define SPD_BW                          (25.0)
 #define ATT_COEF                        (0.95)
-#define OBS_KSLIDE                     _Q15(0.85)											// SMO算法里的滑膜增益值
+#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))
@@ -212,6 +212,9 @@
 #define OBSE_PLLKI_GAIN5                _Q11((_2PI*E_BW5*_2PI*E_BW5*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
 
 
+//  强拖测试模式
+#define IFFDebugg                       (0)
+
 // ------------------------------------------------------------------------------------------------------------------
 // 3.其他宏定义
 
@@ -284,33 +287,50 @@ typedef struct
     uint16_t ACBusMax;
     uint16_t ACBusMin;
     
-    // 速度相关
-	enum
-	{
-		OPEN_MODE,
-		CLOSE_MODE
-	}LoopState;
-	uint8_t LoopTime;
-	
+    // 预充电状态
+    enum
+    {
+        CHARGE_INIT,
+        U_BRIDGE,
+        V_BRIDGE,
+        W_BRIDGE,
+        CHARGE_END
+    } ChargeState;
+    
+    // 预定位状态
+    enum
+    {
+        ALIGN_INIT,
+        ALIGN_CURR_RAMP,
+        ALIGN_FIRST_ANGLE,
+        ALIGN_SECOND_ANGLE
+    } AlignState;
+    
+    // 闭环状态
+    enum
+    {
+        OPEN_MODE,
+        CLOSE_MODE
+    } LoopState;
+    
+    uint8_t LoopTime;
+    
     float RampInc;
     float RampDec;
-	
+    
     int16_t TargetRef;
     float ActualRef;
     int16_t ActualSpeed;
-	
+    
     int16_t ActualQOutValue;
     int16_t QOutRef;
     
     int16_t IQRef;
     int16_t IDRef;
     int16_t ISRef;
-	
+    
     // 保护相关
     uint16_t BackEMF;
-    // 测试
-    int16_t uPhaseCurr;
-    int16_t vPhaseCurr;
 } Motor_Control_t;
 
 extern Motor_Control_t motorControl;
@@ -388,6 +408,7 @@ void Motor_Control_State(void);
 void Loop_Control(void);
 void Ref_Ramp(void);
 void Get_Target_Ref(void);
+
 #endif
 
 

+ 0 - 12
User/include/Myproject.h

@@ -27,18 +27,9 @@ typedef enum
     mcBrake     = 10
 }MotStaType;
 
-typedef union
-{
-    uint8 SetMode;                                     // 整个配置模式使能位
-    struct
-    {
-        uint8 AlignSetFlag     :1;                     // 预定位配置标志位
-    } SetFlag;
-}MotStaM;
 
 
 extern MotStaType mcState;
-extern MotStaM    McStaSet;
 
 
 void CMP0_Init(void);
@@ -60,7 +51,6 @@ unsigned short CRC_Check(unsigned char start_sector , unsigned char offset_secto
 
 extern void FOC_Init(void);
 extern void Motor_Open(void);
-extern void Motor_Align(void);
 
 
 
@@ -105,9 +95,7 @@ typedef struct
     int16  UQFlt;	// UQ滤波后的值
     int16  UDFlt;	// UD滤波后的值
     
-    uint16 ChargeStep;	// 预充电的步骤
     uint16 State_Count;	// 电机各个状态的时间计数
-    uint8  CurrentAlignStatus;
 } FOCCTRL;
 
 extern CurrentVarible xdata   mcCurVarible;