control.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. @copyright None
  3. @file control.c
  4. @author Comment Vivre
  5. @date 2025-12-29
  6. @brief None
  7. */
  8. #include <MyProject.h>
  9. Start_Test_t xdata startTest;
  10. /**
  11. @function Motor_Start_Test
  12. @brief 电机启动测试
  13. @date 2025-12-23
  14. */
  15. void Motor_Start_Test(void)
  16. {
  17. // 有故障 结束测试
  18. if (FaultSource != SYS_NO_FAULT)
  19. {
  20. startTest.State = TEST_FAULT;
  21. isCtrlPowOn = false;
  22. startTest.RunTime = 0;
  23. startTest.StopTime = 0;
  24. }
  25. switch (startTest.State)
  26. {
  27. // 停止
  28. case TEST_MOTOR_STOP:
  29. isCtrlPowOn = false;
  30. loopCtrl.TargetRef = 0;
  31. if (++startTest.StopTime > MOTOR_STOP_TIME)
  32. {
  33. startTest.StopTime = 0;
  34. startTest.State = TEST_MOTOR_START;
  35. }
  36. break;
  37. // 启动
  38. case TEST_MOTOR_START:
  39. isCtrlPowOn = true;
  40. loopCtrl.TargetRef = MOTOR_START_TEST_SPEED;
  41. if (++startTest.RunTime > MOTOR_RUN_TIME)
  42. {
  43. startTest.RunTime = 0;
  44. startTest.State = TEST_MOTOR_STOP;
  45. }
  46. break;
  47. case TEST_FAULT:
  48. break;
  49. }
  50. }
  51. /**
  52. @function Compressor_Speed_Control
  53. @brief 压缩机速度控制
  54. @date 2025-12-29
  55. */
  56. void Compressor_Speed_Control(void)
  57. {
  58. static uint8_t powONHoldCnt = 0; // 开机确认计数
  59. static uint8_t powOFFHoldCnt = 0; // 关机确认计数
  60. if (isCtrlPowOn)
  61. {
  62. // 关机判定:频率小于下限或大于上限
  63. if ((inputCapture.OutFreq < OFFPWMFreq) || (inputCapture.OutFreq > OFFPWMFreqHigh))
  64. {
  65. if (++powOFFHoldCnt > 50)
  66. {
  67. powOFFHoldCnt = 0;
  68. isCtrlPowOn = false;
  69. }
  70. powONHoldCnt = 0;
  71. }
  72. }
  73. else
  74. {
  75. // 开机判定:频率在有效范围内
  76. if ((inputCapture.OutFreq > ONPWMFreq) && (inputCapture.OutFreq < OFFPWMFreqHigh))
  77. {
  78. if (++powONHoldCnt > 50)
  79. {
  80. powONHoldCnt = 0;
  81. isCtrlPowOn = true; // 开机
  82. }
  83. powOFFHoldCnt = 0;
  84. }
  85. }
  86. if (isCtrlPowOn)
  87. {
  88. switch (loopCtrl.CompState)
  89. {
  90. case COMP_RETURN_OIL:
  91. loopCtrl.TargetRef = RETURN_OIL_SPEED;
  92. if (++loopCtrl.ReturnOilCnt > RETURN_OIL_TIME)
  93. {
  94. loopCtrl.ReturnOilCnt = 0;
  95. loopCtrl.CompState = COMP_RUN;
  96. }
  97. break;
  98. case COMP_RUN:
  99. loopCtrl.TargetRef = SPEED_FREQ_K * inputCapture.OutFreq;
  100. // 限幅
  101. if (loopCtrl.TargetRef > MOTOR_SPEED_MAX_RPM)
  102. { loopCtrl.TargetRef = MOTOR_SPEED_MAX_RPM; }
  103. else if (loopCtrl.TargetRef < MOTOR_SPEED_MIN_RPM)
  104. { loopCtrl.TargetRef = MOTOR_SPEED_MIN_RPM; }
  105. break;
  106. }
  107. }
  108. else
  109. { loopCtrl.TargetRef = 0; }
  110. }
  111. /**
  112. @function Get_Target_Ref
  113. @brief 速度给定
  114. @date 2025-11-01
  115. */
  116. void Get_Target_Ref(void)
  117. {
  118. #if (SPEED_MODE == NONEMODE)
  119. isCtrlPowOn = true;
  120. loopCtrl.TargetRef = _Q15(2000.0 / MOTOR_SPEED_BASE);
  121. #elif (SPEED_MODE == PWMMODE)
  122. Input_Capture_Calc();
  123. Compressor_Speed_Control();
  124. #elif (SPEED_MODE == STARTTEST)
  125. Motor_Start_Test();
  126. #endif
  127. }