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

167 lines
5.5 KiB

#ifndef APPHAL_CAN_CONFIG_H_
#define APPHAL_CAN_CONFIG_H_
#include "cmsis_os2.h"
// 大端转小端
#define INT32_BIG_TO_LITTLE(x) \
((((x) & 0xFF000000) >> 24) | \
(((x) & 0x00FF0000) >> 8) | \
(((x) & 0x0000FF00) << 8) | \
(((x) & 0x000000FF) << 24))
// 小端转大端
#define INT32_LITTLE_TO_BIG(x) \
((((x) & 0xFF000000) >> 24) | \
(((x) & 0x00FF0000) >> 8) | \
(((x) & 0x0000FF00) << 8) | \
(((x) & 0x000000FF) << 24))
#define SWAP_16(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
// 电机驱动板 can_frame_id 由 拨码器 1234 配置 【范围 0~15】
#define CAN_BASE_FRAME_ID 0x08 // CAN 响应帧ID = CAN_BASE_FRAME_ID + can_frame_id
#define CAN_FRAME_RANGE 0x20
// ---- ---- CAN 接收【控制帧】 ID ---- ----
// #define CAN_X_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x01)
// #define CAN_Y_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x02)
// #define CAN_Z_MOTOR_FRAME_ID (CAN_BASE_FRAME_ID + 0x03)
#define CAN_X_MOTOR_FRAME_ID 0x09
#define CAN_Y_MOTOR_FRAME_ID 0x0A
#define CAN_Z_MOTOR_FRAME_ID 0x0B
// ---- ---- CAN 发送【主动上报】帧 ID ---- ----
#define UPLOAD_MOTOR_POS_ID (CAN_BASE_FRAME_ID + 0x04) // 电机驱动板 电机位置 + 电机 状态 上传帧
//#define UPLOAD_MOTOR_SPEED_ID (CAN_BASE_FRAME_ID + 0x02) // 电机驱动板 电机位置 + 电机 状态 上传帧
#define UPLOAD_MOTOR_SENSOR (CAN_BASE_FRAME_ID + 0x05) // 电机驱动板 电机位置 + 电机 状态 上传帧
// 主动推送事件
#define UPLOAD_EVENT_ID 0x10
// 定时推送状态
#define UPLOAD_STATUS_ID 0x11
// 基础功能码
#define CMD_FUN_CODE 0x5A
#define UPLOAD_FUN_CODE 0xA0
// ==== ==== ==== ==== 线圈地址 ==== ==== ==== ====
#define MOTOR_ENABLE_ADDRESS 0x00 // 定义电机使能地址
#define STOP_ADDRESS 0x01 // 定义停止地址
#define RESET_POSITION_ADDRESS 0x02 // 定义重置位置地址
#define MOVE_HOME_ADDRESS 0x03 // 回 HOME
#define CLEANING_VALVE_ADDRESS 0x21 // 清洗阀
#define NOZZLE_VALVE_ADDRESS 0x22 // 喷嘴阀
#define DEHUMIDIFICATION_VALVE_ADDRESS 0x23 // 除湿阀
#define LIGHTING_PANEL_ADDRESS 0x24 // 照明灯板
#define LASER_ADDRESS 0x25 // 激光
#define HIGH_VOLTAGE_PACK_POWER_ON_ADDRESS 0x26 // 高压包供电开启
#define PUMP_DRIVER_ADDRESS 0x27 // 注射泵驱动
#define THREE_VALVE_ADDRESS_VT 0x28 // 三通阀 VT
#define THREE_VALVE_ADDRESS_POWER 0x29 // 三通阀 POWER
#define MOVE_FINISHED_READ_ADDRESS 0x10
#define AT_ORIGIN_READ_ADDRESS 0x11
#define AT_LIMIT_READ_ADDRESS 0x12
#define E_STOP_READ_ADDRESS 0x60
#define PAUSE_READ_ADDRESS 0x61
#define THREE_WAY_VALVE_READ_ADDRESS 0x62
#define SYRINGE_PUMP_READ_ADDRESS 0x63
#define RT_POS_READ_ADDRESS 0x00 // 实时位置
#define RT_SPEED_READ_ADDRESS 0x02 // 实时速度
#define T_RH_READ_ADDRESS 0x60 // 湿度 + 温度
#define FLOW_READ_ADDRESS 0x62 // 流量计
// ==== ==== ==== ==== 寄存器地址 ==== ==== ==== ====
#define SPEED_ADDRESS 0x00 // 定义速度地址
#define TARGET_POSITION_ADDRESS 0x02 // 定义目标位置地址
#define I_RUN_ADDRESS 0x04 //电机运行电流地址
#define V_SPEED_ADDRESS 0x06 // 电机 速度模式 闭环控制 目标速度
#define V_TARGET_POSITION_ADDRESS 0x08 // 电机 速度模式 闭环控制 目标位置
#define SHIFT_TARGET_POSITION_ADDRESS 0x0A // 电机 位置模式 闭环控制 相对位置
#define HIGH_VOLTAGE_PACK_SET_ADDRESS 0x20 // 高压电包设置寄存器
#define PUMP_DRIVER_SPEED_ADDRESS 0x21 // 注射泵速度 ML
#define LASER_POWER_ADDRESS 0x22 // 激光控制
// 主动推送事件 功能码
#define UPLOAD_FUN_CODE_MOTOR_X 0x5A
#define UPLOAD_FUN_CODE_MOTOR_Y 0x5B
#define UPLOAD_FUN_CODE_MOTOR_Z 0x5C
// 定时推送状态 功能码
// [0] 功能码
enum UploadStatusCode {
USC_MotorXPos = 0x1A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位
USC_MotorXSpeed = 0x1B, // [1-4] 速度
USC_MotorYPos = 0x3A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位
USC_MotorYSpeed = 0x3B, // [1-4] 速度
USC_MotorZPos = 0x5A, // [1-4] 位置(大端) + [5] 运动状态 + [6] 原点 + [7] 限位
USC_MotorZSpeed = 0x5B, // [1-4] 速度
USC_Sensor_D_1 = 0x7A, // 数字量 [1] 急停 + [2] 暂停 + [3] 三通阀 + [4] 注射泵
USC_Sensor_A_1 = 0x8A, // 模拟量 [1-2] 流量计(大端) + [3-4] 湿度(大端) + [5-6] 温度(大端)
};
#define UPLOAD_STUTUS_MOTOR_X_POS 0x0A
#define UPLOAD_STUTUS_MOTOR_ 0x5B
#define UPLOAD_FUN_CODE_MOTOR_Z 0x5C
enum CAN_PDU_FunCode
{
CAN_PDU_READ_COILS = 0x01,
CAN_PDU_READ_DISCRETE_INPUTS = 0x02,
CAN_PDU_READ_HOLDING_REGISTERS = 0x03,
CAN_PDU_WRITE_SINGLE_COIL = 0x05,
CAN_PDU_WRITE_SINGLE_REGISTER = 0x06,
CAN_PDU_WRITE_MULTIPLE_COILS = 0x0F,
CAN_PDU_WRITE_MULTIPLE_REGISTERS = 0x10
};
enum CanPDUErrorCodes {
CAN_PDU_OK = 0x00,
CAN_PDU_ILLEGAL_FUNCTION = 0x01,
CAN_PDU_ILLEGAL_DATA_ADDRESS = 0x02,
CAN_PDU_ILLEGAL_DATA_VALUE = 0x03,
CAN_PDU_ILLEGAL_EXCEPTION = 0x10,
CAN_PDU_ILLEGAL_TIME_OUT = 0x44
};
#define CAN_CONFIG CanConfig::getInstance()
class CanConfig {
private:
// 私有构造函数,防止外部实例化
CanConfig();
// 禁止拷贝构造函数和赋值运算符
CanConfig(const CanConfig&) = delete;
CanConfig& operator=(const CanConfig&) = delete;
// 静态成员变量,保存单例实例
static CanConfig* instance;
// CAN 帧 ID
uint32_t can_frame_id;
public:
// 互斥锁句柄,用于线程安全
static osMutexId_t mutex;
public:
// 静态方法,获取单例实例
static CanConfig* getInstance();
// 设置 CAN 帧 ID
void setCanFrameId(uint32_t id);
// 获取 CAN 帧 ID
uint32_t getCanFrameId() const;
};
#endif /* APPHAL_CAN_CONFIG_H_ */