Bläddra i källkod

更新

1.重构电流偏置检查
2.代码格式化
avery 6 månader sedan
förälder
incheckning
6b8bdd0545

+ 22 - 21
User/Application/Interrupt.c

@@ -64,7 +64,7 @@ void DRV_ISR(void) interrupt 3
     if (ReadBit(DRV_SR, DCIF))    // 比较中断
     {
         Fault_Overcurrent(); //软件过流保护
-		#if 0 
+        #if 0
         #if (FiledWeakenCompEnable)
         {
             FiledWeakenControl(FOC__UD, FOC__UQ, udc.WeakenUsRef, mcFocCtrl.IsRef);
@@ -91,7 +91,7 @@ void DRV_ISR(void) interrupt 3
         #if (VoltageCompensationEn)
         VoltageCompensation();//电压补偿
         #endif
-		#endif
+        #endif
         DRV_SR = (DRV_SR | SYSTIF) & (~DCIF);
     }
 }
@@ -116,13 +116,13 @@ void SYStick_INT(void) interrupt 10
 
 
 /**
- * @function     COM1_INT_Handler
- * @brief        I2C/UART1 共用此中断
- * @date         2025-11-05
+    @function     COM1_INT_Handler
+    @brief        I2C/UART1 共用此中断
+    @date         2025-11-05
 */
 void COM1_INT_Handler(void) interrupt 13
 {
-	if (TI)
+    if (TI)
     { TI = 0; }
     
     if (RI)
@@ -130,9 +130,9 @@ void COM1_INT_Handler(void) interrupt 13
 }
 
 /**
- * @function     COM_INT_Handler
- * @brief        SPI/UART2/LIN 共用此中断
- * @date         2025-11-05
+    @function     COM_INT_Handler
+    @brief        SPI/UART2/LIN 共用此中断
+    @date         2025-11-05
 */
 void COM2_INT_Handler(void) interrupt 14
 {
@@ -144,20 +144,21 @@ void COM2_INT_Handler(void) interrupt 14
 }
 
 /**
- * @function     DAM_INT_Handler
- * @brief        DMA中断函数
- * @date         2025-11-05
+    @function     DAM_INT_Handler
+    @brief        DMA中断函数
+    @date         2025-11-05
 */
 void DAM_INT_Handler(void) interrupt 15
 {
-	if(ReadBit(DMA0_CR0,DMAIF))
-	{
-		memset(&DebugDat,0,64);
-		ClrBit(DMA0_CR0,DMAIF);
-	}
-	if(ReadBit(DMA1_CR0,DMAIF))
-	{
-		ClrBit(DMA1_CR0,DMAIF);
-	}
+    if (ReadBit(DMA0_CR0, DMAIF))
+    {
+        memset(&DebugDat, 0, 64);
+        ClrBit(DMA0_CR0, DMAIF);
+    }
+    
+    if (ReadBit(DMA1_CR0, DMAIF))
+    {
+        ClrBit(DMA1_CR0, DMAIF);
+    }
 }
 

+ 9 - 11
User/Application/main.c

@@ -10,6 +10,7 @@
 bool data IsTick = false;
 bool data isCtrlPowOn = false;
 
+Curr_Offset_t xdata currOffset;
 Motor_Control_t motorControl;
 
 void HardwareInit(void)
@@ -33,8 +34,7 @@ void HardwareInit(void)
     Driver_Init();
     // 串口初始化
     UART1_Init();
-	Set_IRQ_DMA(DMA_IRQ_L1);
-	
+    Set_IRQ_DMA(DMA_IRQ_L1);
     // 系统定时器初始化
     Sys_Tick();
     _nop_(); _nop_();
@@ -59,12 +59,11 @@ void SoftwareInit(void)
     /*************外部控制环************/
     memset(&mcFocCtrl, 0, sizeof(FOCCTRL));             // mcFocCtrl变量清零
     mcFocCtrl.mcDcbus_chazhi = 32760;
-	// 电流校准变量初始化
-    memset(&mcCurOffset, 0, sizeof(CurrentOffset));
-    mcCurOffset.IuOffsetSum = 16383;
-    mcCurOffset.IvOffsetSum = 16383;
-    mcCurOffset.Iw_busOffsetSum = 16383;
-	
+    // 电流校准变量初始化
+    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;
@@ -102,15 +101,14 @@ void main(void)
             Tick_Task();
             // 故障保护函数功能
             Fault_Detection();
-			// 调试信息上载
-			Dabug_Data_Update();
+            // 调试信息上载
+            Dabug_Data_Update();
             // 喂狗
             SetBit(WDT_CR, WDTRF);
             IsTick = false;
         }
         
         Motor_Control_State();
-        Get_Current_Offset();
     }
 }
 

+ 1 - 1
User/Function/AddFunction.c

