| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- #include <Myproject.h>
- extern uint16 SKI1, SKP1;
- /* Private variables ---------------------------------------------------------*/
- PWMINPUTCAL xdata mcPwmInput;
- CurrentVarible xdata mcCurVarible;
- FOCCTRL xdata mcFocCtrl;
- ILIMIT xdata mcIimit;
- MCRAMP xdata mcSpeedRamp;
- CONTROLCMDD xdata ConTrolCmd;
- int16 Huan_temp = 0, Guan_temp = 0, Paiqi_temp = 0;
- int16 qiangtujiaodu = 0;
- #if (Debugg==1)
- extern int16 xdata GPFCON1, GPFCON2, GPFCON3, GPFCON4, GPFCON5, GPFCON6, GPFCON7, GPFCON8, GPFCON9, GPFCON10;
- #endif
- 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);
- }
- }
- /*****转矩补偿和无转矩补偿时过流值设置*****/
- void DCOvercurrentValue(void)
- {
- static uint8 DAC_Value, DAC_Value2;
- DAC_Value = DAC_OvercurrentValue;
- DAC_Value2 = DAC0_DR;
-
- if (DAC_Value < DAC_Value2)
- {
- DAC_Value2 -= 1;
- }
- else if (DAC_Value > DAC_Value2)
- {
- DAC_Value2 += 1;
- }
-
- if (DAC_Value2 < 255)
- {
- DAC0_DR = (uint8)DAC_Value2;
- }
- else
- {
- DAC0_DR = 255;
- }
- }
- /*---------------------------------------------------------------------------*/
- /* Name : void Speed_response(void)
- /* Input : NO
- /* Output : NO
- /* Description: 速度响应函数,可根据需求加入控制环,如恒转矩控制、恒转速控制、恒功率控制
- /*---------------------------------------------------------------------------*/
- void Speed_response(void)
- {
- static uint8 Start_CNT = 0;
-
- if ((mcState == mcRun) || (mcState == mcStop))
- {
- if (mcFocCtrl.RunStateCnt < MotorStartHoldTime) // MotorStartHoldTime目标转速为启动转速
- {
- mcSpeedRamp.IncValue = SpeedRampStartInc;
- mcFocCtrl.RunStateCnt++;
-
- if (isCtrlPowOn)
- {
- motorControl.TargetRef = Motor_Start_Hold_Speed; //上油时间内维持上油转速
- }
- else
- {
- motorControl.TargetRef = 0;
- mcSpeedRamp.DecValue = Motor_Speed_Dec1;
- }
- }
- else //如果达到上油转速后,将起动速度环增量变为运行速度环增量
- {
- Current_Speed_PI();
- DCOvercurrentValue();
- mcSpeedRamp.IncValue = Motor_Speed_Inc;
-
- if ((!isCtrlPowOn) || (motorControl.TargetRef == 0))
- {
- mcSpeedRamp.DecValue = Motor_Speed_Dec1;
- }
- else
- {
- mcSpeedRamp.DecValue = Motor_Speed_Dec;
- }
- }
-
- switch (mcFocCtrl.CtrlMode)
- {
- case 0:
- {
- if (mcFocCtrl.SpeedFlt > MOTOR_LOOP_RPM)
- {
- if (Start_CNT < 15)
- {
- Start_CNT ++;
- }
- else
- {
- mcFocCtrl.CtrlMode = 1;
- Start_CNT = 0;
- #if (LOOP_MODE == SPEED_CONTROL_MODE)
- mcSpeedRamp.ActualValue = mcFocCtrl.SpeedFlt + _Q15(150 / MOTOR_SPEED_BASE);
- #endif
- mcFocCtrl.LoopTime = SPEED_LOOP_TIME;
- mcFocCtrl.IND_DEC_LoopTime = SPEED_INC_DEC_TIME;
- PI0_UKH = mcFocCtrl.mcIqref;
- mcFocCtrl.IsRef = mcFocCtrl.mcIqref;
- }
- }
- }
- break;
-
- case 1:
- {
- // IsLimit_Over_deal();
- mcFocCtrl.LoopTime++;
- mcFocCtrl.IND_DEC_LoopTime++;
-
- if (mcFocCtrl.IND_DEC_LoopTime > SPEED_INC_DEC_TIME)
- {
- mc_ramp(&mcSpeedRamp);
- mcFocCtrl.IND_DEC_LoopTime = 0;
- }
-
- if (mcFocCtrl.LoopTime > SPEED_LOOP_TIME)
- {
- #if (OUT_LOOP_CONTROL)
- {
- #if (LOOP_MODE == SPEED_CONTROL_MODE)
- mcFocCtrl.IsRef = HW_Zero_Calc(mcSpeedRamp.ActualValue - mcFocCtrl.SpeedFlt);
- #endif
-
- STT_FOC_THECOMP_CLEAR();
- }
- #else
- {
- mcFocCtrl.mcIqref = FOC_IQREF;
-
- if (FOC_IQREF < mcFocCtrl.QoutValue)
- {
- mcFocCtrl.mcIqref += QOUTINC;
-
- if (mcFocCtrl.mcIqref > mcFocCtrl.QoutValue)
- { mcFocCtrl.mcIqref = mcFocCtrl.QoutValue; }
-
- FOC_IQREF = mcFocCtrl.mcIqref;
- }
- else if (FOC_IQREF > mcFocCtrl.QoutValue)
- {
- mcFocCtrl.mcIqref -= QOUTINC;
-
- if (mcFocCtrl.mcIqref < mcFocCtrl.QoutValue)
- { mcFocCtrl.mcIqref = mcFocCtrl.QoutValue; }
-
- FOC_IQREF = mcFocCtrl.mcIqref;
- }
- }
- #endif
- mcFocCtrl.LoopTime = 0;
- }
- }
- break;
- }
- }
- }
- /*角度补偿清零*/
- void STT_FOC_THECOMP_CLEAR(void)
- {
- mcFocCtrl.foc_comp_temp = mcFocCtrl.STT_FOC_THECOMP;
-
- if (mcFocCtrl.foc_comp_temp < 0)
- {
- mcFocCtrl.foc_comp_temp++;
- mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
- }
- else if (mcFocCtrl.foc_comp_temp > 0)
- {
- mcFocCtrl.foc_comp_temp--;
- mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
- }
- else
- {
- mcFocCtrl.foc_comp_temp = 0;
- mcFocCtrl.STT_FOC_THECOMP = 0;
- }
-
- FOC_THECOMP = mcFocCtrl.STT_FOC_THECOMP;
- }
- /*---------------------------------------------------------------------------*/
- /* 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.CtrlMode == 0) || (mcFocCtrl.State_Count > 10))
- {
- if (mcFocCtrl.iiqq <= IQ_Start_CURRENT2)
- {mcFocCtrl.iiqq = mcFocCtrl.iiqq + 2;}
-
- FOC_IQREF = mcFocCtrl.iiqq;
- }
-
- 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 (mcFocCtrl.SpeedFlt < _Q15(2000 / MOTOR_SPEED_BASE))
- {
- Skp = SKPRun;
- Ski = SKIRun;
- DQkp = DQKP;
- DQki = DQKI;
- }
- else if (mcFocCtrl.SpeedFlt < _Q15(4200 / MOTOR_SPEED_BASE))
- {
- Skp = SKPRun1;
- Ski = SKIRun1;
- DQkp = DQKP_zhong;
- DQki = DQKI_zhong;
- }
- else if (mcFocCtrl.SpeedFlt > _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;
- void IsLimit_Over_tect(void)
- {
- if (mcIimit.flag == 0 || mcIimit.flag == 3)
- {
- if ((mcFocCtrl.IDQFlt > I_OVER))
- {
- mcIimit.mcIDQtime3 = 0;
-
- if (mcIimit.mcIDQtime1 < 50)
- {
- mcIimit.mcIDQtime1++;
- }
- else
- {
- mcIimit.flag = 1;
- }
- }
- }
-
- if (mcIimit.flag == 1)
- {
- if ((mcFocCtrl.IDQFlt < I_LIMIT))
- {
- mcIimit.mcIDQtime1 = 0;
-
- if (mcIimit.mcIDQtime2 < 50)
- {
- mcIimit.mcIDQtime2++;
- }
- else
- {
- mcIimit.flag = 2;
- }
- }
-
- mcIimit.mcIDQtime4++;
-
- if (mcIimit.mcIDQtime4 >= 45000)
- {
- mcIimit.flag = 2;
- mcIimit.mcIDQtime4 = 0;
- }
- }
-
- if (mcIimit.flag == 2)
- {
- mcIimit.mcIDQtime2 = 0;
-
- if (mcIimit.mcIDQtime3 < 10000)
- {
- mcIimit.mcIDQtime3++;
- }
- else
- {
- mcIimit.flag = 3;
- }
- }
-
- //PPPPPP
- if (mcIimit.Pflag == 0 || mcIimit.Pflag == 3)
- {
- if ((mcFocCtrl.Powerlpf > P_OVER))
- {
- mcIimit.mcPtime3 = 0;
-
- if (mcIimit.mcPtime1 < 50)
- {
- mcIimit.mcPtime1++;
- }
- else
- {
- mcIimit.Pflag = 1;
- }
- }
- }
-
- if (mcIimit.Pflag == 1)
- {
- if ((mcFocCtrl.Powerlpf < P_LIMIT))
- {
- mcIimit.mcPtime1 = 0;
-
- if (mcIimit.mcPtime2 < 50)
- {
- mcIimit.mcPtime2++;
- }
- else
- {
- mcIimit.Pflag = 2;
- }
- }
-
- mcIimit.mcPtime4++;
-
- if (mcIimit.mcPtime4 >= 45000)
- {
- mcIimit.Pflag = 2;
- mcIimit.mcPtime4 = 0;
- }
- }
-
- if (mcIimit.Pflag == 2)
- {
- mcIimit.mcPtime2 = 0;
-
- if (mcIimit.mcPtime3 < 10000)
- {
- mcIimit.mcPtime3++;
- }
- else
- {
- mcIimit.Pflag = 3;
- }
- }
- }
- void IsLimit_Over_deal(void)
- {
- if ((mcIimit.flag == 1) || mcIimit.Pflag == 1)
- {
- motorControl.TargetRef = _Q15(1800 / MOTOR_SPEED_BASE);
- }
- else if ((mcIimit.flag == 2) || (mcIimit.Pflag == 2))
- {
- motorControl.TargetRef = mcSpeedRamp.ActualValue;
- }
- }
- uint16 VAC_Frequency_Max(void)
- {
- static int16 Limit_Fre_Max = 0, VAC_last = 32765, VAC_chazhi = 0;
- VAC_chazhi = VAC_last - mcFocCtrl.mcAcbusFlt;
-
- if ((VAC_chazhi > _Q15(7.0 / HW_BOARD_ACVOLT_MAX)) || (VAC_chazhi < (_Q15(-7.0 / HW_BOARD_ACVOLT_MAX))) || (mcFocCtrl.mcAcbustime > 10000))
- {
- if (mcFocCtrl.mcAcbusFlt <= VAC_Min)
- {
- Limit_Fre_Max = VAC_Min_F;
- }
- else if (mcFocCtrl.mcAcbusFlt <= VAC_Max)
- {
- Limit_Fre_Max = VAC_Min_F + (int16)(VAC_Max_K * (mcFocCtrl.mcAcbusFlt - VAC_Min));
- }
- else
- {
- Limit_Fre_Max = VAC_Max_F ;
- }
-
- VAC_last = mcFocCtrl.mcAcbusFlt;
- mcFocCtrl.mcAcbustime = 0;
- }
-
- return Limit_Fre_Max;
- }
|