基质喷涂
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.

174 lines
5.8 KiB

  1. #ifndef APPHAL_CAN_CONFIG_H_
  2. #define APPHAL_CAN_CONFIG_H_
  3. #include "cmsis_os2.h"
  4. // 大端转小端
  5. #define INT32_BIG_TO_LITTLE(x) \
  6. ((((x) & 0xFF000000) >> 24) | \
  7. (((x) & 0x00FF0000) >> 8) | \
  8. (((x) & 0x0000FF00) << 8) | \
  9. (((x) & 0x000000FF) << 24))
  10. // 小端转大端
  11. #define INT32_LITTLE_TO_BIG(x) \
  12. ((((x) & 0xFF000000) >> 24) | \
  13. (((x) & 0x00FF0000) >> 8) | \
  14. (((x) & 0x0000FF00) << 8) | \
  15. (((x) & 0x000000FF) << 24))
  16. #define SWAP_16(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
  17. // 电机驱动板 can_frame_id 由 拨码器 1234 配置 【范围 0~15】
  18. #define CAN_BASE_FRAME_ID 0x08 // CAN 响应帧ID = CAN_BASE_FRAME_ID + can_frame_id
  19. #define CAN_FRAME_RANGE 0x20
  20. // ---- ---- CAN 接收【控制帧】 ID ---- ----
  21. // #define CAN_X_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x01)
  22. // #define CAN_Y_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x02)
  23. // #define CAN_Z_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x03)
  24. #define CAN_X_MOTOR_FRAME_ID 0x09
  25. #define CAN_Y_MOTOR_FRAME_ID 0x0A
  26. #define CAN_Z_MOTOR_FRAME_ID 0x0B
  27. // ---- ---- CAN 发送【主动上报】帧 ID ---- ----
  28. #define UPLOAD_MOTOR_POS_ID (CAN_BASE_FRAME_ID + 0x04) // 电机驱动板 电机位置 + 电机 状态 上传帧
  29. //#define UPLOAD_MOTOR_SPEED_ID (CAN_BASE_FRAME_ID + 0x02) // 电机驱动板 电机位置 + 电机 状态 上传帧
  30. #define UPLOAD_MOTOR_SENSOR (CAN_BASE_FRAME_ID + 0x05) // 电机驱动板 电机位置 + 电机 状态 上传帧
  31. // 主动推送事件
  32. #define UPLOAD_EVENT_ID 0x10
  33. // 定时推送状态
  34. #define UPLOAD_STATUS_ID 0x11
  35. // 基础功能码
  36. #define CMD_FUN_CODE 0x5A
  37. #define UPLOAD_FUN_CODE 0xA0
  38. // ==== ==== ==== ==== 线圈地址 ==== ==== ==== ====
  39. #define MOTOR_ENABLE_ADDRESS 0x00 // 定义电机使能地址
  40. #define STOP_ADDRESS 0x01 // 定义停止地址
  41. #define RESET_POSITION_ADDRESS 0x02 // 定义重置位置地址
  42. #define MOVE_HOME_ADDRESS 0x03 // 回 HOME
  43. #define CLEANING_VALVE_ADDRESS 0x21 // 清洗阀
  44. #define NOZZLE_VALVE_ADDRESS 0x22 // 喷嘴阀
  45. #define DEHUMIDIFICATION_VALVE_ADDRESS 0x23 // 除湿阀
  46. #define LIGHTING_PANEL_ADDRESS 0x24 // 照明灯板
  47. #define LASER_ADDRESS 0x25 // 激光
  48. #define HIGH_VOLTAGE_PACK_POWER_ON_ADDRESS 0x26 // 高压包供电开启
  49. #define PUMP_DRIVER_ADDRESS 0x27 // 注射泵驱动
  50. #define THREE_VALVE_ADDRESS_VT 0x28 // 三通阀 VT
  51. #define THREE_VALVE_ADDRESS_POWER 0x29 // 三通阀 POWER
  52. #define MOVE_FINISHED_READ_ADDRESS 0x10
  53. #define AT_ORIGIN_READ_ADDRESS 0x11
  54. #define AT_LIMIT_READ_ADDRESS 0x12
  55. #define E_STOP_READ_ADDRESS 0x60
  56. #define PAUSE_READ_ADDRESS 0x61
  57. #define THREE_WAY_VALVE_READ_ADDRESS 0x62
  58. #define SYRINGE_PUMP_READ_ADDRESS 0x63
  59. #define RT_POS_READ_ADDRESS 0x00 // 实时位置
  60. #define RT_SPEED_READ_ADDRESS 0x02 // 实时速度
  61. #define T_RH_READ_ADDRESS 0x60 // 湿度 + 温度
  62. #define FLOW_READ_ADDRESS 0x62 // 流量计
  63. #define MOTOR_XYZ_ADDRESS 0x80 // 获取xyz device 地址
  64. #define BOARD_INFO_READ_COILS 0x48 // 板卡线圈
  65. #define BOARD_INFO_READ_ADDRESS 0xB0 // 板卡寄存器
  66. #define QUERY_MOTOR_STATUS 0xA5
  67. // ==== ==== ==== ==== 寄存器地址 ==== ==== ==== ====
  68. #define SPEED_ADDRESS 0x00 // 定义速度地址
  69. #define TARGET_POSITION_ADDRESS 0x02 // 定义目标位置地址
  70. #define I_RUN_ADDRESS 0x04 //电机运行电流地址
  71. #define V_SPEED_ADDRESS 0x06 // 电机 速度模式 闭环控制 目标速度
  72. #define V_TARGET_POSITION_ADDRESS 0x08 // 电机 速度模式 闭环控制 目标位置
  73. #define SHIFT_TARGET_POSITION_ADDRESS 0x0A // 电机 位置模式 闭环控制 相对位置
  74. #define HIGH_VOLTAGE_PACK_SET_ADDRESS 0x20 // 高压电包设置寄存器
  75. #define PUMP_DRIVER_SPEED_ADDRESS 0x21 // 注射泵速度 ML
  76. #define LASER_POWER_ADDRESS 0x22 // 激光控制
  77. #define PUMP_DRIVER_SET_SPEED_ADDRESS 0x23 // 设置注射泵速度 ML
  78. // 主动推送事件 功能码
  79. #define UPLOAD_FUN_CODE_MOTOR_X 0x5A
  80. #define UPLOAD_FUN_CODE_MOTOR_Y 0x5B
  81. #define UPLOAD_FUN_CODE_MOTOR_Z 0x5C
  82. // 定时推送状态 功能码
  83. // [0] 功能码
  84. enum UploadStatusCode {
  85. USC_MotorXPos = 0x1A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位
  86. USC_MotorXSpeed = 0x1B, // [1-4] 速度
  87. USC_MotorYPos = 0x3A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位
  88. USC_MotorYSpeed = 0x3B, // [1-4] 速度
  89. USC_MotorZPos = 0x5A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位
  90. USC_MotorZSpeed = 0x5B, // [1-4] 速度
  91. USC_Sensor_D_1 = 0x7A, // 数字量 [1] 急停 + [2] 暂停 + [3] 三通阀 + [4] 注射泵
  92. USC_Sensor_A_1 = 0x8A, // 模拟量 [1-2] 流量计(大端) + [3-4] 湿度(大端) + [5-6] 温度(大端)
  93. };
  94. #define UPLOAD_STUTUS_MOTOR_X_POS 0x0A
  95. #define UPLOAD_STUTUS_MOTOR_ 0x5B
  96. #define UPLOAD_FUN_CODE_MOTOR_Z 0x5C
  97. enum CAN_PDU_FunCode
  98. {
  99. CAN_PDU_READ_COILS = 0x01,
  100. CAN_PDU_READ_DISCRETE_INPUTS = 0x02,
  101. CAN_PDU_READ_HOLDING_REGISTERS = 0x03,
  102. CAN_PDU_WRITE_SINGLE_COIL = 0x05,
  103. CAN_PDU_WRITE_SINGLE_REGISTER = 0x06,
  104. CAN_PDU_WRITE_MULTIPLE_COILS = 0x0F,
  105. CAN_PDU_WRITE_MULTIPLE_REGISTERS = 0x10
  106. };
  107. enum CanPDUErrorCodes {
  108. CAN_PDU_OK = 0x00,
  109. CAN_PDU_ILLEGAL_FUNCTION = 0x01,
  110. CAN_PDU_ILLEGAL_DATA_ADDRESS = 0x02,
  111. CAN_PDU_ILLEGAL_DATA_VALUE = 0x03,
  112. CAN_PDU_ILLEGAL_EXCEPTION = 0x10,
  113. CAN_PDU_ILLEGAL_TIME_OUT = 0x44
  114. };
  115. #define CAN_CONFIG CanConfig::getInstance()
  116. class CanConfig {
  117. private:
  118. // 私有构造函数,防止外部实例化
  119. CanConfig();
  120. // 禁止拷贝构造函数和赋值运算符
  121. CanConfig(const CanConfig&) = delete;
  122. CanConfig& operator=(const CanConfig&) = delete;
  123. // 静态成员变量,保存单例实例
  124. static CanConfig* instance;
  125. // CAN 帧 ID
  126. uint32_t can_frame_id;
  127. public:
  128. // 互斥锁句柄,用于线程安全
  129. static osMutexId_t mutex;
  130. public:
  131. // 静态方法,获取单例实例
  132. static CanConfig* getInstance();
  133. // 设置 CAN 帧 ID
  134. void setCanFrameId(uint32_t id);
  135. // 获取 CAN 帧 ID
  136. uint32_t getCanFrameId() const;
  137. };
  138. #endif /* APPHAL_CAN_CONFIG_H_ */