@@ -58,7 +58,7 @@ void Speed_response(void)
                         mcFocCtrl.CtrlMode = 1;
                         Start_CNT = 0;
                         #if (LOOP_MODE == SPEED_CONTROL_MODE)
-                        mcSpeedRamp.ActualValue = motorControl.ActualSpeed + _Q15(150 / MOTOR_SPEED_BASE);
+                        mcSpeedRamp.ActualValue = motorControl.ActualSpeed + _Q15(150.0 / MOTOR_SPEED_BASE);
                         #endif
                         mcFocCtrl.LoopTime = 1;
                         PI0_UKH = mcFocCtrl.mcIqref;

+ 65 - 22
User/Function/FocControl.c

@@ -27,22 +27,71 @@ void Motor_Control_State(void)
     {
         case mcReady:
         {
-            if (mcCurOffset.CalibFlag == 0)
+            switch (currOffset.OffsetCalib)
             {
-                mcCurOffset.CalibFlag = 1;
-                ClrBit(DRV_CR, FOCEN);
-                MOE = 0;
-                SetBit(ADC_MASK, CH1EN | CH0EN);
-                mcCurOffset.OffsetCount = 0;
-                mcCurOffset.OffsetFlag = 0;
-            }
-            
-            if (mcCurOffset.OffsetFlag && isCtrlPowOn)
-            {
-                mcState = mcInit;
-                ClrBit(DRV_CR, DRVEN);
-                _nop_(); _nop_(); _nop_(); _nop_();
-                SetBit(DRV_CR, DRVEN);
+                // 初始化状态
+                case CALIB_INIT:
+                {
+                    if (powerControl.PowerSate == POWER_RUN)
+                    {
+                        ClrBit(DRV_CR, FOCEN);
+                        MOE = 0;
+                        SetBit(ADC_MASK, CH1EN | CH0EN);
+                        currOffset.OffsetCount = 0;
+                        currOffset.OffsetCalib = GET_OFFSET;
+                    }
+                    
+                    break;
+                }
+                
+                // 检查状态
+                case GET_OFFSET:
+                {
+                    SetBit(ADC_CR, ADCBSY);
+                    
+                    while (ReadBit(ADC_CR, ADCBSY));
+                    
+                    currOffset.IuOffsetSum += ((ADC0_DR & 0x7ff8));
+                    currOffset.IuOffset = currOffset.IuOffsetSum >> 4;
+                    currOffset.IuOffsetSum -= currOffset.IuOffset;
+                    currOffset.IvOffsetSum += ((ADC1_DR & 0x7ff8));
+                    currOffset.IvOffset = currOffset.IvOffsetSum >> 4;
+                    currOffset.IvOffsetSum -= currOffset.IvOffset;
+                    currOffset.IwBusOffset = currOffset.IvOffset;
+                    
+                    if (++currOffset.OffsetCount > 1000)
+                    {
+                        //进入偏置电压错误保护
+                        if (((currOffset.IuOffset > 19959) || (currOffset.IuOffset < 10107)) ||
+                            ((currOffset.IvOffset > 19959) || (currOffset.IvOffset < 10107)))
+                        {
+                            currOffset.OffsetCalib = CALIB_INIT;
+                            mcFaultSource = FaultIbusOffset;
+                            FaultProcess();
+                        }
+                        else
+                        { currOffset.OffsetCalib = OFFSET_READY; }
+                    }
+                    
+                    break;
+                }
+                
+                // 启动状态
+                case OFFSET_READY:
+                {
+                    if (isCtrlPowOn)
+                    {
+                        mcState = mcInit;
+                        // 关闭软件电流采样的ADC
+                        ClrBit(ADC_MASK, CH1EN | CH0EN);
+                        currOffset.OffsetCalib = CALIB_INIT;
+                        ClrBit(DRV_CR, DRVEN);
+                        _nop_(); _nop_(); _nop_(); _nop_();
+                        SetBit(DRV_CR, DRVEN);
+                    }
+                    
+                    break;
+                }
             }
             
             break;
@@ -53,7 +102,6 @@ void Motor_Control_State(void)
             //if ((mcFocCtrl.mcDcbusFlt > _Q15(Under_Protect_Voltage / HW_BOARD_VOLT_MAX)))
             {
                 // 关闭软件电流采样的ADC
-                ClrBit(ADC_MASK, CH1EN | CH0EN);
                 mcFaultSource = 0;
                 memset(&mcFaultDect, 0, sizeof(FaultVarible));
                 memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
@@ -140,14 +188,9 @@ void Motor_Control_State(void)
             break;
         }
         
-        case mcAlign:  // 预定位时间结束后,直接启动; AlignTestMode=1用于初始位置检测调试用
+        case mcAlign:
         {
             Motor_Align();
-            #if (AlignTestMode)
-            {
-                while (1);
-            }
-            #endif
             break;
         }
         

+ 9 - 49
User/Function/FocControlFunction.c

@@ -1,6 +1,5 @@
 #include <Myproject.h>
 
-CurrentOffset xdata mcCurOffset;
 
 void FOC_Init(void)
 {
@@ -80,7 +79,7 @@ void FOC_Init(void)
         FOC_TSMIN  = PWM_TS_LOAD;                           // 最小采样窗口
         FOC_TRGDLY = 0x3B;                                  // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;3B
         SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
-        FOC_CSO = mcCurOffset.Iw_busOffset;
+        FOC_CSO = currOffset.IwBusOffset;
     }
     // 双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia,配置81
     #elif (Shunt_Resistor_Mode == Double_Resistor)
@@ -91,9 +90,9 @@ void FOC_Init(void)
         // 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
         FOC_TBLO = PWM_DLOWL_TIME;                 //下桥臂最小脉冲,保证采样
         SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
-        FOC_CSO  = mcCurOffset.IuOffset;
+        FOC_CSO  = currOffset.IuOffset;
         SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
-        FOC_CSO  = mcCurOffset.IvOffset;
+        FOC_CSO  = currOffset.IvOffset;
         // 采样配置
         #if (DouRes_Sample_Mode == DouRes_1_Cycle)
         ClrBit(FOC_CR2, DSS);
@@ -116,11 +115,11 @@ void FOC_Init(void)
         SetBit(FOC_CR2, DSS);
         #endif
         SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
-        FOC_CSO = mcCurOffset.IuOffset;
+        FOC_CSO = currOffset.IuOffset;
         SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
-        FOC_CSO = mcCurOffset.IvOffset;
+        FOC_CSO = currOffset.IvOffset;
         SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
-        FOC_CSO = mcCurOffset.Iw_busOffset;
+        FOC_CSO = currOffset.IwBusOffset;
     }
     #endif
     // SVPWM 配置
@@ -228,7 +227,7 @@ void Motor_Open(void)
             ClrBit(FOC_CR1, ANGM);                      // 禁止估算器输出
         }
         #endif
