| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001 |
- /********************************************************************************
- **** Copyright (C), 2020, Fortior Technology Co., Ltd. ****
- ********************************************************************************
- File Name : AddFunction.c
- Author : Bruce HW&RD
- Date : 2020-10-17
- Description : .C file function description
- Version : 1.0
- Function List :
- Record :
- 1.Date : 2020-10-17
- Author : Bruce HW&RD
- Modification: Created file
- ********************************************************************************/
- #include "FU68xx_5.h"
- #include <Myproject.h>
- extern int16 TD_output1;
- extern uint16 SKI1, SKP1;
- /* Private variables ---------------------------------------------------------*/
- PWMINPUTCAL xdata mcPwmInput;
- CurrentVarible xdata mcCurVarible;
- FOCCTRL xdata mcFocCtrl;
- ILIMIT xdata mcIimit;
- ADCSample xdata AdcSampleValue;
- MCLedDisplay xdata mcLedDisplay;
- MCRAMP xdata mcSpeedRamp;
- PFCMCRAMP xdata PFCCONTROL;
- TIMERTypeDef xdata Time;
- CONTROLCMDD xdata ConTrolCmd;
- uint8 xdata dog_Status = 0;
- uint8 xdata flag_1ms_main = 0;
- int16 Huan_temp = 0, Guan_temp = 0, Paiqi_temp = 0;
- int16 qiangtujiaodu = 0;
- int16 s2_cvcf_i_set = IF_I_Value;
- #if (Debugg==1)
- extern int16 xdata GPFCON1, GPFCON2, GPFCON3, GPFCON4, GPFCON5, GPFCON6, GPFCON7, GPFCON8, GPFCON9, GPFCON10;
- #endif
- /*---------------------------------------------------------------------------*/
- /* Name : void FaultProcess(void)
- /* Input : NO
- /* Output : NO
- /* Description: 保护处理函数,关闭FOC输出,同时将状态变为mcFault
- /*---------------------------------------------------------------------------*/
- void FaultProcess(void)
- {
- ClrBit(DRV_CR, FOCEN); //FOC Disable
- MOE = 0;
- }
- int16 LPF_realize(int16 Xn1, int16 Xn0, int16 K)
- {
- LPF0_K = K;
- LPF0_X = Xn1;
- LPF0_YH = Xn0;
- SMDU_RunBlock(0, 6); //调用MDU运算单元0中的LPF模式(6)
- return LPF0_YH;
- }
- int16 LPF_realize1(int16 Xn1, int16 Xn0, int16 K)
- {
- LPF1_K = K;
- LPF1_X = Xn1;
- LPF1_YH = Xn0;
- SMDU_RunBlock(1, 6); //调用MDU运算单元0中的LPF模式(6)
- return LPF1_YH;
- }
- int16 LPF_realize2(int16 Xn1, int16 Xn0, int16 K)
- {
- LPF2_K = K;
- LPF2_X = Xn1;
- LPF2_YH = Xn0;
- SMDU_RunBlock(2, 6); //调用MDU运算单元0中的LPF模式(6)
- return LPF2_YH;
- }
- /*风机PI函数*/
- int16 fengjiPI(int16 feedbackvalue, int16 referencevalue)
- {
- PI2_EK = referencevalue - feedbackvalue;
- SMDU_RunBlock(2, 7); //调用MDU运算单元0中的PI模式(7)
- return PI2_UKH;
- }
- /*---------------------------------------------------------------------------*/
- /* 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;
-
- if ((mcSpeedRamp.ActualValue < _Q15(2000.0 / MOTOR_SPEED_BASE)) && IQCOMPENSATEENBLE == 1)
- {
- DAC_Value = TorDAC_OvercurrentValue;
- }
- else
- {
- 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目标转速为启动转速
- {
- // PI0_KP = SKP;
- // PI0_KI = SKI;
- // PI0_KP = _Q12(0.01 * SKP1);
- // PI0_KI = _Q15(0.001 * SKI1);
- mcSpeedRamp.IncValue = SpeedRampStartInc;
- mcFocCtrl.RunStateCnt++;
-
- if (mcSpeedRamp.FlagONOFF == 1)
- {
- mcSpeedRamp.TargetValue = Motor_Start_Hold_Speed; //上油时间内维持上油转速
- }
- else
- {
- mcSpeedRamp.TargetValue = 0;
- mcSpeedRamp.DecValue = Motor_Speed_Dec1;
- }
- }
- else //如果达到上油转速后,将起动速度环增量变为运行速度环增量
- {
- Current_Speed_PI();
- DCOvercurrentValue();
- mcSpeedRamp.IncValue = Motor_Speed_Inc;
-
- if ((mcSpeedRamp.FlagONOFF == 0) || (mcSpeedRamp.TargetValue == 0))
- {
- mcSpeedRamp.DecValue = Motor_Speed_Dec1;
- }
- else
- {
- mcSpeedRamp.DecValue = Motor_Speed_Dec;
- }
- }
-
- switch (mcFocCtrl.CtrlMode)
- {
- case 0:
- {
- if (mcFocCtrl.SpeedFlt > Motor_Loop_Speed) //>=MOTOR_LOOP_RPM
- {
- if (Start_CNT < 15)
- {
- Start_CNT ++;
- }
- else
- {
- mcFocCtrl.CtrlMode = 1;
- Start_CNT = 0;
- #if (Motor_Speed_Control_Mode == SPEED_LOOP_CONTROL)
- {
- mcSpeedRamp.ActualValue = mcFocCtrl.SpeedFlt + _Q15(150 / MOTOR_SPEED_BASE); //mcFocCtrl.SpeedFlt; FOC__EOME
- }
- #elif (Motor_Speed_Control_Mode == POWER_LOOP_CONTROL)
- {
- mcSpeedRamp.ActualValue = mcFocCtrl.Powerlpf;
- }
- #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++;
- mcFocCtrl.Weak_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 (OUTLoop_Mode == OUTLoop_Disable)
- {
- 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;
- }
- }
- #elif (OUTLoop_Mode == OUTLoop_Enable)
- {
- #if (Motor_Speed_Control_Mode == SPEED_LOOP_CONTROL)
- {
- mcFocCtrl.IsRef = PI_realize(mcSpeedRamp.ActualValue - mcFocCtrl.SpeedFlt);
- }
- #elif (Motor_Speed_Control_Mode == POWER_LOOP_CONTROL)
- {
- FOC_IQREF = HW_One_PI(mcSpeedRamp.ActualValue - mcFocCtrl.Powerlpf);
- }
- #endif
-
- STT_FOC_THECOMP_CLEAR();
- }
- #endif
- mcFocCtrl.LoopTime = 0;
- }
-
- // if(mcFocCtrl.Weak_LoopTime > WEAK_LOOP_TIME)
- // {
- // #if (FiledWeakenCompEnable)
- // {
- // FiledWeakenControl(FOC__UD, FOC__UQ, _Q15(0.9),mcFocCtrl.IsRef);
- //// GetFieldWeakenUsAndUdc_Q15(mcFocCtrl.UDFlt,mcFocCtrl.UQFlt,mcFocCtrl.mcDcbusFlt);
- //// GetFieldWeakenIsTheta_Q15();
- //// GetFieldWeakenIdRefAndIqRef_Q15(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
- // mcFocCtrl.Weak_LoopTime = 0;
- // }
- }
- break;
- }
- }
- }
- void main_ms(void)
- {
- SetBit(ADC_CR, ADCBSY); //使能ADC的DCBUS采样
- // while(ReadBit(ADC_CR , ADCBSY));
-
- /****速度滤波、反电动势滤波*****/
- if ((mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
- {
- // SqrtU_alpbet(FOC__UD,FOC__UQ,mcFocCtrl.VDQ);//
- mcFocCtrl.BEmf = LPF_realize1(FOC__EMF, mcFocCtrl.BEmf, LPF_K(5.0)); //反电动势滤波
- mcFocCtrl.Powerlpf = LPF_realize1(FOC__POW, mcFocCtrl.Powerlpf, LPF_K(1.0)); //功率滤波
- mcFocCtrl.IDQFlt = LPF_realize1(mcCurVarible.Max_is, mcFocCtrl.IDQFlt, LPF_K(1.0)); //反电动势滤波
-
- // mcFocCtrl.VDQFlt = LPF_realize1(mcFocCtrl.VDQ, mcFocCtrl.VDQFlt, LPF_K(5.0)); //反电动势滤波
- if (mcFocCtrl.Powerlpf <= 0)
- {mcFocCtrl.Powerlpf = 0;}
- }
- else
- {
- // mcFocCtrl.VDQFlt=0;
- mcFocCtrl.IDQFlt = 0;
- mcFocCtrl.BEmf = 0;
- mcFocCtrl.Powerlpf = 0;
- }
-
- // mcFocCtrl.mcDcbus_chazhiFlt = LPF_realize1(mcFocCtrl.mcDcbus_chazhi, mcFocCtrl.mcDcbus_chazhiFlt, LPF_K(5.0)); //反电动势滤波
- /*****温度DCbus_AND_Ibus采样获取值并滤波******/
- AdcSampleValue.ADC_huan_temp = LPF_realize1(Huan_ADC, AdcSampleValue.ADC_huan_temp, LPF_K(20.0)); //环静温度
- AdcSampleValue.ADC_guan_temp = LPF_realize1(Guan_ADC, AdcSampleValue.ADC_guan_temp, LPF_K(20.0)); //盘管温度
- AdcSampleValue.ADC_paiqi_temp = LPF_realize1(Paiqi_ADC, AdcSampleValue.ADC_paiqi_temp, LPF_K(20.0)); //排气温度
- // AdcSampleValue.ADC_yaji_temp = LPF_realize1(Yaji_ADC , AdcSampleValue.ADC_yaji_temp , LPF_K(20.0)); //压机外壳温度
- AdcSampleValue.ADC_IPM_temp = LPF_realize1(IPM_ADC, AdcSampleValue.ADC_IPM_temp, LPF_K(20.0)); //IPM温度
- mcFocCtrl.mcDcbusFlt = LPF_realize1(DCBUS_ADC, mcFocCtrl.mcDcbusFlt, LPF_K(5.0)); //母线电压滤波
- mcFocCtrl.mcAcbusFlt = LPF_realize1(mcFocCtrl.mcAcbus_max, mcFocCtrl.mcAcbusFlt, LPF_K(1.0)); //AC电压峰值滤波
- // IsLimit_Over_tect();
- #if (IQCOMPENSATEENBLE)
- {
- TorquePeakK(mcFocCtrl.Powerlpf); //分段处理
- }
- #endif
- }
- /*---------------------------------------------------------------------------*/
- /* Name : void LED_Display(void)
- /* Input : NO
- /* Output : NO
- /* Description: LED灯显示
- /*---------------------------------------------------------------------------*/
- void LED_Display(void)
- {
- if (mcFaultSource == FaultNoSource)
- {
- ResetLEDPin; //低电平点亮,高电平灭
- }
- else
- {
- Led_OnOff(&mcLedDisplay, mcFaultSource);
- }
- }
- /*角度补偿清零*/
- 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;
- }
- //LED灯的闪烁
- void Led_OnOff(MCLedDisplay * hLedDisplay, uint8 htime)
- {
- hLedDisplay->LedCount++;
-
- if (hLedDisplay->LedCount < hLedDisplay->Counttime)
- {
- if (hLedDisplay->Count < 200)
- {
- hLedDisplay->Count++;
- }
- else if ((hLedDisplay->Count >= 200) && (hLedDisplay->Count < 201))
- {
- hLedDisplay->Count = 0;
- LEDPinONOFF;
- hLedDisplay->LedTimCot++;
- }
-
- if (hLedDisplay->LedTimCot >= 2 * htime)
- {
- hLedDisplay->Count = 202;
- SetLEDPin;
- }
- }
- else if (hLedDisplay->LedCount >= hLedDisplay->Counttime)
- {
- hLedDisplay->LedCount = 0;
- hLedDisplay->LedTimCot = 0;
- hLedDisplay->Count = 0;
- }
- }
- /*---------------------------------------------------------------------------*/
- /* 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
- }
- }
- }
- void MCTorqueControl(void)
- {
- }
- int16 idref = 0;
- void ID_IQ_Control(void)
- {
- #if (IFFDebugg==0)
- {
- if (mcFocCtrl.CtrlMode)
- {
- #if (IQCOMPENSATEENBLE==1)
- {
- FOC_IQREF = mcFocCtrl.IqRef + mcTorqueCompensation.TorqueCompensateIqCurrentValue;
- }
- #elif (IQCOMPENSATEENBLE==0)
- {
- FOC_IQREF = mcFocCtrl.IqRef;
- }
- #endif
- FOC_IDREF = mcFocCtrl.IdRef;
- }
- }
- #elif (IFFDebugg==1)
- {
- // iqfedback=FOC__IQ;
- // iqffff=FOC_IQREF;
- /*假负载测试*/
- if ((mcState == mcRun))
- {
- if (Time.PowerOnCnt >= 1500)
- {
- qiangtujiaodu += 1920;
- idref = idref + 1;
-
- if (idref >= s2_cvcf_i_set)
- {idref = s2_cvcf_i_set;}
-
- FOC__THETA = qiangtujiaodu;
- FOC_IQREF = idref;
- FOC_IDREF = 0;
- }
- else
- {
- FOC_IQREF = 0;
- FOC_IDREF = 0;
- }
- }
- }
- #endif
- }
- /*IPM温度计算——返回值扩大10倍*/
- int16 IPM_RealTemp(uint16 ADC_vaule)
- {
- int16 temp;
- static uint32 R_Real = 0;
- /*初始参数初始化*/
- RealTempR.R_PU = 2000; //上拉电阻
- RealTempR.R_PD = 0; //下拉电阻
- RealTempR.R_Base = 5000; //25度时NTC阻值
- RealTempR.B = 3380; //B
- RealTempR.T25 = 298.15; //固定 25.0+273.15
-
- /*NTC电阻计算 4.5——4096 5——4551*/
- if (RealTempR.R_PU > 0)
- {
- R_Real = (RealTempR.R_PU * ADC_vaule) / (4551 - ADC_vaule);
- }
-
- if (RealTempR.R_PD > 0)
- {
- R_Real = (RealTempR.R_PD * (4551 - ADC_vaule)) / ADC_vaule;
- }
-
- if (ADC_vaule < 50)
- {
- temp = - 1000; // -100C
- }
- else if (ADC_vaule > 4000)
- {
- temp = -1500; // 150C
- }
- else
- {
- /*NTC温度计算*/
- temp = 10 / (1 / RealTempR.T25 - ((log(RealTempR.R_Base) - log(R_Real)) / RealTempR.B)) - 2731; // UNIT: 0.1C
- /*温度限制上位机原因*/
- }
-
- return (temp);
- }
- /*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 = _Q12(0.01 * SKP1);
- // DQki = _Q15(0.001 * SKI1);
- 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;
- }
- /*温度计算*/
- void Temp_jisuan(void)
- {
- mcFocCtrl.IPMtemp = IPM_RealTemp(AdcSampleValue.ADC_IPM_temp >> 3); //IPM温度计算
- }
- uint16 AimFrequencyMaxVAC = 500;
- /*指令获取*/
- void Control_Cmd(void)
- {
- if (Time.PowerOnCnt >= 2000)
- {
- //压机指令获取
- if (ConTrolCmd.yajispeed > 300)
- {
- mcSpeedRamp.FlagONOFF = 1;
- }
- else
- {
- mcSpeedRamp.TargetValue = 0;
- mcSpeedRamp.FlagONOFF = 0;
- mcProtectTime.CurrentPretectTimes = 0;
- mcProtectTime.SecondStartTimes = 0;
- mcProtectTime.StallTimes = 0;
- mcProtectTime.LossPHTimes = 0;
- mcProtectTime.IbusOffsetProtectTimes = 0;
- }
-
- //4通阀指令获取 WAY4
- // WAY4=ConTrolCmd.sitongfa;
- //电加热
- // DJR=ConTrolCmd.dianjiare;
- //室外风机
- ConTrolCmd.fengjispeed;
- //电子膨胀阀开度获取
- ConTrolCmd.dianzifakaidu ;
- }
- else
- {
- mcSpeedRamp.TargetValue = 0;
- mcSpeedRamp.FlagONOFF = 0;
- ConTrolCmd.fengjispeed = 0;
- // WAY4 = 0;
- }
-
- // AimFrequencyMaxVAC=VAC_Frequency_Max()*6;
- if (ConTrolCmd.yajispeed > Motor_Max_Speed) //限制最高转速
- {
- ConTrolCmd.yajispeed = Motor_Max_Speed;
- }
-
- //压机闭环目标转速
- mcSpeedRamp.TargetValue = S_Value(ConTrolCmd.yajispeed);
-
- if ((mcSpeedRamp.TargetValue <= Motor_Min_Speed) && (mcSpeedRamp.FlagONOFF == 1))
- {
- mcSpeedRamp.TargetValue = Motor_Min_Speed;
- }
- }
- #if (Debugg==1)
- void Trace_Select_read(void) //需要放载波函数里面
- {
- GPFCON1 = PFC__IAC;
- GPFCON2 = PFC__UAC;
- GPFCON3 = FOC__IA;//FOC__IA;
- GPFCON4 = FOC__IB;//FOC__IB;
- GPFCON5 = mcFocCtrl.mcDcbusFlt;
- GPFCON6 = mcFocCtrl.Powerlpf;
- GPFCON7 = mcFocCtrl.IDQFlt;
- // GPFCON9 = mcFocCtrl.SpeedFlt;
- GPFCON10 = mcFocCtrl.IPMtemp;
- }
- void Trace_Select_write(void) //需要放主函数里面
- {
- if (mcFaultDect.commu_time >= 6000)
- {
- ConTrolCmd.yajispeed = GPFCON8;
- s2_cvcf_i_set = GPFCON9;
- }
- }
- #endif
- void IsLimit_Over_tect(void)
- {
- // if(mcIimit.flag==0||mcIimit.flag==3)
- // {
- // if((mcFocCtrl.Powerlpf>P_OVER)||(mcFocCtrl.IDQFlt>I_OVER))
- // {
- // mcIimit.mcIDQtime3=0;
- // if (mcIimit.mcIDQtime1 < 50)
- // {
- // mcIimit.mcIDQtime1++;
- // }
- // else
- // {
- // mcIimit.flag=1;
- // }
- // }
- // }
- // if(mcIimit.flag==1)
- // {
- // if((mcFocCtrl.Powerlpf<P_LIMIT)||(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;
- // }
- // }
- ////IIIIII
- 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)
- {
- mcSpeedRamp.TargetValue = _Q15(1800 / MOTOR_SPEED_BASE);
- }
- else if ((mcIimit.flag == 2) || (mcIimit.Pflag == 2))
- {
- mcSpeedRamp.TargetValue = 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;
- }
|