AddFunction.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  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. }
  253. break;
  254. }
  255. }
  256. }
  257. void main_ms(void)
  258. {
  259. SetBit(ADC_CR, ADCBSY); //使能ADC的DCBUS采样
  260. // while(ReadBit(ADC_CR , ADCBSY));
  261. /****速度滤波、反电动势滤波*****/
  262. if ((mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
  263. {
  264. // SqrtU_alpbet(FOC__UD,FOC__UQ,mcFocCtrl.VDQ);//
  265. mcFocCtrl.BEmf = LPF_realize1(FOC__EMF, mcFocCtrl.BEmf, LPF_K(5.0)); //反电动势滤波
  266. mcFocCtrl.Powerlpf = LPF_realize1(FOC__POW, mcFocCtrl.Powerlpf, LPF_K(1.0)); //功率滤波
  267. mcFocCtrl.IDQFlt = LPF_realize1(mcCurVarible.Max_is, mcFocCtrl.IDQFlt, LPF_K(1.0)); //反电动势滤波
  268. // mcFocCtrl.VDQFlt = LPF_realize1(mcFocCtrl.VDQ, mcFocCtrl.VDQFlt, LPF_K(5.0)); //反电动势滤波
  269. if (mcFocCtrl.Powerlpf <= 0)
  270. {mcFocCtrl.Powerlpf = 0;}
  271. }
  272. else
  273. {
  274. // mcFocCtrl.VDQFlt=0;
  275. mcFocCtrl.IDQFlt = 0;
  276. mcFocCtrl.BEmf = 0;
  277. mcFocCtrl.Powerlpf = 0;
  278. }
  279. /*****温度DCbus_AND_Ibus采样获取值并滤波******/
  280. AdcSampleValue.ADC_huan_temp = LPF_realize1(Huan_ADC, AdcSampleValue.ADC_huan_temp, LPF_K(20.0)); //环静温度
  281. AdcSampleValue.ADC_guan_temp = LPF_realize1(Guan_ADC, AdcSampleValue.ADC_guan_temp, LPF_K(20.0)); //盘管温度
  282. AdcSampleValue.ADC_paiqi_temp = LPF_realize1(Paiqi_ADC, AdcSampleValue.ADC_paiqi_temp, LPF_K(20.0)); //排气温度
  283. AdcSampleValue.ADC_IPM_temp = LPF_realize1(IPM_ADC, AdcSampleValue.ADC_IPM_temp, LPF_K(20.0)); //IPM温度
  284. mcFocCtrl.mcDcbusFlt = LPF_realize1(DCBUS_ADC, mcFocCtrl.mcDcbusFlt, LPF_K(5.0)); //母线电压滤波
  285. mcFocCtrl.mcAcbusFlt = LPF_realize1(mcFocCtrl.mcAcbus_max, mcFocCtrl.mcAcbusFlt, LPF_K(1.0)); //AC电压峰值滤波
  286. #if (IQCOMPENSATEENBLE)
  287. {
  288. TorquePeakK(mcFocCtrl.Powerlpf); //分段处理
  289. }
  290. #endif
  291. }
  292. /*---------------------------------------------------------------------------*/
  293. /* Name : void LED_Display(void)
  294. /* Input : NO
  295. /* Output : NO
  296. /* Description: LED灯显示
  297. /*---------------------------------------------------------------------------*/
  298. void LED_Display(void)
  299. {
  300. if (mcFaultSource == FaultNoSource)
  301. {
  302. ResetLEDPin; //低电平点亮,高电平灭
  303. }
  304. else
  305. {
  306. Led_OnOff(&mcLedDisplay, mcFaultSource);
  307. }
  308. }
  309. /*角度补偿清零*/
  310. void STT_FOC_THECOMP_CLEAR(void)
  311. {
  312. mcFocCtrl.foc_comp_temp = mcFocCtrl.STT_FOC_THECOMP;
  313. if (mcFocCtrl.foc_comp_temp < 0)
  314. {
  315. mcFocCtrl.foc_comp_temp++;
  316. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  317. }
  318. else if (mcFocCtrl.foc_comp_temp > 0)
  319. {
  320. mcFocCtrl.foc_comp_temp--;
  321. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  322. }
  323. else
  324. {
  325. mcFocCtrl.foc_comp_temp = 0;
  326. mcFocCtrl.STT_FOC_THECOMP = 0;
  327. }
  328. FOC_THECOMP = mcFocCtrl.STT_FOC_THECOMP;
  329. }
  330. //LED灯的闪烁
  331. void Led_OnOff(MCLedDisplay * hLedDisplay, uint8 htime)
  332. {
  333. hLedDisplay->LedCount++;
  334. if (hLedDisplay->LedCount < hLedDisplay->Counttime)
  335. {
  336. if (hLedDisplay->Count < 200)
  337. {
  338. hLedDisplay->Count++;
  339. }
  340. else if ((hLedDisplay->Count >= 200) && (hLedDisplay->Count < 201))
  341. {
  342. hLedDisplay->Count = 0;
  343. LEDPinONOFF;
  344. hLedDisplay->LedTimCot++;
  345. }
  346. if (hLedDisplay->LedTimCot >= 2 * htime)
  347. {
  348. hLedDisplay->Count = 202;
  349. SetLEDPin;
  350. }
  351. }
  352. else if (hLedDisplay->LedCount >= hLedDisplay->Counttime)
  353. {
  354. hLedDisplay->LedCount = 0;
  355. hLedDisplay->LedTimCot = 0;
  356. hLedDisplay->Count = 0;
  357. }
  358. }
  359. /*---------------------------------------------------------------------------*/
  360. /* Name : void mc_ramp(void)
  361. /* Input : hTarget,MC_RAMP *hSpeedramp
  362. /* Output : NO
  363. /* Description:
  364. /*---------------------------------------------------------------------------*/
  365. void mc_ramp(MCRAMP * hSpeedramp)
  366. {
  367. if (hSpeedramp->ActualValue < hSpeedramp->TargetValue)
  368. {
  369. if (hSpeedramp->ActualValue + hSpeedramp->IncValue < hSpeedramp->TargetValue)
  370. {
  371. hSpeedramp->ActualValue += hSpeedramp->IncValue;
  372. }
  373. else
  374. {
  375. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  376. }
  377. }
  378. else
  379. {
  380. if (hSpeedramp->ActualValue - hSpeedramp->DecValue > hSpeedramp->TargetValue)
  381. {
  382. hSpeedramp->ActualValue -= hSpeedramp->DecValue;
  383. }
  384. else
  385. {
  386. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  387. }
  388. }
  389. }
  390. /*---------------------------------------------------------------------------*/
  391. /* Name : void StarRampDealwith(void)
  392. /* Input : NO
  393. /* Output : NO
  394. /* Description:
  395. /*---------------------------------------------------------------------------*/
  396. void StarRampDealwith(void)
  397. {
  398. if ((mcState == mcRun) || (mcState == mcStart))
  399. {
  400. if ((mcFocCtrl.CtrlMode == 0) || (mcFocCtrl.State_Count > 10))
  401. {
  402. if (mcFocCtrl.iiqq <= IQ_Start_CURRENT2)
  403. {mcFocCtrl.iiqq = mcFocCtrl.iiqq + 2;}
  404. FOC_IQREF = mcFocCtrl.iiqq;
  405. }
  406. if (mcFocCtrl.State_Count == 1200) //2300
  407. {
  408. FOC_EKP = OBSW_KP_GAIN_RUN; // 估算器里的PI的KP
  409. FOC_EKI = OBSW_KI_GAIN_RUN; // 估算器里的PI的KI
  410. #if (EstimateAlgorithm == PLL)
  411. {
  412. FOC_KSLIDE = OBSE_PLLKP_GAIN2;
  413. FOC_EKLPFMIN = OBSE_PLLKI_GAIN2;
  414. }
  415. #endif
  416. }
  417. else if (mcFocCtrl.State_Count == 1000) //2000
  418. {
  419. FOC_EKP = OBSW_KP_GAIN_RUN1; // 估算器里的PI的KP
  420. FOC_EKI = OBSW_KI_GAIN_RUN1; // 估算器里的PI的KI
  421. #if (EstimateAlgorithm == PLL)
  422. {
  423. FOC_KSLIDE = OBSE_PLLKP_GAIN3;
  424. FOC_EKLPFMIN = OBSE_PLLKI_GAIN3;
  425. }
  426. #endif
  427. }
  428. else if (mcFocCtrl.State_Count == 600) //1600
  429. {
  430. FOC_EKP = OBSW_KP_GAIN_RUN2; // 估算器里的PI的KP
  431. FOC_EKI = OBSW_KI_GAIN_RUN2; // 估算器里的PI的KI
  432. #if (EstimateAlgorithm == PLL)
  433. {
  434. FOC_KSLIDE = OBSE_PLLKP_GAIN4;
  435. FOC_EKLPFMIN = OBSE_PLLKI_GAIN4;
  436. }
  437. #endif
  438. }
  439. else if (mcFocCtrl.State_Count == 400) //1200
  440. {
  441. FOC_EKP = OBSW_KP_GAIN_RUN3; // 估算器里的PI的KP
  442. FOC_EKI = OBSW_KI_GAIN_RUN3; // 估算器里的PI的KI
  443. #if (EstimateAlgorithm == PLL)
  444. {
  445. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  446. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  447. }
  448. #endif
  449. }
  450. else if (mcFocCtrl.State_Count == 300)
  451. {
  452. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  453. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  454. #if (EstimateAlgorithm == PLL)
  455. {
  456. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  457. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  458. }
  459. #endif
  460. }
  461. }
  462. }
  463. void MCTorqueControl(void)
  464. {
  465. }
  466. int16 idref = 0;
  467. void ID_IQ_Control(void)
  468. {
  469. #if (IFFDebugg==0)
  470. {
  471. if (mcFocCtrl.CtrlMode)
  472. {
  473. #if (IQCOMPENSATEENBLE==1)
  474. {
  475. FOC_IQREF = mcFocCtrl.IqRef + mcTorqueCompensation.TorqueCompensateIqCurrentValue;
  476. }
  477. #elif (IQCOMPENSATEENBLE==0)
  478. {
  479. FOC_IQREF = mcFocCtrl.IqRef;
  480. }
  481. #endif
  482. FOC_IDREF = mcFocCtrl.IdRef;
  483. }
  484. }
  485. #elif (IFFDebugg==1)
  486. {
  487. // iqfedback=FOC__IQ;
  488. // iqffff=FOC_IQREF;
  489. /*假负载测试*/
  490. if ((mcState == mcRun))
  491. {
  492. if (Time.PowerOnCnt >= 1500)
  493. {
  494. qiangtujiaodu += 1920;
  495. idref = idref + 1;
  496. if (idref >= s2_cvcf_i_set)
  497. {idref = s2_cvcf_i_set;}
  498. FOC__THETA = qiangtujiaodu;
  499. FOC_IQREF = idref;
  500. FOC_IDREF = 0;
  501. }
  502. else
  503. {
  504. FOC_IQREF = 0;
  505. FOC_IDREF = 0;
  506. }
  507. }
  508. }
  509. #endif
  510. }
  511. /*PI参数分段处理*/
  512. void Current_Speed_PI(void)
  513. {
  514. static int16 Skp, Ski, DQkp, DQki;
  515. static int16 Skp_1, Ski_1, DQkp_1, DQki_1;
  516. if (mcFocCtrl.SpeedFlt < _Q15(2000 / MOTOR_SPEED_BASE))
  517. {
  518. Skp = SKPRun;
  519. Ski = SKIRun;
  520. DQkp = DQKP;
  521. DQki = DQKI;
  522. }
  523. else if (mcFocCtrl.SpeedFlt < _Q15(4200 / MOTOR_SPEED_BASE))
  524. {
  525. Skp = SKPRun1;
  526. Ski = SKIRun1;
  527. // DQkp = _Q12(0.01 * SKP1);
  528. // DQki = _Q15(0.001 * SKI1);
  529. DQkp = DQKP_zhong;
  530. DQki = DQKI_zhong;
  531. }
  532. else if (mcFocCtrl.SpeedFlt > _Q15(4700 / MOTOR_SPEED_BASE))
  533. {
  534. Skp = SKPRun2;
  535. Ski = SKIRun2;
  536. DQkp = DQKP_highspeed;
  537. DQki = DQKI_highspeed;
  538. }
  539. Skp_1 = PI0_KP;
  540. Ski_1 = PI0_KI;
  541. if (Skp_1 < Skp)
  542. {
  543. Skp_1 += 2;
  544. }
  545. else if (Skp_1 > Skp)
  546. {
  547. Skp_1 -= 2;
  548. }
  549. if (Ski_1 < Ski)
  550. {
  551. Ski_1 += 2;
  552. }
  553. else if (Ski_1 > Ski)
  554. {
  555. Ski_1 -= 2;
  556. }
  557. PI0_KP = Skp_1;
  558. PI0_KI = Ski_1;
  559. DQkp_1 = FOC_QKP;
  560. DQki_1 = FOC_QKI;
  561. if (DQkp_1 < DQkp)
  562. {
  563. DQkp_1 += 2;
  564. }
  565. else if (DQkp_1 > DQkp)
  566. {
  567. DQkp_1 -= 2;
  568. }
  569. if (DQki_1 < DQki)
  570. {
  571. DQki_1 += 2;
  572. }
  573. else if (DQki_1 > DQki)
  574. {
  575. DQki_1 -= 2;
  576. }
  577. FOC_DKP = DQkp_1;
  578. FOC_DKI = DQki_1;
  579. FOC_QKP = DQkp_1;
  580. FOC_QKI = DQki_1;
  581. }
  582. uint16 AimFrequencyMaxVAC = 500;
  583. /*指令获取*/
  584. void Control_Cmd(void)
  585. {
  586. if (Time.PowerOnCnt >= 2000)
  587. {
  588. //压机指令获取
  589. if (ConTrolCmd.yajispeed > 300)
  590. {
  591. mcSpeedRamp.FlagONOFF = 1;
  592. }
  593. else
  594. {
  595. mcSpeedRamp.TargetValue = 0;
  596. mcSpeedRamp.FlagONOFF = 0;
  597. mcProtectTime.CurrentPretectTimes = 0;
  598. mcProtectTime.SecondStartTimes = 0;
  599. mcProtectTime.StallTimes = 0;
  600. mcProtectTime.LossPHTimes = 0;
  601. mcProtectTime.IbusOffsetProtectTimes = 0;
  602. }
  603. //4通阀指令获取 WAY4
  604. // WAY4=ConTrolCmd.sitongfa;
  605. //电加热
  606. // DJR=ConTrolCmd.dianjiare;
  607. //室外风机
  608. ConTrolCmd.fengjispeed;
  609. //电子膨胀阀开度获取
  610. ConTrolCmd.dianzifakaidu ;
  611. }
  612. else
  613. {
  614. mcSpeedRamp.TargetValue = 0;
  615. mcSpeedRamp.FlagONOFF = 0;
  616. ConTrolCmd.fengjispeed = 0;
  617. // WAY4 = 0;
  618. }
  619. // AimFrequencyMaxVAC=VAC_Frequency_Max()*6;
  620. if (ConTrolCmd.yajispeed > Motor_Max_Speed) //限制最高转速
  621. {
  622. ConTrolCmd.yajispeed = Motor_Max_Speed;
  623. }
  624. //压机闭环目标转速
  625. mcSpeedRamp.TargetValue = S_Value(ConTrolCmd.yajispeed);
  626. if ((mcSpeedRamp.TargetValue <= Motor_Min_Speed) && (mcSpeedRamp.FlagONOFF == 1))
  627. {
  628. mcSpeedRamp.TargetValue = Motor_Min_Speed;
  629. }
  630. }
  631. #if (Debugg==1)
  632. void Trace_Select_read(void) //需要放载波函数里面
  633. {
  634. GPFCON1 = PFC__IAC;
  635. GPFCON2 = PFC__UAC;
  636. GPFCON3 = FOC__IA;//FOC__IA;
  637. GPFCON4 = FOC__IB;//FOC__IB;
  638. GPFCON5 = mcFocCtrl.mcDcbusFlt;
  639. GPFCON6 = mcFocCtrl.Powerlpf;
  640. GPFCON7 = mcFocCtrl.IDQFlt;
  641. // GPFCON9 = mcFocCtrl.SpeedFlt;
  642. GPFCON10 = mcFocCtrl.IPMtemp;
  643. }
  644. void Trace_Select_write(void) //需要放主函数里面
  645. {
  646. if (mcFaultDect.commu_time >= 6000)
  647. {
  648. ConTrolCmd.yajispeed = GPFCON8;
  649. s2_cvcf_i_set = GPFCON9;
  650. }
  651. }
  652. #endif
  653. void IsLimit_Over_tect(void)
  654. {
  655. // if(mcIimit.flag==0||mcIimit.flag==3)
  656. // {
  657. // if((mcFocCtrl.Powerlpf>P_OVER)||(mcFocCtrl.IDQFlt>I_OVER))
  658. // {
  659. // mcIimit.mcIDQtime3=0;
  660. // if (mcIimit.mcIDQtime1 < 50)
  661. // {
  662. // mcIimit.mcIDQtime1++;
  663. // }
  664. // else
  665. // {
  666. // mcIimit.flag=1;
  667. // }
  668. // }
  669. // }
  670. // if(mcIimit.flag==1)
  671. // {
  672. // if((mcFocCtrl.Powerlpf<P_LIMIT)||(mcFocCtrl.IDQFlt<I_LIMIT))
  673. // {
  674. // mcIimit.mcIDQtime1=0;
  675. // if (mcIimit.mcIDQtime2 < 50)
  676. // {
  677. // mcIimit.mcIDQtime2++;
  678. // }
  679. // else
  680. // {
  681. // mcIimit.flag=2;
  682. // }
  683. // }
  684. // mcIimit.mcIDQtime4++;
  685. // if(mcIimit.mcIDQtime4>=45000)
  686. // {
  687. // mcIimit.flag=2;
  688. // mcIimit.mcIDQtime4=0;
  689. // }
  690. // }
  691. // if(mcIimit.flag==2)
  692. // {
  693. // mcIimit.mcIDQtime2=0;
  694. // if (mcIimit.mcIDQtime3 < 10000)
  695. // {
  696. // mcIimit.mcIDQtime3++;
  697. // }
  698. // else
  699. // {
  700. // mcIimit.flag=3;
  701. // }
  702. // }
  703. ////IIIIII
  704. if (mcIimit.flag == 0 || mcIimit.flag == 3)
  705. {
  706. if ((mcFocCtrl.IDQFlt > I_OVER))
  707. {
  708. mcIimit.mcIDQtime3 = 0;
  709. if (mcIimit.mcIDQtime1 < 50)
  710. {
  711. mcIimit.mcIDQtime1++;
  712. }
  713. else
  714. {
  715. mcIimit.flag = 1;
  716. }
  717. }
  718. }
  719. if (mcIimit.flag == 1)
  720. {
  721. if ((mcFocCtrl.IDQFlt < I_LIMIT))
  722. {
  723. mcIimit.mcIDQtime1 = 0;
  724. if (mcIimit.mcIDQtime2 < 50)
  725. {
  726. mcIimit.mcIDQtime2++;
  727. }
  728. else
  729. {
  730. mcIimit.flag = 2;
  731. }
  732. }
  733. mcIimit.mcIDQtime4++;
  734. if (mcIimit.mcIDQtime4 >= 45000)
  735. {
  736. mcIimit.flag = 2;
  737. mcIimit.mcIDQtime4 = 0;
  738. }
  739. }
  740. if (mcIimit.flag == 2)
  741. {
  742. mcIimit.mcIDQtime2 = 0;
  743. if (mcIimit.mcIDQtime3 < 10000)
  744. {
  745. mcIimit.mcIDQtime3++;
  746. }
  747. else
  748. {
  749. mcIimit.flag = 3;
  750. }
  751. }
  752. //PPPPPP
  753. if (mcIimit.Pflag == 0 || mcIimit.Pflag == 3)
  754. {
  755. if ((mcFocCtrl.Powerlpf > P_OVER))
  756. {
  757. mcIimit.mcPtime3 = 0;
  758. if (mcIimit.mcPtime1 < 50)
  759. {
  760. mcIimit.mcPtime1++;
  761. }
  762. else
  763. {
  764. mcIimit.Pflag = 1;
  765. }
  766. }
  767. }
  768. if (mcIimit.Pflag == 1)
  769. {
  770. if ((mcFocCtrl.Powerlpf < P_LIMIT))
  771. {
  772. mcIimit.mcPtime1 = 0;
  773. if (mcIimit.mcPtime2 < 50)
  774. {
  775. mcIimit.mcPtime2++;
  776. }
  777. else
  778. {
  779. mcIimit.Pflag = 2;
  780. }
  781. }
  782. mcIimit.mcPtime4++;
  783. if (mcIimit.mcPtime4 >= 45000)
  784. {
  785. mcIimit.Pflag = 2;
  786. mcIimit.mcPtime4 = 0;
  787. }
  788. }
  789. if (mcIimit.Pflag == 2)
  790. {
  791. mcIimit.mcPtime2 = 0;
  792. if (mcIimit.mcPtime3 < 10000)
  793. {
  794. mcIimit.mcPtime3++;
  795. }
  796. else
  797. {
  798. mcIimit.Pflag = 3;
  799. }
  800. }
  801. }
  802. void IsLimit_Over_deal(void)
  803. {
  804. if ((mcIimit.flag == 1) || mcIimit.Pflag == 1)
  805. {
  806. mcSpeedRamp.TargetValue = _Q15(1800 / MOTOR_SPEED_BASE);
  807. }
  808. else if ((mcIimit.flag == 2) || (mcIimit.Pflag == 2))
  809. {
  810. mcSpeedRamp.TargetValue = mcSpeedRamp.ActualValue;
  811. }
  812. }
  813. uint16 VAC_Frequency_Max(void)
  814. {
  815. static int16 Limit_Fre_Max = 0, VAC_last = 32765, VAC_chazhi = 0;
  816. VAC_chazhi = VAC_last - mcFocCtrl.mcAcbusFlt;
  817. if ((VAC_chazhi > _Q15(7.0 / HW_BOARD_ACVOLT_MAX)) || (VAC_chazhi < (_Q15(-7.0 / HW_BOARD_ACVOLT_MAX))) || (mcFocCtrl.mcAcbustime > 10000))
  818. {
  819. if (mcFocCtrl.mcAcbusFlt <= VAC_Min)
  820. {
  821. Limit_Fre_Max = VAC_Min_F;
  822. }
  823. else if (mcFocCtrl.mcAcbusFlt <= VAC_Max)
  824. {
  825. Limit_Fre_Max = VAC_Min_F + (int16)(VAC_Max_K * (mcFocCtrl.mcAcbusFlt - VAC_Min));
  826. }
  827. else
  828. {
  829. Limit_Fre_Max = VAC_Max_F ;
  830. }
  831. VAC_last = mcFocCtrl.mcAcbusFlt;
  832. mcFocCtrl.mcAcbustime = 0;
  833. }
  834. return Limit_Fre_Max;
  835. }