AddFunction.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #include <Myproject.h>
  2. extern uint16 SKI1, SKP1;
  3. CurrentVarible xdata mcCurVarible;
  4. FOCCTRL xdata mcFocCtrl;
  5. MCRAMP xdata mcSpeedRamp;
  6. void FaultProcess(void)
  7. {
  8. PRE_DRIVER_RST = 0;
  9. ClrBit(DRV_CR, FOCEN);
  10. MOE = 0;
  11. }
  12. /*---------------------------------------------------------------------------*/
  13. /* Name : int32 Abs_F32(int32 value)
  14. /* Input : value
  15. /* Output : int16
  16. /* Description: 对变量取16位的绝对值
  17. /*---------------------------------------------------------------------------*/
  18. uint32 Abs_F32(int32 value)
  19. {
  20. if (value < 0)
  21. {
  22. return (-value);
  23. }
  24. else
  25. {
  26. return (value);
  27. }
  28. }
  29. /*---------------------------------------------------------------------------*/
  30. /* Name : void Speed_response(void)
  31. /* Input : NO
  32. /* Output : NO
  33. /* Description: 速度响应函数,可根据需求加入控制环,如恒转矩控制、恒转速控制、恒功率控制
  34. /*---------------------------------------------------------------------------*/
  35. void Speed_response(void)
  36. {
  37. static uint8 Start_CNT = 0;
  38. if ((mcState == mcRun) || (mcState == mcStop))
  39. {
  40. if (mcFocCtrl.RunStateCnt < MotorStartHoldTime) // MotorStartHoldTime目标转速为启动转速
  41. {
  42. mcSpeedRamp.IncValue = SpeedRampStartInc;
  43. mcFocCtrl.RunStateCnt++;
  44. if (isCtrlPowOn)
  45. {
  46. motorControl.TargetRef = Motor_Start_Hold_Speed; //上油时间内维持上油转速
  47. }
  48. else
  49. {
  50. motorControl.TargetRef = 0;
  51. mcSpeedRamp.DecValue = Motor_Speed_Dec1;
  52. }
  53. }
  54. else //如果达到上油转速后,将起动速度环增量变为运行速度环增量
  55. {
  56. Current_Speed_PI();
  57. mcSpeedRamp.IncValue = Motor_Speed_Inc;
  58. if ((!isCtrlPowOn) || (motorControl.TargetRef == 0))
  59. {
  60. mcSpeedRamp.DecValue = Motor_Speed_Dec1;
  61. }
  62. else
  63. {
  64. mcSpeedRamp.DecValue = Motor_Speed_Dec;
  65. }
  66. }
  67. switch (mcFocCtrl.CtrlMode)
  68. {
  69. case 0:
  70. {
  71. if (motorControl.ActualSpeed > MOTOR_LOOP_RPM)
  72. {
  73. if (Start_CNT < 15)
  74. {
  75. Start_CNT ++;
  76. }
  77. else
  78. {
  79. mcFocCtrl.CtrlMode = 1;
  80. Start_CNT = 0;
  81. #if (LOOP_MODE == SPEED_CONTROL_MODE)
  82. mcSpeedRamp.ActualValue = motorControl.ActualSpeed + _Q15(150 / MOTOR_SPEED_BASE);
  83. #endif
  84. mcFocCtrl.LoopTime = SPEED_LOOP_TIME;
  85. mcFocCtrl.IND_DEC_LoopTime = SPEED_INC_DEC_TIME;
  86. PI0_UKH = mcFocCtrl.mcIqref;
  87. mcFocCtrl.IsRef = mcFocCtrl.mcIqref;
  88. }
  89. }
  90. }
  91. break;
  92. case 1:
  93. {
  94. mcFocCtrl.LoopTime++;
  95. mcFocCtrl.IND_DEC_LoopTime++;
  96. if (mcFocCtrl.IND_DEC_LoopTime > SPEED_INC_DEC_TIME)
  97. {
  98. mcSpeedRamp.TargetValue = motorControl.TargetRef;
  99. mc_ramp(&mcSpeedRamp);
  100. mcFocCtrl.IND_DEC_LoopTime = 0;
  101. }
  102. if (mcFocCtrl.LoopTime > SPEED_LOOP_TIME)
  103. {
  104. #if (OUT_LOOP_CONTROL)
  105. {
  106. #if (LOOP_MODE == SPEED_CONTROL_MODE)
  107. mcFocCtrl.IsRef = HW_Zero_Calc(mcSpeedRamp.ActualValue - motorControl.ActualSpeed);
  108. #endif
  109. STT_FOC_THECOMP_CLEAR();
  110. }
  111. #else
  112. {
  113. mcFocCtrl.mcIqref = FOC_IQREF;
  114. if (FOC_IQREF < motorControl.QOutRef)
  115. {
  116. mcFocCtrl.mcIqref += QOUTINC;
  117. if (mcFocCtrl.mcIqref > motorControl.QOutRef)
  118. { mcFocCtrl.mcIqref = motorControl.QOutRef; }
  119. FOC_IQREF = mcFocCtrl.mcIqref;
  120. }
  121. else if (FOC_IQREF > motorControl.QOutRef)
  122. {
  123. mcFocCtrl.mcIqref -= QOUTINC;
  124. if (mcFocCtrl.mcIqref < motorControl.QOutRef)
  125. { mcFocCtrl.mcIqref = motorControl.QOutRef; }
  126. FOC_IQREF = mcFocCtrl.mcIqref;
  127. }
  128. }
  129. #endif
  130. mcFocCtrl.LoopTime = 0;
  131. }
  132. }
  133. break;
  134. }
  135. }
  136. }
  137. /*角度补偿清零*/
  138. void STT_FOC_THECOMP_CLEAR(void)
  139. {
  140. mcFocCtrl.foc_comp_temp = mcFocCtrl.STT_FOC_THECOMP;
  141. if (mcFocCtrl.foc_comp_temp < 0)
  142. {
  143. mcFocCtrl.foc_comp_temp++;
  144. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  145. }
  146. else if (mcFocCtrl.foc_comp_temp > 0)
  147. {
  148. mcFocCtrl.foc_comp_temp--;
  149. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  150. }
  151. else
  152. {
  153. mcFocCtrl.foc_comp_temp = 0;
  154. mcFocCtrl.STT_FOC_THECOMP = 0;
  155. }
  156. FOC_THECOMP = mcFocCtrl.STT_FOC_THECOMP;
  157. }
  158. /*---------------------------------------------------------------------------*/
  159. /* Name : void mc_ramp(void)
  160. /* Input : hTarget,MC_RAMP *hSpeedramp
  161. /* Output : NO
  162. /* Description:
  163. /*---------------------------------------------------------------------------*/
  164. void mc_ramp(MCRAMP * hSpeedramp)
  165. {
  166. if (hSpeedramp->ActualValue < hSpeedramp->TargetValue)
  167. {
  168. if (hSpeedramp->ActualValue + hSpeedramp->IncValue < hSpeedramp->TargetValue)
  169. {
  170. hSpeedramp->ActualValue += hSpeedramp->IncValue;
  171. }
  172. else
  173. {
  174. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  175. }
  176. }
  177. else
  178. {
  179. if (hSpeedramp->ActualValue - hSpeedramp->DecValue > hSpeedramp->TargetValue)
  180. {
  181. hSpeedramp->ActualValue -= hSpeedramp->DecValue;
  182. }
  183. else
  184. {
  185. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  186. }
  187. }
  188. }
  189. /*---------------------------------------------------------------------------*/
  190. /* Name : void StarRampDealwith(void)
  191. /* Input : NO
  192. /* Output : NO
  193. /* Description:
  194. /*---------------------------------------------------------------------------*/
  195. void StarRampDealwith(void)
  196. {
  197. if ((mcState == mcRun) || (mcState == mcStart))
  198. {
  199. if ((mcFocCtrl.CtrlMode == 0) || (mcFocCtrl.State_Count > 10))
  200. {
  201. if (mcFocCtrl.iiqq <= IQ_Start_CURRENT2)
  202. {mcFocCtrl.iiqq = mcFocCtrl.iiqq + 2;}
  203. FOC_IQREF = mcFocCtrl.iiqq;
  204. }
  205. if (mcFocCtrl.State_Count == 1200) //2300
  206. {
  207. FOC_EKP = OBSW_KP_GAIN_RUN; // 估算器里的PI的KP
  208. FOC_EKI = OBSW_KI_GAIN_RUN; // 估算器里的PI的KI
  209. #if (EstimateAlgorithm == PLL)
  210. {
  211. FOC_KSLIDE = OBSE_PLLKP_GAIN2;
  212. FOC_EKLPFMIN = OBSE_PLLKI_GAIN2;
  213. }
  214. #endif
  215. }
  216. else if (mcFocCtrl.State_Count == 1000) //2000
  217. {
  218. FOC_EKP = OBSW_KP_GAIN_RUN1; // 估算器里的PI的KP
  219. FOC_EKI = OBSW_KI_GAIN_RUN1; // 估算器里的PI的KI
  220. #if (EstimateAlgorithm == PLL)
  221. {
  222. FOC_KSLIDE = OBSE_PLLKP_GAIN3;
  223. FOC_EKLPFMIN = OBSE_PLLKI_GAIN3;
  224. }
  225. #endif
  226. }
  227. else if (mcFocCtrl.State_Count == 600) //1600
  228. {
  229. FOC_EKP = OBSW_KP_GAIN_RUN2; // 估算器里的PI的KP
  230. FOC_EKI = OBSW_KI_GAIN_RUN2; // 估算器里的PI的KI
  231. #if (EstimateAlgorithm == PLL)
  232. {
  233. FOC_KSLIDE = OBSE_PLLKP_GAIN4;
  234. FOC_EKLPFMIN = OBSE_PLLKI_GAIN4;
  235. }
  236. #endif
  237. }
  238. else if (mcFocCtrl.State_Count == 400) //1200
  239. {
  240. FOC_EKP = OBSW_KP_GAIN_RUN3; // 估算器里的PI的KP
  241. FOC_EKI = OBSW_KI_GAIN_RUN3; // 估算器里的PI的KI
  242. #if (EstimateAlgorithm == PLL)
  243. {
  244. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  245. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  246. }
  247. #endif
  248. }
  249. else if (mcFocCtrl.State_Count == 300)
  250. {
  251. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  252. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  253. #if (EstimateAlgorithm == PLL)
  254. {
  255. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  256. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  257. }
  258. #endif
  259. }
  260. }
  261. }
  262. /*PI参数分段处理*/
  263. void Current_Speed_PI(void)
  264. {
  265. static int16 Skp, Ski, DQkp, DQki;
  266. static int16 Skp_1, Ski_1, DQkp_1, DQki_1;
  267. if (motorControl.ActualSpeed < _Q15(2000 / MOTOR_SPEED_BASE))
  268. {
  269. Skp = SKPRun;
  270. Ski = SKIRun;
  271. DQkp = DQKP;
  272. DQki = DQKI;
  273. }
  274. else if (motorControl.ActualSpeed < _Q15(4200 / MOTOR_SPEED_BASE))
  275. {
  276. Skp = SKPRun1;
  277. Ski = SKIRun1;
  278. DQkp = DQKP_zhong;
  279. DQki = DQKI_zhong;
  280. }
  281. else if (motorControl.ActualSpeed > _Q15(4700 / MOTOR_SPEED_BASE))
  282. {
  283. Skp = SKPRun2;
  284. Ski = SKIRun2;
  285. DQkp = DQKP_highspeed;
  286. DQki = DQKI_highspeed;
  287. }
  288. Skp_1 = PI0_KP;
  289. Ski_1 = PI0_KI;
  290. if (Skp_1 < Skp)
  291. {
  292. Skp_1 += 2;
  293. }
  294. else if (Skp_1 > Skp)
  295. {
  296. Skp_1 -= 2;
  297. }
  298. if (Ski_1 < Ski)
  299. {
  300. Ski_1 += 2;
  301. }
  302. else if (Ski_1 > Ski)
  303. {
  304. Ski_1 -= 2;
  305. }
  306. PI0_KP = Skp_1;
  307. PI0_KI = Ski_1;
  308. DQkp_1 = FOC_QKP;
  309. DQki_1 = FOC_QKI;
  310. if (DQkp_1 < DQkp)
  311. {
  312. DQkp_1 += 2;
  313. }
  314. else if (DQkp_1 > DQkp)
  315. {
  316. DQkp_1 -= 2;
  317. }
  318. if (DQki_1 < DQki)
  319. {
  320. DQki_1 += 2;
  321. }
  322. else if (DQki_1 > DQki)
  323. {
  324. DQki_1 -= 2;
  325. }
  326. FOC_DKP = DQkp_1;
  327. FOC_DKI = DQki_1;
  328. FOC_QKP = DQkp_1;
  329. FOC_QKI = DQki_1;
  330. }
  331. uint16 AimFrequencyMaxVAC = 500;