-		// 切入启动
+        // 切入启动
         mcFocCtrl.State_Count = 1200;
         mcState = mcRun;
     }
@@ -239,7 +238,7 @@ void Motor_Open(void)
         FOC_RTHECNT = MOTOR_OPEN_ACC_CNT;
         SetReg(FOC_CR1, EFAE | RFAE | ANGM, RFAE);
     
-		// 切入启动
+        // 切入启动
         if (OpenRampCycles < (MOTOR_OPEN_ACC_CYCLE - 1))
         {
             if (!ReadBit(FOC_CR1, RFAE))
@@ -266,7 +265,7 @@ void Motor_Open(void)
         FOC_EFREQMIN  = MOTOR_OMEGA_ACC_MIN;
         FOC_EFREQHOLD = MOTOR_OMEGA_ACC_END;
         SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
-		// 切入启动
+        // 切入启动
         mcFocCtrl.State_Count = 2600;
         mcState = mcRun;
     }
@@ -277,42 +276,3 @@ void Motor_Open(void)
 
 
 
-
-
-/**
-    @function     Get_Current_Offset
-    @brief        采集电流偏置
-    @date         2025-11-03
-*/
-void Get_Current_Offset(void)
-{
-    if (!mcCurOffset.OffsetFlag)
-    {
-        SetBit(ADC_CR, ADCBSY);             // 使能ADC
-        
-        while (ReadBit(ADC_CR, ADCBSY));
-        
-        mcCurOffset.IuOffsetSum     += ((ADC0_DR & 0x7ff8));
-        mcCurOffset.IuOffset         = mcCurOffset.IuOffsetSum >> 4;
-        mcCurOffset.IuOffsetSum     -= mcCurOffset.IuOffset;
-        mcCurOffset.IvOffsetSum     += ((ADC1_DR & 0x7ff8));
-        mcCurOffset.IvOffset         = mcCurOffset.IvOffsetSum >> 4;
-        mcCurOffset.IvOffsetSum     -= mcCurOffset.IvOffset;
-        mcCurOffset.Iw_busOffset = mcCurOffset.IvOffset;
-        mcCurOffset.OffsetCount++;
-        
-        if (mcCurOffset.OffsetCount > 1000)
-        {
-            if (((mcCurOffset.IuOffset > 19959) || (mcCurOffset.IuOffset < 10107)) ||
-                ((mcCurOffset.IvOffset > 19959) || (mcCurOffset.IvOffset < 10107)))
-            {
-                mcFaultSource = FaultIbusOffset;//进入偏置电压错误保护
-                FaultProcess();
-            }
-            else
-            {
-                mcCurOffset.OffsetFlag = 1;
-            }
-        }
-    }
-}

+ 0 - 1
User/Function/Protect.c

