AddFunction.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  1. /********************************************************************************
  2. **** Copyright (C), 2020, Fortior Technology Co., Ltd. ****
  3. ********************************************************************************
  4. File Name : AddFunction.c
  5. Author : Bruce HW&RD
  6. Date : 2020-10-17
  7. Description : .C file function description
  8. Version : 1.0
  9. Function List :
  10. Record :
  11. 1.Date : 2020-10-17
  12. Author : Bruce HW&RD
  13. Modification: Created file
  14. ********************************************************************************/
  15. #include "FU68xx_5.h"
  16. #include <Myproject.h>
  17. extern int16 TD_output1;
  18. extern uint16 SKI1, SKP1;
  19. /* Private variables ---------------------------------------------------------*/
  20. PWMINPUTCAL xdata mcPwmInput;
  21. CurrentVarible xdata mcCurVarible;
  22. FOCCTRL xdata mcFocCtrl;
  23. ILIMIT xdata mcIimit;
  24. ADCSample xdata AdcSampleValue;
  25. MCLedDisplay xdata mcLedDisplay;
  26. MCRAMP xdata mcSpeedRamp;
  27. PFCMCRAMP xdata PFCCONTROL;
  28. TIMERTypeDef xdata Time;
  29. CONTROLCMDD xdata ConTrolCmd;
  30. uint8 xdata dog_Status = 0;
  31. uint8 xdata flag_1ms_main = 0;
  32. int16 Huan_temp = 0, Guan_temp = 0, Paiqi_temp = 0;
  33. int16 qiangtujiaodu = 0;
  34. int16 s2_cvcf_i_set = IF_I_Value;
  35. #if (Debugg==1)
  36. extern int16 xdata GPFCON1, GPFCON2, GPFCON3, GPFCON4, GPFCON5, GPFCON6, GPFCON7, GPFCON8, GPFCON9, GPFCON10;
  37. #endif
  38. /*---------------------------------------------------------------------------*/
  39. /* Name : void FaultProcess(void)
  40. /* Input : NO
  41. /* Output : NO
  42. /* Description: 保护处理函数,关闭FOC输出,同时将状态变为mcFault
  43. /*---------------------------------------------------------------------------*/
  44. void FaultProcess(void)
  45. {
  46. ClrBit(DRV_CR, FOCEN); //FOC Disable
  47. MOE = 0;
  48. }
  49. int16 LPF_realize(int16 Xn1, int16 Xn0, int16 K)
  50. {
  51. LPF0_K = K;
  52. LPF0_X = Xn1;
  53. LPF0_YH = Xn0;
  54. SMDU_RunBlock(0, 6); //调用MDU运算单元0中的LPF模式(6)
  55. return LPF0_YH;
  56. }
  57. int16 LPF_realize1(int16 Xn1, int16 Xn0, int16 K)
  58. {
  59. LPF1_K = K;
  60. LPF1_X = Xn1;
  61. LPF1_YH = Xn0;
  62. SMDU_RunBlock(1, 6); //调用MDU运算单元0中的LPF模式(6)
  63. return LPF1_YH;
  64. }
  65. int16 LPF_realize2(int16 Xn1, int16 Xn0, int16 K)
  66. {
  67. LPF2_K = K;
  68. LPF2_X = Xn1;
  69. LPF2_YH = Xn0;
  70. SMDU_RunBlock(2, 6); //调用MDU运算单元0中的LPF模式(6)
  71. return LPF2_YH;
  72. }
  73. /*风机PI函数*/
  74. int16 fengjiPI(int16 feedbackvalue, int16 referencevalue)
  75. {
  76. PI2_EK = referencevalue - feedbackvalue;
  77. SMDU_RunBlock(2, 7); //调用MDU运算单元0中的PI模式(7)
  78. return PI2_UKH;
  79. }
  80. /*---------------------------------------------------------------------------*/
  81. /* Name : int32 Abs_F32(int32 value)
  82. /* Input : value
  83. /* Output : int16
  84. /* Description: 对变量取16位的绝对值
  85. /*---------------------------------------------------------------------------*/
  86. uint32 Abs_F32(int32 value)
  87. {
  88. if (value < 0)
  89. {
  90. return (-value);
  91. }
  92. else
  93. {
  94. return (value);
  95. }
  96. }
  97. /*****转矩补偿和无转矩补偿时过流值设置*****/
  98. void DCOvercurrentValue(void)
  99. {
  100. static uint8 DAC_Value, DAC_Value2;
  101. if ((mcSpeedRamp.ActualValue < _Q15(2000.0 / MOTOR_SPEED_BASE)) && IQCOMPENSATEENBLE == 1)
  102. {
  103. DAC_Value = TorDAC_OvercurrentValue;
  104. }
  105. else
  106. {
  107. DAC_Value = DAC_OvercurrentValue;
  108. }
  109. DAC_Value2 = DAC0_DR;
  110. if (DAC_Value < DAC_Value2)
  111. {
  112. DAC_Value2 -= 1;
  113. }
  114. else if (DAC_Value > DAC_Value2)
  115. {
  116. DAC_Value2 += 1;
  117. }
  118. if (DAC_Value2 < 255)
  119. {
  120. DAC0_DR = (uint8)DAC_Value2;
  121. }
  122. else
  123. {
  124. DAC0_DR = 255;
  125. }
  126. }
  127. /*---------------------------------------------------------------------------*/
  128. /* Name : void Speed_response(void)
  129. /* Input : NO
  130. /* Output : NO
  131. /* Description: 速度响应函数,可根据需求加入控制环,如恒转矩控制、恒转速控制、恒功率控制
  132. /*---------------------------------------------------------------------------*/
  133. void Speed_response(void)
  134. {
  135. static uint8 Start_CNT = 0;
  136. if ((mcState == mcRun) || (mcState == mcStop))
  137. {
  138. if (mcFocCtrl.RunStateCnt < MotorStartHoldTime) // MotorStartHoldTime目标转速为启动转速
  139. {
  140. // PI0_KP = SKP;
  141. // PI0_KI = SKI;
  142. // PI0_KP = _Q12(0.01 * SKP1);
  143. // PI0_KI = _Q15(0.001 * SKI1);
  144. mcSpeedRamp.IncValue = SpeedRampStartInc;
  145. mcFocCtrl.RunStateCnt++;
  146. if (mcSpeedRamp.FlagONOFF == 1)
  147. {
  148. mcSpeedRamp.TargetValue = Motor_Start_Hold_Speed; //上油时间内维持上油转速
  149. }
  150. else
  151. {
  152. mcSpeedRamp.TargetValue = 0;
  153. mcSpeedRamp.DecValue = Motor_Speed_Dec1;
  154. }
  155. }
  156. else //如果达到上油转速后,将起动速度环增量变为运行速度环增量
  157. {
  158. Current_Speed_PI();
  159. DCOvercurrentValue();
  160. mcSpeedRamp.IncValue = Motor_Speed_Inc;
  161. if ((mcSpeedRamp.FlagONOFF == 0) || (mcSpeedRamp.TargetValue == 0))
  162. {
  163. mcSpeedRamp.DecValue = Motor_Speed_Dec1;
  164. }
  165. else
  166. {
  167. mcSpeedRamp.DecValue = Motor_Speed_Dec;
  168. }
  169. }
  170. switch (mcFocCtrl.CtrlMode)
  171. {
  172. case 0:
  173. {
  174. if (mcFocCtrl.SpeedFlt > Motor_Loop_Speed) //>=MOTOR_LOOP_RPM
  175. {
  176. if (Start_CNT < 15)
  177. {
  178. Start_CNT ++;
  179. }
  180. else
  181. {
  182. mcFocCtrl.CtrlMode = 1;
  183. Start_CNT = 0;
  184. #if (Motor_Speed_Control_Mode == SPEED_LOOP_CONTROL)
  185. {
  186. mcSpeedRamp.ActualValue = mcFocCtrl.SpeedFlt + _Q15(150 / MOTOR_SPEED_BASE); //mcFocCtrl.SpeedFlt; FOC__EOME
  187. }
  188. #elif (Motor_Speed_Control_Mode == POWER_LOOP_CONTROL)
  189. {
  190. mcSpeedRamp.ActualValue = mcFocCtrl.Powerlpf;
  191. }
  192. #endif
  193. mcFocCtrl.LoopTime = SPEED_LOOP_TIME;
  194. mcFocCtrl.IND_DEC_LoopTime = SPEED_INC_DEC_TIME;
  195. PI0_UKH = mcFocCtrl.mcIqref;
  196. mcFocCtrl.IsRef = mcFocCtrl.mcIqref;
  197. }
  198. }
  199. }
  200. break;
  201. case 1:
  202. {
  203. IsLimit_Over_deal();
  204. mcFocCtrl.LoopTime++;
  205. mcFocCtrl.IND_DEC_LoopTime++;
  206. mcFocCtrl.Weak_LoopTime++;
  207. if (mcFocCtrl.IND_DEC_LoopTime > SPEED_INC_DEC_TIME)
  208. {
  209. mc_ramp(&mcSpeedRamp);
  210. mcFocCtrl.IND_DEC_LoopTime = 0;
  211. }
  212. if (mcFocCtrl.LoopTime > SPEED_LOOP_TIME)
  213. {
  214. #if (OUTLoop_Mode == OUTLoop_Disable)
  215. {
  216. mcFocCtrl.mcIqref = FOC_IQREF;
  217. if (FOC_IQREF < mcFocCtrl.QoutValue)
  218. {
  219. mcFocCtrl.mcIqref += QOUTINC;
  220. if (mcFocCtrl.mcIqref > mcFocCtrl.QoutValue)
  221. {
  222. mcFocCtrl.mcIqref = mcFocCtrl.QoutValue;
  223. }
  224. FOC_IQREF = mcFocCtrl.mcIqref;
  225. }
  226. else if (FOC_IQREF > mcFocCtrl.QoutValue)
  227. {
  228. mcFocCtrl.mcIqref -= QOUTINC;
  229. if (mcFocCtrl.mcIqref < mcFocCtrl.QoutValue)
  230. {
  231. mcFocCtrl.mcIqref = mcFocCtrl.QoutValue;
  232. }
  233. FOC_IQREF = mcFocCtrl.mcIqref;
  234. }
  235. }
  236. #elif (OUTLoop_Mode == OUTLoop_Enable)
  237. {
  238. #if (Motor_Speed_Control_Mode == SPEED_LOOP_CONTROL)
  239. {
  240. mcFocCtrl.IsRef = PI_realize(mcSpeedRamp.ActualValue - mcFocCtrl.SpeedFlt);
  241. }
  242. #elif (Motor_Speed_Control_Mode == POWER_LOOP_CONTROL)
  243. {
  244. FOC_IQREF = HW_One_PI(mcSpeedRamp.ActualValue - mcFocCtrl.Powerlpf);
  245. }
  246. #endif
  247. STT_FOC_THECOMP_CLEAR();
  248. }
  249. #endif
  250. mcFocCtrl.LoopTime = 0;
  251. }
  252. // if(mcFocCtrl.Weak_LoopTime > WEAK_LOOP_TIME)
  253. // {
  254. // #if (FiledWeakenCompEnable)
  255. // {
  256. // FiledWeakenControl(FOC__UD, FOC__UQ, _Q15(0.9),mcFocCtrl.IsRef);
  257. //// GetFieldWeakenUsAndUdc_Q15(mcFocCtrl.UDFlt,mcFocCtrl.UQFlt,mcFocCtrl.mcDcbusFlt);
  258. //// GetFieldWeakenIsTheta_Q15();
  259. //// GetFieldWeakenIdRefAndIqRef_Q15(mcFocCtrl.IsRef);
  260. // if(mcFieldWeaken.mcIdref<ID_Limit)
  261. // {mcFieldWeaken.mcIdref=ID_Limit;}
  262. // mcFocCtrl.IdRef = mcFieldWeaken.mcIdref;
  263. // mcFocCtrl.IqRef = mcFieldWeaken.mcIqref;
  264. // }
  265. // #else
  266. // {
  267. // mcFocCtrl.IqRef = mcFocCtrl.IsRef;
  268. // mcFocCtrl.IdRef = 0;
  269. // }
  270. // #endif
  271. // mcFocCtrl.Weak_LoopTime = 0;
  272. // }
  273. }
  274. break;
  275. }
  276. }
  277. }
  278. void main_ms(void)
  279. {
  280. SetBit(ADC_CR, ADCBSY); //使能ADC的DCBUS采样
  281. // while(ReadBit(ADC_CR , ADCBSY));
  282. /****速度滤波、反电动势滤波*****/
  283. if ((mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
  284. {
  285. // SqrtU_alpbet(FOC__UD,FOC__UQ,mcFocCtrl.VDQ);//
  286. mcFocCtrl.BEmf = LPF_realize1(FOC__EMF, mcFocCtrl.BEmf, LPF_K(5.0)); //反电动势滤波
  287. mcFocCtrl.Powerlpf = LPF_realize1(FOC__POW, mcFocCtrl.Powerlpf, LPF_K(1.0)); //功率滤波
  288. mcFocCtrl.IDQFlt = LPF_realize1(mcCurVarible.Max_is, mcFocCtrl.IDQFlt, LPF_K(1.0)); //反电动势滤波
  289. // mcFocCtrl.VDQFlt = LPF_realize1(mcFocCtrl.VDQ, mcFocCtrl.VDQFlt, LPF_K(5.0)); //反电动势滤波
  290. if (mcFocCtrl.Powerlpf <= 0)
  291. {mcFocCtrl.Powerlpf = 0;}
  292. }
  293. else
  294. {
  295. // mcFocCtrl.VDQFlt=0;
  296. mcFocCtrl.IDQFlt = 0;
  297. mcFocCtrl.BEmf = 0;
  298. mcFocCtrl.Powerlpf = 0;
  299. }
  300. // mcFocCtrl.mcDcbus_chazhiFlt = LPF_realize1(mcFocCtrl.mcDcbus_chazhi, mcFocCtrl.mcDcbus_chazhiFlt, LPF_K(5.0)); //反电动势滤波
  301. /*****温度DCbus_AND_Ibus采样获取值并滤波******/
  302. AdcSampleValue.ADC_huan_temp = LPF_realize1(Huan_ADC, AdcSampleValue.ADC_huan_temp, LPF_K(20.0)); //环静温度
  303. AdcSampleValue.ADC_guan_temp = LPF_realize1(Guan_ADC, AdcSampleValue.ADC_guan_temp, LPF_K(20.0)); //盘管温度
  304. AdcSampleValue.ADC_paiqi_temp = LPF_realize1(Paiqi_ADC, AdcSampleValue.ADC_paiqi_temp, LPF_K(20.0)); //排气温度
  305. // AdcSampleValue.ADC_yaji_temp = LPF_realize1(Yaji_ADC , AdcSampleValue.ADC_yaji_temp , LPF_K(20.0)); //压机外壳温度
  306. AdcSampleValue.ADC_IPM_temp = LPF_realize1(IPM_ADC, AdcSampleValue.ADC_IPM_temp, LPF_K(20.0)); //IPM温度
  307. mcFocCtrl.mcDcbusFlt = LPF_realize1(DCBUS_ADC, mcFocCtrl.mcDcbusFlt, LPF_K(5.0)); //母线电压滤波
  308. mcFocCtrl.mcAcbusFlt = LPF_realize1(mcFocCtrl.mcAcbus_max, mcFocCtrl.mcAcbusFlt, LPF_K(1.0)); //AC电压峰值滤波
  309. // IsLimit_Over_tect();
  310. #if (IQCOMPENSATEENBLE)
  311. {
  312. TorquePeakK(mcFocCtrl.Powerlpf); //分段处理
  313. }
  314. #endif
  315. }
  316. /*---------------------------------------------------------------------------*/
  317. /* Name : void LED_Display(void)
  318. /* Input : NO
  319. /* Output : NO
  320. /* Description: LED灯显示
  321. /*---------------------------------------------------------------------------*/
  322. void LED_Display(void)
  323. {
  324. if (mcFaultSource == FaultNoSource)
  325. {
  326. ResetLEDPin; //低电平点亮,高电平灭
  327. }
  328. else
  329. {
  330. Led_OnOff(&mcLedDisplay, mcFaultSource);
  331. }
  332. }
  333. /*角度补偿清零*/
  334. void STT_FOC_THECOMP_CLEAR(void)
  335. {
  336. mcFocCtrl.foc_comp_temp = mcFocCtrl.STT_FOC_THECOMP;
  337. if (mcFocCtrl.foc_comp_temp < 0)
  338. {
  339. mcFocCtrl.foc_comp_temp++;
  340. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  341. }
  342. else if (mcFocCtrl.foc_comp_temp > 0)
  343. {
  344. mcFocCtrl.foc_comp_temp--;
  345. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  346. }
  347. else
  348. {
  349. mcFocCtrl.foc_comp_temp = 0;
  350. mcFocCtrl.STT_FOC_THECOMP = 0;
  351. }
  352. FOC_THECOMP = mcFocCtrl.STT_FOC_THECOMP;
  353. }
  354. //LED灯的闪烁
  355. void Led_OnOff(MCLedDisplay * hLedDisplay, uint8 htime)
  356. {
  357. hLedDisplay->LedCount++;
  358. if (hLedDisplay->LedCount < hLedDisplay->Counttime)
  359. {
  360. if (hLedDisplay->Count < 200)
  361. {
  362. hLedDisplay->Count++;
  363. }
  364. else if ((hLedDisplay->Count >= 200) && (hLedDisplay->Count < 201))
  365. {
  366. hLedDisplay->Count = 0;
  367. LEDPinONOFF;
  368. hLedDisplay->LedTimCot++;
  369. }
  370. if (hLedDisplay->LedTimCot >= 2 * htime)
  371. {
  372. hLedDisplay->Count = 202;
  373. SetLEDPin;
  374. }
  375. }
  376. else if (hLedDisplay->LedCount >= hLedDisplay->Counttime)
  377. {
  378. hLedDisplay->LedCount = 0;
  379. hLedDisplay->LedTimCot = 0;
  380. hLedDisplay->Count = 0;
  381. }
  382. }
  383. /*---------------------------------------------------------------------------*/
  384. /* Name : void mc_ramp(void)
  385. /* Input : hTarget,MC_RAMP *hSpeedramp
  386. /* Output : NO
  387. /* Description:
  388. /*---------------------------------------------------------------------------*/
  389. void mc_ramp(MCRAMP * hSpeedramp)
  390. {
  391. if (hSpeedramp->ActualValue < hSpeedramp->TargetValue)
  392. {
  393. if (hSpeedramp->ActualValue + hSpeedramp->IncValue < hSpeedramp->TargetValue)
  394. {
  395. hSpeedramp->ActualValue += hSpeedramp->IncValue;
  396. }
  397. else
  398. {
  399. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  400. }
  401. }
  402. else
  403. {
  404. if (hSpeedramp->ActualValue - hSpeedramp->DecValue > hSpeedramp->TargetValue)
  405. {
  406. hSpeedramp->ActualValue -= hSpeedramp->DecValue;
  407. }
  408. else
  409. {
  410. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  411. }
  412. }
  413. }
  414. /*---------------------------------------------------------------------------*/
  415. /* Name : void StarRampDealwith(void)
  416. /* Input : NO
  417. /* Output : NO
  418. /* Description:
  419. /*---------------------------------------------------------------------------*/
  420. void StarRampDealwith(void)
  421. {
  422. if ((mcState == mcRun) || (mcState == mcStart))
  423. {
  424. if ((mcFocCtrl.CtrlMode == 0) || (mcFocCtrl.State_Count > 10))
  425. {
  426. if (mcFocCtrl.iiqq <= IQ_Start_CURRENT2)
  427. {mcFocCtrl.iiqq = mcFocCtrl.iiqq + 2;}
  428. FOC_IQREF = mcFocCtrl.iiqq;
  429. }
  430. if (mcFocCtrl.State_Count == 1200) //2300
  431. {
  432. FOC_EKP = OBSW_KP_GAIN_RUN; // 估算器里的PI的KP
  433. FOC_EKI = OBSW_KI_GAIN_RUN; // 估算器里的PI的KI
  434. #if (EstimateAlgorithm == PLL)
  435. {
  436. FOC_KSLIDE = OBSE_PLLKP_GAIN2;
  437. FOC_EKLPFMIN = OBSE_PLLKI_GAIN2;
  438. }
  439. #endif
  440. }
  441. else if (mcFocCtrl.State_Count == 1000) //2000
  442. {
  443. FOC_EKP = OBSW_KP_GAIN_RUN1; // 估算器里的PI的KP
  444. FOC_EKI = OBSW_KI_GAIN_RUN1; // 估算器里的PI的KI
  445. #if (EstimateAlgorithm == PLL)
  446. {
  447. FOC_KSLIDE = OBSE_PLLKP_GAIN3;
  448. FOC_EKLPFMIN = OBSE_PLLKI_GAIN3;
  449. }
  450. #endif
  451. }
  452. else if (mcFocCtrl.State_Count == 600) //1600
  453. {
  454. FOC_EKP = OBSW_KP_GAIN_RUN2; // 估算器里的PI的KP
  455. FOC_EKI = OBSW_KI_GAIN_RUN2; // 估算器里的PI的KI
  456. #if (EstimateAlgorithm == PLL)
  457. {
  458. FOC_KSLIDE = OBSE_PLLKP_GAIN4;
  459. FOC_EKLPFMIN = OBSE_PLLKI_GAIN4;
  460. }
  461. #endif
  462. }
  463. else if (mcFocCtrl.State_Count == 400) //1200
  464. {
  465. FOC_EKP = OBSW_KP_GAIN_RUN3; // 估算器里的PI的KP
  466. FOC_EKI = OBSW_KI_GAIN_RUN3; // 估算器里的PI的KI
  467. #if (EstimateAlgorithm == PLL)
  468. {
  469. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  470. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  471. }
  472. #endif
  473. }
  474. else if (mcFocCtrl.State_Count == 300)
  475. {
  476. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  477. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  478. #if (EstimateAlgorithm == PLL)
  479. {
  480. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  481. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  482. }
  483. #endif
  484. }
  485. }
  486. }
  487. void MCTorqueControl(void)
  488. {
  489. }
  490. int16 idref = 0;
  491. void ID_IQ_Control(void)
  492. {
  493. #if (IFFDebugg==0)
  494. {
  495. if (mcFocCtrl.CtrlMode)
  496. {
  497. #if (IQCOMPENSATEENBLE==1)
  498. {
  499. FOC_IQREF = mcFocCtrl.IqRef + mcTorqueCompensation.TorqueCompensateIqCurrentValue;
  500. }
  501. #elif (IQCOMPENSATEENBLE==0)
  502. {
  503. FOC_IQREF = mcFocCtrl.IqRef;
  504. }
  505. #endif
  506. FOC_IDREF = mcFocCtrl.IdRef;
  507. }
  508. }
  509. #elif (IFFDebugg==1)
  510. {
  511. // iqfedback=FOC__IQ;
  512. // iqffff=FOC_IQREF;
  513. /*假负载测试*/
  514. if ((mcState == mcRun))
  515. {
  516. if (Time.PowerOnCnt >= 1500)
  517. {
  518. qiangtujiaodu += 1920;
  519. idref = idref + 1;
  520. if (idref >= s2_cvcf_i_set)
  521. {idref = s2_cvcf_i_set;}
  522. FOC__THETA = qiangtujiaodu;
  523. FOC_IQREF = idref;
  524. FOC_IDREF = 0;
  525. }
  526. else
  527. {
  528. FOC_IQREF = 0;
  529. FOC_IDREF = 0;
  530. }
  531. }
  532. }
  533. #endif
  534. }
  535. /*IPM温度计算——返回值扩大10倍*/
  536. int16 IPM_RealTemp(uint16 ADC_vaule)
  537. {
  538. int16 temp;
  539. static uint32 R_Real = 0;
  540. /*初始参数初始化*/
  541. RealTempR.R_PU = 2000; //上拉电阻
  542. RealTempR.R_PD = 0; //下拉电阻
  543. RealTempR.R_Base = 5000; //25度时NTC阻值
  544. RealTempR.B = 3380; //B
  545. RealTempR.T25 = 298.15; //固定 25.0+273.15
  546. /*NTC电阻计算 4.5——4096 5——4551*/
  547. if (RealTempR.R_PU > 0)
  548. {
  549. R_Real = (RealTempR.R_PU * ADC_vaule) / (4551 - ADC_vaule);
  550. }
  551. if (RealTempR.R_PD > 0)
  552. {
  553. R_Real = (RealTempR.R_PD * (4551 - ADC_vaule)) / ADC_vaule;
  554. }
  555. if (ADC_vaule < 50)
  556. {
  557. temp = - 1000; // -100C
  558. }
  559. else if (ADC_vaule > 4000)
  560. {
  561. temp = -1500; // 150C
  562. }
  563. else
  564. {
  565. /*NTC温度计算*/
  566. temp = 10 / (1 / RealTempR.T25 - ((log(RealTempR.R_Base) - log(R_Real)) / RealTempR.B)) - 2731; // UNIT: 0.1C
  567. /*温度限制上位机原因*/
  568. }
  569. return (temp);
  570. }
  571. /*PI参数分段处理*/
  572. void Current_Speed_PI(void)
  573. {
  574. static int16 Skp, Ski, DQkp, DQki;
  575. static int16 Skp_1, Ski_1, DQkp_1, DQki_1;
  576. if (mcFocCtrl.SpeedFlt < _Q15(2000 / MOTOR_SPEED_BASE))
  577. {
  578. Skp = SKPRun;
  579. Ski = SKIRun;
  580. DQkp = DQKP;
  581. DQki = DQKI;
  582. }
  583. else if (mcFocCtrl.SpeedFlt < _Q15(4200 / MOTOR_SPEED_BASE))
  584. {
  585. Skp = SKPRun1;
  586. Ski = SKIRun1;
  587. // DQkp = _Q12(0.01 * SKP1);
  588. // DQki = _Q15(0.001 * SKI1);
  589. DQkp = DQKP_zhong;
  590. DQki = DQKI_zhong;
  591. }
  592. else if (mcFocCtrl.SpeedFlt > _Q15(4700 / MOTOR_SPEED_BASE))
  593. {
  594. Skp = SKPRun2;
  595. Ski = SKIRun2;
  596. DQkp = DQKP_highspeed;
  597. DQki = DQKI_highspeed;
  598. }
  599. Skp_1 = PI0_KP;
  600. Ski_1 = PI0_KI;
  601. if (Skp_1 < Skp)
  602. {
  603. Skp_1 += 2;
  604. }
  605. else if (Skp_1 > Skp)
  606. {
  607. Skp_1 -= 2;
  608. }
  609. if (Ski_1 < Ski)
  610. {
  611. Ski_1 += 2;
  612. }
  613. else if (Ski_1 > Ski)
  614. {
  615. Ski_1 -= 2;
  616. }
  617. PI0_KP = Skp_1;
  618. PI0_KI = Ski_1;
  619. DQkp_1 = FOC_QKP;
  620. DQki_1 = FOC_QKI;
  621. if (DQkp_1 < DQkp)
  622. {
  623. DQkp_1 += 2;
  624. }
  625. else if (DQkp_1 > DQkp)
  626. {
  627. DQkp_1 -= 2;
  628. }
  629. if (DQki_1 < DQki)
  630. {
  631. DQki_1 += 2;
  632. }
  633. else if (DQki_1 > DQki)
  634. {
  635. DQki_1 -= 2;
  636. }
  637. FOC_DKP = DQkp_1;
  638. FOC_DKI = DQki_1;
  639. FOC_QKP = DQkp_1;
  640. FOC_QKI = DQki_1;
  641. }
  642. /*温度计算*/
  643. void Temp_jisuan(void)
  644. {
  645. mcFocCtrl.IPMtemp = IPM_RealTemp(AdcSampleValue.ADC_IPM_temp >> 3); //IPM温度计算
  646. }
  647. uint16 AimFrequencyMaxVAC = 500;
  648. /*指令获取*/
  649. void Control_Cmd(void)
  650. {
  651. if (Time.PowerOnCnt >= 2000)
  652. {
  653. //压机指令获取
  654. if (ConTrolCmd.yajispeed > 300)
  655. {
  656. mcSpeedRamp.FlagONOFF = 1;
  657. }
  658. else
  659. {
  660. mcSpeedRamp.TargetValue = 0;
  661. mcSpeedRamp.FlagONOFF = 0;
  662. mcProtectTime.CurrentPretectTimes = 0;
  663. mcProtectTime.SecondStartTimes = 0;
  664. mcProtectTime.StallTimes = 0;
  665. mcProtectTime.LossPHTimes = 0;
  666. mcProtectTime.IbusOffsetProtectTimes = 0;
  667. }
  668. //4通阀指令获取 WAY4
  669. // WAY4=ConTrolCmd.sitongfa;
  670. //电加热
  671. // DJR=ConTrolCmd.dianjiare;
  672. //室外风机
  673. ConTrolCmd.fengjispeed;
  674. //电子膨胀阀开度获取
  675. ConTrolCmd.dianzifakaidu ;
  676. }
  677. else
  678. {
  679. mcSpeedRamp.TargetValue = 0;
  680. mcSpeedRamp.FlagONOFF = 0;
  681. ConTrolCmd.fengjispeed = 0;
  682. // WAY4 = 0;
  683. }
  684. // AimFrequencyMaxVAC=VAC_Frequency_Max()*6;
  685. if (ConTrolCmd.yajispeed > Motor_Max_Speed) //限制最高转速
  686. {
  687. ConTrolCmd.yajispeed = Motor_Max_Speed;
  688. }
  689. //压机闭环目标转速
  690. mcSpeedRamp.TargetValue = S_Value(ConTrolCmd.yajispeed);
  691. if ((mcSpeedRamp.TargetValue <= Motor_Min_Speed) && (mcSpeedRamp.FlagONOFF == 1))
  692. {
  693. mcSpeedRamp.TargetValue = Motor_Min_Speed;
  694. }
  695. }
  696. #if (Debugg==1)
  697. void Trace_Select_read(void) //需要放载波函数里面
  698. {
  699. GPFCON1 = PFC__IAC;
  700. GPFCON2 = PFC__UAC;
  701. GPFCON3 = FOC__IA;//FOC__IA;
  702. GPFCON4 = FOC__IB;//FOC__IB;
  703. GPFCON5 = mcFocCtrl.mcDcbusFlt;
  704. GPFCON6 = mcFocCtrl.Powerlpf;
  705. GPFCON7 = mcFocCtrl.IDQFlt;
  706. // GPFCON9 = mcFocCtrl.SpeedFlt;
  707. GPFCON10 = mcFocCtrl.IPMtemp;
  708. }
  709. void Trace_Select_write(void) //需要放主函数里面
  710. {
  711. if (mcFaultDect.commu_time >= 6000)
  712. {
  713. ConTrolCmd.yajispeed = GPFCON8;
  714. s2_cvcf_i_set = GPFCON9;
  715. }
  716. }
  717. #endif
  718. void IsLimit_Over_tect(void)
  719. {
  720. // if(mcIimit.flag==0||mcIimit.flag==3)
  721. // {
  722. // if((mcFocCtrl.Powerlpf>P_OVER)||(mcFocCtrl.IDQFlt>I_OVER))
  723. // {
  724. // mcIimit.mcIDQtime3=0;
  725. // if (mcIimit.mcIDQtime1 < 50)
  726. // {
  727. // mcIimit.mcIDQtime1++;
  728. // }
  729. // else
  730. // {
  731. // mcIimit.flag=1;
  732. // }
  733. // }
  734. // }
  735. // if(mcIimit.flag==1)
  736. // {
  737. // if((mcFocCtrl.Powerlpf<P_LIMIT)||(mcFocCtrl.IDQFlt<I_LIMIT))
  738. // {
  739. // mcIimit.mcIDQtime1=0;
  740. // if (mcIimit.mcIDQtime2 < 50)
  741. // {
  742. // mcIimit.mcIDQtime2++;
  743. // }
  744. // else
  745. // {
  746. // mcIimit.flag=2;
  747. // }
  748. // }
  749. // mcIimit.mcIDQtime4++;
  750. // if(mcIimit.mcIDQtime4>=45000)
  751. // {
  752. // mcIimit.flag=2;
  753. // mcIimit.mcIDQtime4=0;
  754. // }
  755. // }
  756. // if(mcIimit.flag==2)
  757. // {
  758. // mcIimit.mcIDQtime2=0;
  759. // if (mcIimit.mcIDQtime3 < 10000)
  760. // {
  761. // mcIimit.mcIDQtime3++;
  762. // }
  763. // else
  764. // {
  765. // mcIimit.flag=3;
  766. // }
  767. // }
  768. ////IIIIII
  769. if (mcIimit.flag == 0 || mcIimit.flag == 3)
  770. {
  771. if ((mcFocCtrl.IDQFlt > I_OVER))
  772. {
  773. mcIimit.mcIDQtime3 = 0;
  774. if (mcIimit.mcIDQtime1 < 50)
  775. {
  776. mcIimit.mcIDQtime1++;
  777. }
  778. else
  779. {
  780. mcIimit.flag = 1;
  781. }
  782. }
  783. }
  784. if (mcIimit.flag == 1)
  785. {
  786. if ((mcFocCtrl.IDQFlt < I_LIMIT))
  787. {
  788. mcIimit.mcIDQtime1 = 0;
  789. if (mcIimit.mcIDQtime2 < 50)
  790. {
  791. mcIimit.mcIDQtime2++;
  792. }
  793. else
  794. {
  795. mcIimit.flag = 2;
  796. }
  797. }
  798. mcIimit.mcIDQtime4++;
  799. if (mcIimit.mcIDQtime4 >= 45000)
  800. {
  801. mcIimit.flag = 2;
  802. mcIimit.mcIDQtime4 = 0;
  803. }
  804. }
  805. if (mcIimit.flag == 2)
  806. {
  807. mcIimit.mcIDQtime2 = 0;
  808. if (mcIimit.mcIDQtime3 < 10000)
  809. {
  810. mcIimit.mcIDQtime3++;
  811. }
  812. else
  813. {
  814. mcIimit.flag = 3;
  815. }
  816. }
  817. //PPPPPP
  818. if (mcIimit.Pflag == 0 || mcIimit.Pflag == 3)
  819. {
  820. if ((mcFocCtrl.Powerlpf > P_OVER))
  821. {
  822. mcIimit.mcPtime3 = 0;
  823. if (mcIimit.mcPtime1 < 50)
  824. {
  825. mcIimit.mcPtime1++;
  826. }
  827. else
  828. {
  829. mcIimit.Pflag = 1;
  830. }
  831. }
  832. }
  833. if (mcIimit.Pflag == 1)
  834. {
  835. if ((mcFocCtrl.Powerlpf < P_LIMIT))
  836. {
  837. mcIimit.mcPtime1 = 0;
  838. if (mcIimit.mcPtime2 < 50)
  839. {
  840. mcIimit.mcPtime2++;
  841. }
  842. else
  843. {
  844. mcIimit.Pflag = 2;
  845. }
  846. }
  847. mcIimit.mcPtime4++;
  848. if (mcIimit.mcPtime4 >= 45000)
  849. {
  850. mcIimit.Pflag = 2;
  851. mcIimit.mcPtime4 = 0;
  852. }
  853. }
  854. if (mcIimit.Pflag == 2)
  855. {
  856. mcIimit.mcPtime2 = 0;
  857. if (mcIimit.mcPtime3 < 10000)
  858. {
  859. mcIimit.mcPtime3++;
  860. }
  861. else
  862. {
  863. mcIimit.Pflag = 3;
  864. }
  865. }
  866. }
  867. void IsLimit_Over_deal(void)
  868. {
  869. if ((mcIimit.flag == 1) || mcIimit.Pflag == 1)
  870. {
  871. mcSpeedRamp.TargetValue = _Q15(1800 / MOTOR_SPEED_BASE);
  872. }
  873. else if ((mcIimit.flag == 2) || (mcIimit.Pflag == 2))
  874. {
  875. mcSpeedRamp.TargetValue = mcSpeedRamp.ActualValue;
  876. }
  877. }
  878. uint16 VAC_Frequency_Max(void)
  879. {
  880. static int16 Limit_Fre_Max = 0, VAC_last = 32765, VAC_chazhi = 0;
  881. VAC_chazhi = VAC_last - mcFocCtrl.mcAcbusFlt;
  882. if ((VAC_chazhi > _Q15(7.0 / HW_BOARD_ACVOLT_MAX)) || (VAC_chazhi < (_Q15(-7.0 / HW_BOARD_ACVOLT_MAX))) || (mcFocCtrl.mcAcbustime > 10000))
  883. {
  884. if (mcFocCtrl.mcAcbusFlt <= VAC_Min)
  885. {
  886. Limit_Fre_Max = VAC_Min_F;
  887. }
  888. else if (mcFocCtrl.mcAcbusFlt <= VAC_Max)
  889. {
  890. Limit_Fre_Max = VAC_Min_F + (int16)(VAC_Max_K * (mcFocCtrl.mcAcbusFlt - VAC_Min));
  891. }
  892. else
  893. {
  894. Limit_Fre_Max = VAC_Max_F ;
  895. }
  896. VAC_last = mcFocCtrl.mcAcbusFlt;
  897. mcFocCtrl.mcAcbustime = 0;
  898. }
  899. return Limit_Fre_Max;
  900. }