AddFunction.c 10 KB

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