@@ -485,7 +485,6 @@ void IOffsetRecoverEnable()
         
         if ((mcFaultDect.IbusOffsetRecoverCnt) >= IbusOffsetRecoverTime)//IbusOffsetRecoverTime*1ms
         {
-            mcCurOffset.CalibFlag = 0;
             mcFaultDect.IbusOffsetRecoverCnt = 0;
             mcProtectTime.IbusOffsetProtectTimes++;
             mcFaultSource = FaultNoSource;

+ 0 - 8
User/Hardware/ADC.c

@@ -77,7 +77,6 @@ void AMP_Init(void)
     ClrBit(AMP_CR1, AMP0_GAIN2 | AMP0_GAIN1 | AMP0_GAIN0 | AMP_PH_GAIN2 | AMP_PH_GAIN1 | AMP_PH_GAIN0);
 }
 
-int16_t uCurr, vCurr;
 /**
     @function     Get_ADC_Value
     @brief        读取ADC转换值
@@ -96,11 +95,4 @@ void Get_ADC_Value(void)
     motorControl.ACBus    = LPF_Zero_Update(VACBUS_ADC, motorControl.ACBus, LPF_K(1.0));
     motorControl.IGBTTemp = LPF_Zero_Update(IGBT_NTC_ADC, motorControl.IGBTTemp, LPF_K(20.0));
     // 数据处理
-    #if 0
-    // 测试
-    uCurr = ADC0_DR;
-    vCurr = ADC1_DR;
-    motorControl.uPhaseCurr = uCurr - mcCurOffset.IuOffset;
-    motorControl.vPhaseCurr = vCurr - mcCurOffset.IvOffset;
-    #endif
 }

+ 0 - 35
User/Hardware/DMA.c

@@ -132,41 +132,6 @@ void Set_IRQ_DMA(uint8_t DMA_IRQ_Priority)
     SetReg(IP1, PDMA1 | PDMA0, DMA_IRQ_Priority);
 }
 
-void SetEndian_DMA(eType_DMA_Endian eEndian)
-{
-    bool bTmp = false, bTmp1;
-    
-    if (ReadBit(DMA0_CR0, DMAEN))
-    {
-        bTmp = true;
-        
-        while (ReadBit(DMA0_CR0, DMABSY));
-        
-        ClrBit(DMA0_CR0, DMAEN);
-    }
-    
-    if (ReadBit(DMA1_CR0, DMAEN))
-    {
-        bTmp1 = true;
-        
-        while (ReadBit(DMA1_CR0, DMABSY));
-        
-        ClrBit(DMA1_CR0, DMAEN);
-    }
-    
-    SetReg(DMA0_CR0, ENDIAN, eEndian);
-    
-    if (bTmp)
-    {
-        SetBit(DMA0_CR0, DMAEN);
-    }
-    
-    if (bTmp1)
-    {
-        SetBit(DMA1_CR0, DMAEN);
-    }
-}
-
 
 
 

+ 0 - 2
User/Hardware/GPIO.c

@@ -182,10 +182,8 @@ void Power_In_Control(void)
         
         case POWER_RUN:
         {
-			#if 1
             if (mcFaultSource == FaultNoSource)
             { PRE_DRIVER_RST = 1;  }
-			#endif
         }
     }
 }

+ 22 - 21
User/Hardware/UART.c

@@ -76,7 +76,7 @@ void Dabug_Data_Update(void)
 {
     static uint8_t update_delay_cnt = 0;
     uint8_t sumcheck = 0, addcheck = 0;
-    uint16_t i = 0, flen = 0, switch_temp = 0;
+    uint16_t i = 0, switchTemp = 0;
     
     if (++ update_delay_cnt > 9)
     {
@@ -84,35 +84,36 @@ void Dabug_Data_Update(void)
         *(_IO uint16_t xdata *)(&DebugDat +  0) = 0xABFF;
         *(_IO uint16_t xdata *)(&DebugDat +  2) = 0xFFF1;
         *(_IO uint16_t xdata *)(&DebugDat +  4) = 0x3800;
-        *(_IO uint16_t xdata *)(&DebugDat +  6) = (mcCurOffset.IuOffset >> 8) | (mcCurOffset.IuOffset << 8);
-        *(_IO uint16_t xdata *)(&DebugDat +  8) = (mcCurOffset.IvOffset >> 8) | (mcCurOffset.IvOffset << 8);
+        *(_IO uint16_t xdata *)(&DebugDat +  6) = (currOffset.IuOffset >> 8) | (currOffset.IuOffset << 8);
+        *(_IO uint16_t xdata *)(&DebugDat +  8) = (currOffset.IvOffset >> 8) | (currOffset.IvOffset << 8);
         *(_IO uint16_t xdata *)(&DebugDat + 10) = (motorControl.DCBus >> 8) | (motorControl.DCBus << 8);
-        switch_temp = (uint16_t)FOC__ID;
-        *(_IO uint16_t xdata *)(&DebugDat + 12) = (switch_temp >> 8) | (switch_temp << 8);
-        switch_temp = (uint16_t)FOC__IQ;
-        *(_IO uint16_t xdata *)(&DebugDat + 14) = (switch_temp >> 8) | (switch_temp << 8);
-        switch_temp = (uint16_t)FOC__IA;
-        *(_IO uint16_t xdata *)(&DebugDat + 16) = (switch_temp >> 8) | (switch_temp << 8);
-        switch_temp = (uint16_t)FOC__IB;
-        *(_IO uint16_t xdata *)(&DebugDat + 18) = (switch_temp >> 8) | (switch_temp << 8);
-        switch_temp = (uint16_t)FOC__IC;
-        *(_IO uint16_t xdata *)(&DebugDat + 20) = (switch_temp >> 8) | (switch_temp << 8);
-        switch_temp = (uint16_t)FOC_IDREF;
-        *(_IO uint16_t xdata *)(&DebugDat + 22) = (switch_temp >> 8) | (switch_temp << 8);
-        switch_temp = (uint16_t)FOC_IQREF;
-        *(_IO uint16_t xdata *)(&DebugDat + 24) = (switch_temp >> 8) | (switch_temp << 8);
-        flen = DebugDat[4] + DebugDat[5] * 256;
+        switchTemp = (uint16_t)FOC__ID;
+        *(_IO uint16_t xdata *)(&DebugDat + 12) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)FOC__IQ;
+        *(_IO uint16_t xdata *)(&DebugDat + 14) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)FOC__IA;
+        *(_IO uint16_t xdata *)(&DebugDat + 16) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)FOC__IB;
+        *(_IO uint16_t xdata *)(&DebugDat + 18) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)FOC__IC;
+        *(_IO uint16_t xdata *)(&DebugDat + 20) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)FOC_IDREF;
+        *(_IO uint16_t xdata *)(&DebugDat + 22) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)FOC_IQREF;
+        *(_IO uint16_t xdata *)(&DebugDat + 24) = (switchTemp >> 8) | (switchTemp << 8);
+        switchTemp = (uint16_t)motorControl.ActualSpeed;
+        *(_IO uint16_t xdata *)(&DebugDat + 26) = (switchTemp >> 8) | (switchTemp << 8);
         
         // 计算校验
-        for (i = 0; i < (flen + 6); i++)
+        for (i = 0; i < 62; i++)
         {
             sumcheck += DebugDat[i];
             addcheck += sumcheck;
         }
         
         //将计算出来的校验数据写入数据帧
-        DebugDat[flen + 6] = sumcheck;
-        DebugDat[flen + 7] = addcheck;
+        DebugDat[62] = sumcheck;
+        DebugDat[63] = addcheck;
         Set_DMA_Data_Package(0, DebugDat, 0x40);
         Switch_DMA(0);
     }

+ 4 - 7
User/include/Customer.h

@@ -60,9 +60,6 @@
 #define E_BW4                          (80.0)                                 // PLL算法里的反电动势滤波值
 #define E_BW5                          (80.0)                                 // PLL算法里的反电动势滤波值
 
-#define AlignTestMode                  (0)                                     // 预定位测试模式
-
-
 #define DQKP_Alignment                  _Q12(2.0)
 #define DQKI_Alignment                  _Q15(0.05)
 
@@ -173,10 +170,10 @@
 #define SPEED_INC                      (200.0) //150                                // 速度环增量
 #define SPEED_DEC                      (200.0) //150                                // 速度环减量
 #define SPEED_DEC1                     (800.0) //150                              // 速度环减量  停机时使用
-#define SpeedRampStartInc              (S_Value(SPEED_INC_Start))/(1000/SPEED_INC_DEC_TIME)
-#define Motor_Speed_Inc                (S_Value(SPEED_INC))      /(1000/(SPEED_LOOP_TIME*20.0))
-#define Motor_Speed_Dec                (S_Value(SPEED_DEC))      /(1000/(SPEED_LOOP_TIME*20.0))
-#define Motor_Speed_Dec1               (S_Value(SPEED_DEC1))     /(1000/SPEED_INC_DEC_TIME)
+#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 MotorStartHoldTime              (15000)                                 //上油时间  15000

+ 75 - 16
User/include/Definition.h

@@ -91,22 +91,6 @@
 #define DT_TIME                         (1.0)            // 死区补偿时间(us)适用于双电阻和三电阻,建议值是1/2死区时间
 #define GLI_TIME                        (0.5)            // 桥臂窄脉宽消除(us),建议值0.5
 
-#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_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 PWM_LEVEL_MODE                  (HIGH_LEVEL)
 
 // DQ轴最大限幅值
@@ -140,6 +124,30 @@
 #define SPD_BW                          (25.0)
 #define ATT_COEF                        (0.95)
 
+#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_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 MAX_BEMF_VOLTAGE                ((MOTOR_SPEED_BASE*Ke)/(1000.0))
+#define MAX_OMEG_RAD_SEC                ((float)(_2PI*BASE_FREQ))
+
+#define OBS_FBASE                       _Q15(BASE_FREQ*TPWM_VALUE)
+#define OBS_KLPF                        _Q15(_2PI*BASE_FREQ*TPWM_VALUE)
+#define SPEED_KLPF                      _Q15(_2PI*SPD_BW*TPWM_VALUE)
+#define OBS_EA_KS                       _Q15((2*MOTOR_SPEED_SMOMIN_RPM*_2PI*BASE_FREQ*TPWM_VALUE)/MOTOR_SPEED_BASE)
+
 
 // 过调制
 #define OverModulation                  (0)
@@ -152,6 +160,57 @@
 #define SVPMW_Mode                      (SVPWM_7_Segment)
 #define DouRes_Sample_Mode              (DouRes_1_Cycle)
 
+
+#if (EstimateAlgorithm==AO)
+    #define OBS_K1T                         _Q11((3.0/(125.0*1.0))*(LQ/TPWM_VALUE)*(HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE))
+    #define OBS_K2T                         _Q11(RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE)
+    #define OBS_K2T_Actual                  _Q11(RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE)
+    #define OBS_K3T                         _Q8(2.5)
+    #define OBS_K4T                         _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE))
+#else
+    #define OBS_K1T                         _Q15(LD/(LD+RS*TPWM_VALUE))
+    #define OBS_K2T                         _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE_Start/HW_BOARD_CURR_BASE))
+    #define OBS_K2T_Actual                  _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE/HW_BOARD_CURR_BASE))
+    #define OBS_K3T                         _Q15((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(MAX_BEMF_VOLTAGE/HW_BOARD_CURR_BASE))
+    #define OBS_K4T                         _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE))
+#endif
+
+// AO SMO 估算器增益
+#define OBSW_KP_GAIN                    _Q12(2*_2PI*ATT_COEF*ATO_BW/BASE_FREQ)
+#define OBSW_KI_GAIN                    _Q15(_2PI*ATO_BW*ATO_BW*TPWM_VALUE/BASE_FREQ)
+
+#define OBSW_KP_GAIN_RUN                _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN/BASE_FREQ)
+#define OBSW_KI_GAIN_RUN                _Q15(_2PI*ATO_BW_RUN*ATO_BW_RUN*TPWM_VALUE/BASE_FREQ)
+
+#define OBSW_KP_GAIN_RUN1               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN1/BASE_FREQ)
+#define OBSW_KI_GAIN_RUN1               _Q15(_2PI*ATO_BW_RUN1*ATO_BW_RUN1*TPWM_VALUE/BASE_FREQ)
+
+#define OBSW_KP_GAIN_RUN2               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN2/BASE_FREQ)
+#define OBSW_KI_GAIN_RUN2               _Q15(_2PI*ATO_BW_RUN2*ATO_BW_RUN2*TPWM_VALUE/BASE_FREQ)
+
+#define OBSW_KP_GAIN_RUN3               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN3/BASE_FREQ)
+#define OBSW_KI_GAIN_RUN3               _Q15(_2PI*ATO_BW_RUN3*ATO_BW_RUN3*TPWM_VALUE/BASE_FREQ)
+
+#define OBSW_KP_GAIN_RUN4               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN4/BASE_FREQ)
+#define OBSW_KI_GAIN_RUN4               _Q15(_2PI*ATO_BW_RUN4*ATO_BW_RUN4*TPWM_VALUE/BASE_FREQ)
+
+// PLL估算器增益
+#define OBSE_PLLKP_GAIN1                _Q11(((2*ATT_COEF*_2PI*E_BW1*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+#define OBSE_PLLKI_GAIN1                _Q11((_2PI*E_BW1*_2PI*E_BW1*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+
+#define OBSE_PLLKP_GAIN2                _Q11(((2*ATT_COEF*_2PI*E_BW2*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+#define OBSE_PLLKI_GAIN2                _Q11((_2PI*E_BW2*_2PI*E_BW2*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+
+#define OBSE_PLLKP_GAIN3                _Q11(((2*ATT_COEF*_2PI*E_BW3*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+#define OBSE_PLLKI_GAIN3                _Q11((_2PI*E_BW3*_2PI*E_BW3*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+
+#define OBSE_PLLKP_GAIN4                _Q11(((2*ATT_COEF*_2PI*E_BW4*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+#define OBSE_PLLKI_GAIN4                _Q11((_2PI*E_BW4*_2PI*E_BW4*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+
+#define OBSE_PLLKP_GAIN5                _Q11(((2*ATT_COEF*_2PI*E_BW5*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+#define OBSE_PLLKI_GAIN5                _Q11((_2PI*E_BW5*_2PI*E_BW5*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
+
+
 // ------------------------------------------------------------------------------------------------------------------
 // 3.其他宏定义
 

+ 11 - 34
User/include/Myproject.h

@@ -15,7 +15,6 @@
 // math.h包含算术运算的数学函数
 #include <math.h>                       
 #include <Definition.h>
-#include <Parameter.h>
 
 typedef enum
 {
@@ -63,55 +62,33 @@ void WatchDogConfig(uint32 value, uint8 Status);
 unsigned short CRC_Check(unsigned char start_sector , unsigned char offset_sector);
 
 
-
-typedef struct
-{
-  int16   IuOffset;       //Iu的偏置电压
-  int32   IuOffsetSum;    //Iu的偏置电压总和
-  int16   IvOffset;       //Iv的偏置电压
-  int32   IvOffsetSum;    //Iv的偏置电压总和
-  int16   Iw_busOffset;   //Iw或Ibus的偏置电压
-  int32   Iw_busOffsetSum;//Iw或Ibus的偏置电压总和
-  int16   OffsetCount;    //偏置电压采集计数
-  int8    OffsetFlag;     //偏置电压结束标志位
-	uint8_t CalibFlag; // 偏置电压配置标志位
-}CurrentOffset;
-
-extern CurrentOffset xdata mcCurOffset;
-extern void Get_Current_Offset(void);
-
 extern void FOC_Init(void);
-extern void Motor_Charge(void);
 extern void Motor_Open(void);
 extern void Motor_Align(void);
 
 
 
-#if (FiledWeakenCompEnable==1)
+#if (FiledWeakenCompEnable)
 typedef struct
 {
     uint16    FieldWeakenActualUS_Q15;    
     uint16    FieldWeakenActualDcbus_Q15;
     int16     FieldWeakenIsTheta;
 	  int16     mcIqref;                       
-    int16     mcIdref;                        
-		   
+    int16     mcIdref;
 }FieldWeakeningTypeDef;
 
-extern FieldWeakeningTypeDef xdata mcFieldWeaken;	
-extern void GetFieldWeakenUsAndUdc_Q15(int16 Ud, int16 Uq , uint16 Dcbus);
-extern void GetFieldWeakenIdRefAndIqRef_Q15(int16 Is);
-extern void GetFieldWeakenIsTheta_Q15(void);
-extern int16 mcFieldWeakenPI(int16 feedbackvalue, int16 referencevalue);
-extern void  FiledWeakenControl(int16 Ud, int16 Uq , uint16 Dcbusk,int16 Is);
+FieldWeakeningTypeDef xdata mcFieldWeaken;	
+void GetFieldWeakenUsAndUdc_Q15(int16 Ud, int16 Uq , uint16 Dcbus);
+void GetFieldWeakenIdRefAndIqRef_Q15(int16 Is);
+void GetFieldWeakenIsTheta_Q15(void);
+int16 mcFieldWeakenPI(int16 feedbackvalue, int16 referencevalue);
+void  FiledWeakenControl(int16 Ud, int16 Uq , uint16 Dcbusk,int16 Is);
 #endif
 
-typedef enum
-{
-    BIG_ENDIAN    = 0,
-    LITTLE_ENDIAN = ENDIAN
-}eType_DMA_Endian;
+#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)
+
 
-extern void SetEndian_DMA(eType_DMA_Endian eEndian);
 
 #endif

+ 0 - 74
User/include/Parameter.h

@@ -1,74 +0,0 @@
-#ifndef __Parameter_H_
-#define __Parameter_H_
-#include <Myproject.h>
-
-
-#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)
-
-
-
-
-#define S_Value(SpeedValue)          	_Q15(SpeedValue/MOTOR_SPEED_BASE)
-
-#define MAX_BEMF_VOLTAGE                ((MOTOR_SPEED_BASE*Ke)/(1000.0))
-#define MAX_OMEG_RAD_SEC                ((float)(_2PI*BASE_FREQ))
-
-
-
-#if (EstimateAlgorithm==AO)
-    #define OBS_K1T                         _Q11((3.0/(125.0*1.0))*(LQ/TPWM_VALUE)*(HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE))
-    #define OBS_K2T                         _Q11(RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE)
-    #define OBS_K2T_Actual                  _Q11(RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE)
-    #define OBS_K3T                         _Q8(2.5)
-    #define OBS_K4T                         _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE))	
-#else
-    #define OBS_K1T                         _Q15(LD/(LD+RS*TPWM_VALUE))
-    #define OBS_K2T                         _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE_Start/HW_BOARD_CURR_BASE))
-    #define OBS_K2T_Actual                  _Q13((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(HW_BOARD_VOLTAGE_BASE/HW_BOARD_CURR_BASE))
-    #define OBS_K3T                         _Q15((TPWM_VALUE/(LD+RS*TPWM_VALUE))*(MAX_BEMF_VOLTAGE/HW_BOARD_CURR_BASE))
-    #define OBS_K4T                         _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE))
-#endif
-
-
-#define OBSW_KP_GAIN                    _Q12(2*_2PI*ATT_COEF*ATO_BW/BASE_FREQ)
-#define OBSW_KI_GAIN                    _Q15(_2PI*ATO_BW*ATO_BW*TPWM_VALUE/BASE_FREQ)
-
-#define OBSW_KP_GAIN_RUN                _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN/BASE_FREQ)
-#define OBSW_KI_GAIN_RUN                _Q15(_2PI*ATO_BW_RUN*ATO_BW_RUN*TPWM_VALUE/BASE_FREQ)
-
-#define OBSW_KP_GAIN_RUN1               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN1/BASE_FREQ)
-#define OBSW_KI_GAIN_RUN1               _Q15(_2PI*ATO_BW_RUN1*ATO_BW_RUN1*TPWM_VALUE/BASE_FREQ)
-
-#define OBSW_KP_GAIN_RUN2               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN2/BASE_FREQ)
-#define OBSW_KI_GAIN_RUN2               _Q15(_2PI*ATO_BW_RUN2*ATO_BW_RUN2*TPWM_VALUE/BASE_FREQ)
-
-#define OBSW_KP_GAIN_RUN3               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN3/BASE_FREQ)
-#define OBSW_KI_GAIN_RUN3               _Q15(_2PI*ATO_BW_RUN3*ATO_BW_RUN3*TPWM_VALUE/BASE_FREQ)
-
-#define OBSW_KP_GAIN_RUN4               _Q12(2*_2PI*ATT_COEF*ATO_BW_RUN4/BASE_FREQ)
-#define OBSW_KI_GAIN_RUN4               _Q15(_2PI*ATO_BW_RUN4*ATO_BW_RUN4*TPWM_VALUE/BASE_FREQ)
-
-#define OBS_FBASE                       _Q15(BASE_FREQ*TPWM_VALUE)
-#define OBS_KLPF                        _Q15(_2PI*BASE_FREQ*TPWM_VALUE)
-#define SPEED_KLPF                      _Q15(_2PI*SPD_BW*TPWM_VALUE)
-#define OBS_EA_KS                       _Q15((2*MOTOR_SPEED_SMOMIN_RPM*_2PI*BASE_FREQ*TPWM_VALUE)/MOTOR_SPEED_BASE)
-
-#define OBSE_PLLKP_GAIN1                _Q11(((2*ATT_COEF*_2PI*E_BW1*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-#define OBSE_PLLKI_GAIN1                _Q11((_2PI*E_BW1*_2PI*E_BW1*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-
-#define OBSE_PLLKP_GAIN2                _Q11(((2*ATT_COEF*_2PI*E_BW2*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-#define OBSE_PLLKI_GAIN2                _Q11((_2PI*E_BW2*_2PI*E_BW2*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-
-#define OBSE_PLLKP_GAIN3                _Q11(((2*ATT_COEF*_2PI*E_BW3*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-#define OBSE_PLLKI_GAIN3                _Q11((_2PI*E_BW3*_2PI*E_BW3*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-
-#define OBSE_PLLKP_GAIN4                _Q11(((2*ATT_COEF*_2PI*E_BW4*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-#define OBSE_PLLKI_GAIN4                _Q11((_2PI*E_BW4*_2PI*E_BW4*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-
-#define OBSE_PLLKP_GAIN5                _Q11(((2*ATT_COEF*_2PI*E_BW5*LD - RS)*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-#define OBSE_PLLKI_GAIN5                _Q11((_2PI*E_BW5*_2PI*E_BW5*LD*TPWM_VALUE*HW_BOARD_CURR_BASE)/HW_BOARD_VOLTAGE_BASE)
-
-
-#endif

+ 3 - 3
User/include/ProtectSet.h

@@ -26,11 +26,11 @@
 #define Compare_Mode                   (Compare_DAC)                              // 硬件过流值的来源
 
 /*硬件过流保护值设置*/
-#define OverHardcurrentValue            (90.0)                    // (A) 正常运行时DAC模式下的硬件过流值   22  13
-#define TorOverHardcurrentValue         (90.0)                    // (A) 转矩补偿时DAC模式下的硬件过流值   22  13
+#define OverHardcurrentValue            (5.0)                    // (A) 正常运行时DAC模式下的硬件过流值   22  13
+#define TorOverHardcurrentValue         (5.0)                    // (A) 转矩补偿时DAC模式下的硬件过流值   22  13
 
 /* 软件过流保护参数设置 */
-#define SW_OC_CurrentVal               I_Value(90.0)              ///< (A)软件过流值
+#define SW_OC_CurrentVal               I_Value(20.0)              ///< (A)软件过流值
 #define SW_OC_DectTime                 (50)                       ///< (ms)软件过流检测时间