基质喷涂
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
5.0 KiB

  1. #include "apphardware.hpp"
  2. #include <can/can_dbg.h>
  3. #include "apphal.hpp"
  4. #include "LED/led.h"
  5. #include "status/motor_manager.h"
  6. using namespace iflytop;
  7. #define TAG "AppHardware"
  8. extern SPI_HandleTypeDef hspi1;
  9. AppHardware::AppHardware()
  10. {
  11. }
  12. void AppHardware::initialize() {
  13. AppHal::tmc_spi_init();
  14. // 配置MOTO电源引脚
  15. MOTO_POWER_EN.initAsOutput(MOTO_POWER_EN_IO, kxs_gpio_nopull, false, true);
  16. // 初始化 MOTO1 相关引脚
  17. MOTO1_CSN.initAsOutput(MOTO1_CSN_IO, kxs_gpio_nopull, false, true);
  18. MOTO1_DRV_ENN.initAsOutput(MOTO1_DRV_ENN_IO, kxs_gpio_nopull, false, true);
  19. MOTOR1_REF_L.initAsInput(MOTOR1_REF_L_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  20. MOTOR1_REF_R.initAsInput(MOTOR1_REF_R_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  21. // 初始化 MOTO2 相关引脚
  22. MOTO2_CSN.initAsOutput(MOTO2_CSN_IO, kxs_gpio_nopull, false, true);
  23. MOTO2_DRV_ENN.initAsOutput(MOTO2_DRV_ENN_IO, kxs_gpio_nopull, false, true);
  24. MOTOR2_REF_L.initAsInput(MOTOR2_REF_L_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  25. MOTOR2_REF_R.initAsInput(MOTOR2_REF_R_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  26. // 初始化 MOTO3 相关引脚
  27. MOTO3_CSN.initAsOutput(MOTO3_CSN_IO, kxs_gpio_nopull, false, true);
  28. MOTO3_DRV_ENN.initAsOutput(MOTO3_DRV_ENN_IO, kxs_gpio_nopull, false, true);
  29. MOTOR3_REF_L.initAsInput(MOTOR3_REF_L_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  30. MOTOR3_REF_R.initAsInput(MOTOR3_REF_R_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  31. osDelay(1500);
  32. MOTO_POWER_EN.setState(false);
  33. TMC51X0Cfg tmc5130cfg1 = {&MOTOR_SPI_INS, MOTO1_CSN_IO, MOTO1_DRV_ENN_IO};
  34. MOTO1.initialize(0, tmc5130cfg1);
  35. ZLOGI(TAG, "motor1 initialize TMC51X0: %02X", MOTO1.readICVersion());
  36. #if 0
  37. MOTO1.setIHOLD_IRUN(0, 7, 100);
  38. #else
  39. MOTO1.setIHOLD_IRUN(0, 5, 100);
  40. #endif
  41. MOTO1.setScale(1000);
  42. MOTO1.setEncResolution(-1000);
  43. // 配置 MOTO2
  44. TMC51X0Cfg tmc5130cfg2 = {&MOTOR_SPI_INS, MOTO2_CSN_IO, MOTO2_DRV_ENN_IO};
  45. MOTO2.initialize(1, tmc5130cfg2);
  46. ZLOGI(TAG, "motor2 initialize TMC51X0: %02X", MOTO2.readICVersion());
  47. #if 0
  48. MOTO2.setIHOLD_IRUN(0, 10, 100);
  49. #else
  50. MOTO2.setIHOLD_IRUN(0, 5, 100);
  51. #endif
  52. MOTO2.setScale(1000);
  53. MOTO2.setEncResolution(-1000);
  54. // 配置 MOTO3
  55. TMC51X0Cfg tmc5130cfg3 = {&MOTOR_SPI_INS, MOTO3_CSN_IO, MOTO3_DRV_ENN_IO};
  56. MOTO3.initialize(2, tmc5130cfg3);
  57. ZLOGI(TAG, "motor3 initialize TMC51X0: %02X", MOTO3.readICVersion());
  58. MOTO3.setIHOLD_IRUN(0, 5, 100);
  59. MOTO3.setScale(1000);
  60. MOTO3.setEncResolution(-1000);
  61. // GPIO 初始化
  62. AirValve::initGPIO();
  63. three_way_valve.initGPIO();
  64. pump_controller.init();
  65. high_voltage_pack.init(false);
  66. laser_control.init(true);
  67. // 初始化电机索引
  68. MotorManager::ins()->motors[0].setMotorIndex(0);
  69. MotorManager::ins()->motors[1].setMotorIndex(1);
  70. MotorManager::ins()->motors[2].setMotorIndex(2);
  71. RK3588_POWER_OFF; // 3588 下电
  72. LED_KEY_OFF; // 按键灯关闭
  73. ZLOGI(TAG, "===== CAN Controller Start...");
  74. AppHardware::ins()->can0Controller.start(&hcan1); // 启动CAN
  75. ZLOGI(TAG, "===== CAN Controller Start Suc");
  76. isLaunched_ = false;
  77. isStarted_ = false;
  78. }
  79. bool AppHardware::isHardInitOk() { return hardwareInitedOK; }
  80. void AppHardware::SystemPowerOn() {
  81. if(isStarted_) {
  82. return;
  83. }
  84. LED_GREEN_OFF; // 开启绿灯
  85. LIGHT_FLOOD_ON; // 照明灯开
  86. AppHardware::ins()->MOTO1.enable(true);
  87. osDelay(10);
  88. AppHardware::ins()->MOTO2.enable(true);
  89. osDelay(10);
  90. AppHardware::ins()->MOTO3.enable(true);
  91. osDelay(10);
  92. osDelay(200);
  93. ZLOGI(TAG, "======================= System Start =======================");
  94. isStarted_ = true;
  95. }
  96. void AppHardware::SystemPowerOff() {
  97. if(!isStarted_) {
  98. return;
  99. }
  100. LED_GREEN_ON; // 关灯
  101. LIGHT_FLOOD_OFF; // 照明灯关闭
  102. AppHardware::ins()->high_voltage_pack.turnOffPower();
  103. AppHardware::ins()->pump_controller.powerOff();
  104. AppHardware::ins()->three_way_valve.setMode(ThreeWayValve::ON_C);
  105. AppHardware::ins()->laser_control.powerOff();
  106. AirValve::closeCleaning();
  107. AirValve::closeDehumidification();
  108. AirValve::closeNozzle();
  109. MotorManager::ins()->motors[0].runE_Stop();
  110. osDelay(10);
  111. MotorManager::ins()->motors[1].runE_Stop();
  112. osDelay(10);
  113. MotorManager::ins()->motors[2].runE_Stop();
  114. osDelay(10);
  115. AppHardware::ins()->MOTO1.enable(false);
  116. AppHardware::ins()->MOTO2.enable(false);
  117. AppHardware::ins()->MOTO3.enable(false);
  118. osDelay(200);
  119. ZLOGI(TAG, "======================= System Shut Down =======================");
  120. isStarted_ = false;
  121. }
  122. void AppHardware::setE_Stop(bool isE_Stop) {
  123. this->isE_Stop_ = isE_Stop;
  124. }
  125. bool AppHardware::isE_Stop() {
  126. return isE_Stop_;
  127. }
  128. void AppHardware::toggleLaunched() {
  129. this->isLaunched_ = !isLaunched_;
  130. }
  131. bool AppHardware::isLaunched() {
  132. return isLaunched_;
  133. }
  134. bool AppHardware::isStarted() {
  135. return isStarted_;
  136. }