AddFunction.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. #include <Myproject.h>
  2. extern uint16 SKI1, SKP1;
  3. /* Private variables ---------------------------------------------------------*/
  4. PWMINPUTCAL xdata mcPwmInput;
  5. CurrentVarible xdata mcCurVarible;
  6. FOCCTRL xdata mcFocCtrl;
  7. ILIMIT xdata mcIimit;
  8. MCRAMP xdata mcSpeedRamp;
  9. CONTROLCMDD xdata ConTrolCmd;
  10. int16 Huan_temp = 0, Guan_temp = 0, Paiqi_temp = 0;
  11. int16 qiangtujiaodu = 0;
  12. #if (Debugg==1)
  13. extern int16 xdata GPFCON1, GPFCON2, GPFCON3, GPFCON4, GPFCON5, GPFCON6, GPFCON7, GPFCON8, GPFCON9, GPFCON10;
  14. #endif
  15. void FaultProcess(void)
  16. {
  17. PRE_DRIVER_RST = 0;
  18. ClrBit(DRV_CR, FOCEN);
  19. MOE = 0;
  20. }
  21. /*---------------------------------------------------------------------------*/
  22. /* Name : int32 Abs_F32(int32 value)
  23. /* Input : value
  24. /* Output : int16
  25. /* Description: 对变量取16位的绝对值
  26. /*---------------------------------------------------------------------------*/
  27. uint32 Abs_F32(int32 value)
  28. {
  29. if (value < 0)
  30. {
  31. return (-value);
  32. }
  33. else
  34. {
  35. return (value);
  36. }
  37. }
  38. /*****转矩补偿和无转矩补偿时过流值设置*****/
  39. void DCOvercurrentValue(void)
  40. {
  41. static uint8 DAC_Value, DAC_Value2;
  42. DAC_Value = DAC_OvercurrentValue;
  43. DAC_Value2 = DAC0_DR;
  44. if (DAC_Value < DAC_Value2)
  45. {
  46. DAC_Value2 -= 1;
  47. }
  48. else if (DAC_Value > DAC_Value2)
  49. {
  50. DAC_Value2 += 1;
  51. }
  52. if (DAC_Value2 < 255)
  53. {
  54. DAC0_DR = (uint8)DAC_Value2;
  55. }
  56. else
  57. {
  58. DAC0_DR = 255;
  59. }
  60. }
  61. /*---------------------------------------------------------------------------*/
  62. /* Name : void Speed_response(void)
  63. /* Input : NO
  64. /* Output : NO
  65. /* Description: 速度响应函数,可根据需求加入控制环,如恒转矩控制、恒转速控制、恒功率控制
  66. /*---------------------------------------------------------------------------*/
  67. void Speed_response(void)
  68. {
  69. static uint8 Start_CNT = 0;
  70. if ((mcState == mcRun) || (mcState == mcStop))
  71. {
  72. if (mcFocCtrl.RunStateCnt < MotorStartHoldTime) // MotorStartHoldTime目标转速为启动转速
  73. {
  74. mcSpeedRamp.IncValue = SpeedRampStartInc;
  75. mcFocCtrl.RunStateCnt++;
  76. if (isCtrlPowOn)
  77. {
  78. motorControl.TargetRef = Motor_Start_Hold_Speed; //上油时间内维持上油转速
  79. }
  80. else
  81. {
  82. motorControl.TargetRef = 0;
  83. mcSpeedRamp.DecValue = Motor_Speed_Dec1;
  84. }
  85. }
  86. else //如果达到上油转速后,将起动速度环增量变为运行速度环增量
  87. {
  88. Current_Speed_PI();
  89. DCOvercurrentValue();
  90. mcSpeedRamp.IncValue = Motor_Speed_Inc;
  91. if ((!isCtrlPowOn) || (motorControl.TargetRef == 0))
  92. {
  93. mcSpeedRamp.DecValue = Motor_Speed_Dec1;
  94. }
  95. else
  96. {
  97. mcSpeedRamp.DecValue = Motor_Speed_Dec;
  98. }
  99. }
  100. switch (mcFocCtrl.CtrlMode)
  101. {
  102. case 0:
  103. {
  104. if (mcFocCtrl.SpeedFlt > MOTOR_LOOP_RPM)
  105. {
  106. if (Start_CNT < 15)
  107. {
  108. Start_CNT ++;
  109. }
  110. else
  111. {
  112. mcFocCtrl.CtrlMode = 1;
  113. Start_CNT = 0;
  114. #if (LOOP_MODE == SPEED_CONTROL_MODE)
  115. mcSpeedRamp.ActualValue = mcFocCtrl.SpeedFlt + _Q15(150 / MOTOR_SPEED_BASE);
  116. #endif
  117. mcFocCtrl.LoopTime = SPEED_LOOP_TIME;
  118. mcFocCtrl.IND_DEC_LoopTime = SPEED_INC_DEC_TIME;
  119. PI0_UKH = mcFocCtrl.mcIqref;
  120. mcFocCtrl.IsRef = mcFocCtrl.mcIqref;
  121. }
  122. }
  123. }
  124. break;
  125. case 1:
  126. {
  127. // IsLimit_Over_deal();
  128. mcFocCtrl.LoopTime++;
  129. mcFocCtrl.IND_DEC_LoopTime++;
  130. if (mcFocCtrl.IND_DEC_LoopTime > SPEED_INC_DEC_TIME)
  131. {
  132. mc_ramp(&mcSpeedRamp);
  133. mcFocCtrl.IND_DEC_LoopTime = 0;
  134. }
  135. if (mcFocCtrl.LoopTime > SPEED_LOOP_TIME)
  136. {
  137. #if (OUT_LOOP_CONTROL)
  138. {
  139. #if (LOOP_MODE == SPEED_CONTROL_MODE)
  140. mcFocCtrl.IsRef = HW_Zero_Calc(mcSpeedRamp.ActualValue - mcFocCtrl.SpeedFlt);
  141. #endif
  142. STT_FOC_THECOMP_CLEAR();
  143. }
  144. #else
  145. {
  146. mcFocCtrl.mcIqref = FOC_IQREF;
  147. if (FOC_IQREF < mcFocCtrl.QoutValue)
  148. {
  149. mcFocCtrl.mcIqref += QOUTINC;
  150. if (mcFocCtrl.mcIqref > mcFocCtrl.QoutValue)
  151. { mcFocCtrl.mcIqref = mcFocCtrl.QoutValue; }
  152. FOC_IQREF = mcFocCtrl.mcIqref;
  153. }
  154. else if (FOC_IQREF > mcFocCtrl.QoutValue)
  155. {
  156. mcFocCtrl.mcIqref -= QOUTINC;
  157. if (mcFocCtrl.mcIqref < mcFocCtrl.QoutValue)
  158. { mcFocCtrl.mcIqref = mcFocCtrl.QoutValue; }
  159. FOC_IQREF = mcFocCtrl.mcIqref;
  160. }
  161. }
  162. #endif
  163. mcFocCtrl.LoopTime = 0;
  164. }
  165. }
  166. break;
  167. }
  168. }
  169. }
  170. /*角度补偿清零*/
  171. void STT_FOC_THECOMP_CLEAR(void)
  172. {
  173. mcFocCtrl.foc_comp_temp = mcFocCtrl.STT_FOC_THECOMP;
  174. if (mcFocCtrl.foc_comp_temp < 0)
  175. {
  176. mcFocCtrl.foc_comp_temp++;
  177. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  178. }
  179. else if (mcFocCtrl.foc_comp_temp > 0)
  180. {
  181. mcFocCtrl.foc_comp_temp--;
  182. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  183. }
  184. else
  185. {
  186. mcFocCtrl.foc_comp_temp = 0;
  187. mcFocCtrl.STT_FOC_THECOMP = 0;
  188. }
  189. FOC_THECOMP = mcFocCtrl.STT_FOC_THECOMP;
  190. }
  191. /*---------------------------------------------------------------------------*/
  192. /* Name : void mc_ramp(void)
  193. /* Input : hTarget,MC_RAMP *hSpeedramp
  194. /* Output : NO
  195. /* Description:
  196. /*---------------------------------------------------------------------------*/
  197. void mc_ramp(MCRAMP * hSpeedramp)
  198. {
  199. if (hSpeedramp->ActualValue < hSpeedramp->TargetValue)
  200. {
  201. if (hSpeedramp->ActualValue + hSpeedramp->IncValue < hSpeedramp->TargetValue)
  202. {
  203. hSpeedramp->ActualValue += hSpeedramp->IncValue;
  204. }
  205. else
  206. {
  207. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  208. }
  209. }
  210. else
  211. {
  212. if (hSpeedramp->ActualValue - hSpeedramp->DecValue > hSpeedramp->TargetValue)
  213. {
  214. hSpeedramp->ActualValue -= hSpeedramp->DecValue;
  215. }
  216. else
  217. {
  218. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  219. }
  220. }
  221. }
  222. /*---------------------------------------------------------------------------*/
  223. /* Name : void StarRampDealwith(void)
  224. /* Input : NO
  225. /* Output : NO
  226. /* Description:
  227. /*---------------------------------------------------------------------------*/
  228. void StarRampDealwith(void)
  229. {
  230. if ((mcState == mcRun) || (mcState == mcStart))
  231. {
  232. if ((mcFocCtrl.CtrlMode == 0) || (mcFocCtrl.State_Count > 10))
  233. {
  234. if (mcFocCtrl.iiqq <= IQ_Start_CURRENT2)
  235. {mcFocCtrl.iiqq = mcFocCtrl.iiqq + 2;}
  236. FOC_IQREF = mcFocCtrl.iiqq;
  237. }
  238. if (mcFocCtrl.State_Count == 1200) //2300
  239. {
  240. FOC_EKP = OBSW_KP_GAIN_RUN; // 估算器里的PI的KP
  241. FOC_EKI = OBSW_KI_GAIN_RUN; // 估算器里的PI的KI
  242. #if (EstimateAlgorithm == PLL)
  243. {
  244. FOC_KSLIDE = OBSE_PLLKP_GAIN2;
  245. FOC_EKLPFMIN = OBSE_PLLKI_GAIN2;
  246. }
  247. #endif
  248. }
  249. else if (mcFocCtrl.State_Count == 1000) //2000
  250. {
  251. FOC_EKP = OBSW_KP_GAIN_RUN1; // 估算器里的PI的KP
  252. FOC_EKI = OBSW_KI_GAIN_RUN1; // 估算器里的PI的KI
  253. #if (EstimateAlgorithm == PLL)
  254. {
  255. FOC_KSLIDE = OBSE_PLLKP_GAIN3;
  256. FOC_EKLPFMIN = OBSE_PLLKI_GAIN3;
  257. }
  258. #endif
  259. }
  260. else if (mcFocCtrl.State_Count == 600) //1600
  261. {
  262. FOC_EKP = OBSW_KP_GAIN_RUN2; // 估算器里的PI的KP
  263. FOC_EKI = OBSW_KI_GAIN_RUN2; // 估算器里的PI的KI
  264. #if (EstimateAlgorithm == PLL)
  265. {
  266. FOC_KSLIDE = OBSE_PLLKP_GAIN4;
  267. FOC_EKLPFMIN = OBSE_PLLKI_GAIN4;
  268. }
  269. #endif
  270. }
  271. else if (mcFocCtrl.State_Count == 400) //1200
  272. {
  273. FOC_EKP = OBSW_KP_GAIN_RUN3; // 估算器里的PI的KP
  274. FOC_EKI = OBSW_KI_GAIN_RUN3; // 估算器里的PI的KI
  275. #if (EstimateAlgorithm == PLL)
  276. {
  277. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  278. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  279. }
  280. #endif
  281. }
  282. else if (mcFocCtrl.State_Count == 300)
  283. {
  284. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  285. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  286. #if (EstimateAlgorithm == PLL)
  287. {
  288. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  289. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  290. }
  291. #endif
  292. }
  293. }
  294. }
  295. /*PI参数分段处理*/
  296. void Current_Speed_PI(void)
  297. {
  298. static int16 Skp, Ski, DQkp, DQki;
  299. static int16 Skp_1, Ski_1, DQkp_1, DQki_1;
  300. if (mcFocCtrl.SpeedFlt < _Q15(2000 / MOTOR_SPEED_BASE))
  301. {
  302. Skp = SKPRun;
  303. Ski = SKIRun;
  304. DQkp = DQKP;
  305. DQki = DQKI;
  306. }
  307. else if (mcFocCtrl.SpeedFlt < _Q15(4200 / MOTOR_SPEED_BASE))
  308. {
  309. Skp = SKPRun1;
  310. Ski = SKIRun1;
  311. DQkp = DQKP_zhong;
  312. DQki = DQKI_zhong;
  313. }
  314. else if (mcFocCtrl.SpeedFlt > _Q15(4700 / MOTOR_SPEED_BASE))
  315. {
  316. Skp = SKPRun2;
  317. Ski = SKIRun2;
  318. DQkp = DQKP_highspeed;
  319. DQki = DQKI_highspeed;
  320. }
  321. Skp_1 = PI0_KP;
  322. Ski_1 = PI0_KI;
  323. if (Skp_1 < Skp)
  324. {
  325. Skp_1 += 2;
  326. }
  327. else if (Skp_1 > Skp)
  328. {
  329. Skp_1 -= 2;
  330. }
  331. if (Ski_1 < Ski)
  332. {
  333. Ski_1 += 2;
  334. }
  335. else if (Ski_1 > Ski)
  336. {
  337. Ski_1 -= 2;
  338. }
  339. PI0_KP = Skp_1;
  340. PI0_KI = Ski_1;
  341. DQkp_1 = FOC_QKP;
  342. DQki_1 = FOC_QKI;
  343. if (DQkp_1 < DQkp)
  344. {
  345. DQkp_1 += 2;
  346. }
  347. else if (DQkp_1 > DQkp)
  348. {
  349. DQkp_1 -= 2;
  350. }
  351. if (DQki_1 < DQki)
  352. {
  353. DQki_1 += 2;
  354. }
  355. else if (DQki_1 > DQki)
  356. {
  357. DQki_1 -= 2;
  358. }
  359. FOC_DKP = DQkp_1;
  360. FOC_DKI = DQki_1;
  361. FOC_QKP = DQkp_1;
  362. FOC_QKI = DQki_1;
  363. }
  364. uint16 AimFrequencyMaxVAC = 500;
  365. void IsLimit_Over_tect(void)
  366. {
  367. if (mcIimit.flag == 0 || mcIimit.flag == 3)
  368. {
  369. if ((mcFocCtrl.IDQFlt > I_OVER))
  370. {
  371. mcIimit.mcIDQtime3 = 0;
  372. if (mcIimit.mcIDQtime1 < 50)
  373. {
  374. mcIimit.mcIDQtime1++;
  375. }
  376. else
  377. {
  378. mcIimit.flag = 1;
  379. }
  380. }
  381. }
  382. if (mcIimit.flag == 1)
  383. {
  384. if ((mcFocCtrl.IDQFlt < I_LIMIT))
  385. {
  386. mcIimit.mcIDQtime1 = 0;
  387. if (mcIimit.mcIDQtime2 < 50)
  388. {
  389. mcIimit.mcIDQtime2++;
  390. }
  391. else
  392. {
  393. mcIimit.flag = 2;
  394. }
  395. }
  396. mcIimit.mcIDQtime4++;
  397. if (mcIimit.mcIDQtime4 >= 45000)
  398. {
  399. mcIimit.flag = 2;
  400. mcIimit.mcIDQtime4 = 0;
  401. }
  402. }
  403. if (mcIimit.flag == 2)
  404. {
  405. mcIimit.mcIDQtime2 = 0;
  406. if (mcIimit.mcIDQtime3 < 10000)
  407. {
  408. mcIimit.mcIDQtime3++;
  409. }
  410. else
  411. {
  412. mcIimit.flag = 3;
  413. }
  414. }
  415. //PPPPPP
  416. if (mcIimit.Pflag == 0 || mcIimit.Pflag == 3)
  417. {
  418. if ((mcFocCtrl.Powerlpf > P_OVER))
  419. {
  420. mcIimit.mcPtime3 = 0;
  421. if (mcIimit.mcPtime1 < 50)
  422. {
  423. mcIimit.mcPtime1++;
  424. }
  425. else
  426. {
  427. mcIimit.Pflag = 1;
  428. }
  429. }
  430. }
  431. if (mcIimit.Pflag == 1)
  432. {
  433. if ((mcFocCtrl.Powerlpf < P_LIMIT))
  434. {
  435. mcIimit.mcPtime1 = 0;
  436. if (mcIimit.mcPtime2 < 50)
  437. {
  438. mcIimit.mcPtime2++;
  439. }
  440. else
  441. {
  442. mcIimit.Pflag = 2;
  443. }
  444. }
  445. mcIimit.mcPtime4++;
  446. if (mcIimit.mcPtime4 >= 45000)
  447. {
  448. mcIimit.Pflag = 2;
  449. mcIimit.mcPtime4 = 0;
  450. }
  451. }
  452. if (mcIimit.Pflag == 2)
  453. {
  454. mcIimit.mcPtime2 = 0;
  455. if (mcIimit.mcPtime3 < 10000)
  456. {
  457. mcIimit.mcPtime3++;
  458. }
  459. else
  460. {
  461. mcIimit.Pflag = 3;
  462. }
  463. }
  464. }
  465. void IsLimit_Over_deal(void)
  466. {
  467. if ((mcIimit.flag == 1) || mcIimit.Pflag == 1)
  468. {
  469. motorControl.TargetRef = _Q15(1800 / MOTOR_SPEED_BASE);
  470. }
  471. else if ((mcIimit.flag == 2) || (mcIimit.Pflag == 2))
  472. {
  473. motorControl.TargetRef = mcSpeedRamp.ActualValue;
  474. }
  475. }
  476. uint16 VAC_Frequency_Max(void)
  477. {
  478. static int16 Limit_Fre_Max = 0, VAC_last = 32765, VAC_chazhi = 0;
  479. VAC_chazhi = VAC_last - mcFocCtrl.mcAcbusFlt;
  480. if ((VAC_chazhi > _Q15(7.0 / HW_BOARD_ACVOLT_MAX)) || (VAC_chazhi < (_Q15(-7.0 / HW_BOARD_ACVOLT_MAX))) || (mcFocCtrl.mcAcbustime > 10000))
  481. {
  482. if (mcFocCtrl.mcAcbusFlt <= VAC_Min)
  483. {
  484. Limit_Fre_Max = VAC_Min_F;
  485. }
  486. else if (mcFocCtrl.mcAcbusFlt <= VAC_Max)
  487. {
  488. Limit_Fre_Max = VAC_Min_F + (int16)(VAC_Max_K * (mcFocCtrl.mcAcbusFlt - VAC_Min));
  489. }
  490. else
  491. {
  492. Limit_Fre_Max = VAC_Max_F ;
  493. }
  494. VAC_last = mcFocCtrl.mcAcbusFlt;
  495. mcFocCtrl.mcAcbustime = 0;
  496. }
  497. return Limit_Fre_Max;
  498. }