AddFunction.c 14 KB

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