AddFunction.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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. mcSpeedRamp.ActualValue = motorControl.TargetRef;
  102. if (mcFocCtrl.LoopTime > SPEED_LOOP_TIME)
  103. {
  104. #if (OUT_LOOP_CONTROL)
  105. {
  106. #if (LOOP_MODE == SPEED_CONTROL_MODE)
  107. FOC_IQREF = HW_Zero_Calc(mcSpeedRamp.ActualValue - motorControl.ActualSpeed);
  108. #endif
  109. }
  110. #else
  111. {
  112. FOC_IQREF = motorControl.QOutRef;
  113. }
  114. #endif
  115. mcFocCtrl.LoopTime = 0;
  116. }
  117. }
  118. break;
  119. }
  120. }
  121. }
  122. /*角度补偿清零*/
  123. void STT_FOC_THECOMP_CLEAR(void)
  124. {
  125. mcFocCtrl.foc_comp_temp = mcFocCtrl.STT_FOC_THECOMP;
  126. if (mcFocCtrl.foc_comp_temp < 0)
  127. {
  128. mcFocCtrl.foc_comp_temp++;
  129. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  130. }
  131. else if (mcFocCtrl.foc_comp_temp > 0)
  132. {
  133. mcFocCtrl.foc_comp_temp--;
  134. mcFocCtrl.STT_FOC_THECOMP = mcFocCtrl.foc_comp_temp;
  135. }
  136. else
  137. {
  138. mcFocCtrl.foc_comp_temp = 0;
  139. mcFocCtrl.STT_FOC_THECOMP = 0;
  140. }
  141. FOC_THECOMP = mcFocCtrl.STT_FOC_THECOMP;
  142. }
  143. /*---------------------------------------------------------------------------*/
  144. /* Name : void mc_ramp(void)
  145. /* Input : hTarget,MC_RAMP *hSpeedramp
  146. /* Output : NO
  147. /* Description:
  148. /*---------------------------------------------------------------------------*/
  149. void mc_ramp(MCRAMP * hSpeedramp)
  150. {
  151. if (hSpeedramp->ActualValue < hSpeedramp->TargetValue)
  152. {
  153. if (hSpeedramp->ActualValue + hSpeedramp->IncValue < hSpeedramp->TargetValue)
  154. {
  155. hSpeedramp->ActualValue += hSpeedramp->IncValue;
  156. }
  157. else
  158. {
  159. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  160. }
  161. }
  162. else
  163. {
  164. if (hSpeedramp->ActualValue - hSpeedramp->DecValue > hSpeedramp->TargetValue)
  165. {
  166. hSpeedramp->ActualValue -= hSpeedramp->DecValue;
  167. }
  168. else
  169. {
  170. hSpeedramp->ActualValue = hSpeedramp->TargetValue;
  171. }
  172. }
  173. }
  174. /*---------------------------------------------------------------------------*/
  175. /* Name : void StarRampDealwith(void)
  176. /* Input : NO
  177. /* Output : NO
  178. /* Description:
  179. /*---------------------------------------------------------------------------*/
  180. void StarRampDealwith(void)
  181. {
  182. if ((mcState == mcRun) || (mcState == mcStart))
  183. {
  184. if (mcFocCtrl.State_Count == 1200) //2300
  185. {
  186. FOC_EKP = OBSW_KP_GAIN_RUN; // 估算器里的PI的KP
  187. FOC_EKI = OBSW_KI_GAIN_RUN; // 估算器里的PI的KI
  188. #if (EstimateAlgorithm == PLL)
  189. {
  190. FOC_KSLIDE = OBSE_PLLKP_GAIN2;
  191. FOC_EKLPFMIN = OBSE_PLLKI_GAIN2;
  192. }
  193. #endif
  194. }
  195. else if (mcFocCtrl.State_Count == 1000) //2000
  196. {
  197. FOC_EKP = OBSW_KP_GAIN_RUN1; // 估算器里的PI的KP
  198. FOC_EKI = OBSW_KI_GAIN_RUN1; // 估算器里的PI的KI
  199. #if (EstimateAlgorithm == PLL)
  200. {
  201. FOC_KSLIDE = OBSE_PLLKP_GAIN3;
  202. FOC_EKLPFMIN = OBSE_PLLKI_GAIN3;
  203. }
  204. #endif
  205. }
  206. else if (mcFocCtrl.State_Count == 600) //1600
  207. {
  208. FOC_EKP = OBSW_KP_GAIN_RUN2; // 估算器里的PI的KP
  209. FOC_EKI = OBSW_KI_GAIN_RUN2; // 估算器里的PI的KI
  210. #if (EstimateAlgorithm == PLL)
  211. {
  212. FOC_KSLIDE = OBSE_PLLKP_GAIN4;
  213. FOC_EKLPFMIN = OBSE_PLLKI_GAIN4;
  214. }
  215. #endif
  216. }
  217. else if (mcFocCtrl.State_Count == 400) //1200
  218. {
  219. FOC_EKP = OBSW_KP_GAIN_RUN3; // 估算器里的PI的KP
  220. FOC_EKI = OBSW_KI_GAIN_RUN3; // 估算器里的PI的KI
  221. #if (EstimateAlgorithm == PLL)
  222. {
  223. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  224. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  225. }
  226. #endif
  227. }
  228. else if (mcFocCtrl.State_Count == 300)
  229. {
  230. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  231. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  232. #if (EstimateAlgorithm == PLL)
  233. {
  234. FOC_KSLIDE = OBSE_PLLKP_GAIN5;
  235. FOC_EKLPFMIN = OBSE_PLLKI_GAIN5;
  236. }
  237. #endif
  238. }
  239. }
  240. }
  241. /*PI参数分段处理*/
  242. void Current_Speed_PI(void)
  243. {
  244. static int16 Skp, Ski, DQkp, DQki;
  245. static int16 Skp_1, Ski_1, DQkp_1, DQki_1;
  246. if (motorControl.ActualSpeed < _Q15(2000 / MOTOR_SPEED_BASE))
  247. {
  248. Skp = SKPRun;
  249. Ski = SKIRun;
  250. DQkp = DQKP;
  251. DQki = DQKI;
  252. }
  253. else if (motorControl.ActualSpeed < _Q15(4200 / MOTOR_SPEED_BASE))
  254. {
  255. Skp = SKPRun1;
  256. Ski = SKIRun1;
  257. DQkp = DQKP_zhong;
  258. DQki = DQKI_zhong;
  259. }
  260. else if (motorControl.ActualSpeed > _Q15(4700 / MOTOR_SPEED_BASE))
  261. {
  262. Skp = SKPRun2;
  263. Ski = SKIRun2;
  264. DQkp = DQKP_highspeed;
  265. DQki = DQKI_highspeed;
  266. }
  267. Skp_1 = PI0_KP;
  268. Ski_1 = PI0_KI;
  269. if (Skp_1 < Skp)
  270. {
  271. Skp_1 += 2;
  272. }
  273. else if (Skp_1 > Skp)
  274. {
  275. Skp_1 -= 2;
  276. }
  277. if (Ski_1 < Ski)
  278. {
  279. Ski_1 += 2;
  280. }
  281. else if (Ski_1 > Ski)
  282. {
  283. Ski_1 -= 2;
  284. }
  285. PI0_KP = Skp_1;
  286. PI0_KI = Ski_1;
  287. DQkp_1 = FOC_QKP;
  288. DQki_1 = FOC_QKI;
  289. if (DQkp_1 < DQkp)
  290. {
  291. DQkp_1 += 2;
  292. }
  293. else if (DQkp_1 > DQkp)
  294. {
  295. DQkp_1 -= 2;
  296. }
  297. if (DQki_1 < DQki)
  298. {
  299. DQki_1 += 2;
  300. }
  301. else if (DQki_1 > DQki)
  302. {
  303. DQki_1 -= 2;
  304. }
  305. FOC_DKP = DQkp_1;
  306. FOC_DKI = DQki_1;
  307. FOC_QKP = DQkp_1;
  308. FOC_QKI = DQki_1;
  309. }
  310. uint16 AimFrequencyMaxVAC = 500;