mirror of
https://gitee.com/peng_zhihui/Dummy-Robot
synced 2025-11-04 20:49:40 +08:00
437 lines
16 KiB
C
437 lines
16 KiB
C
/**
|
||
******************************************************************************
|
||
* @文 件 : SCA_Protocol.h
|
||
* @作 者 : INNFOS Software Team
|
||
* @版 本 : V1.5.2
|
||
* @日 期 : 2019.08.20
|
||
* @摘 要 : INNFOS CAN 通信协议层
|
||
******************************************************************************/
|
||
|
||
#ifndef __SCA_PROTOCOL_H
|
||
#define __SCA_PROTOCOL_H
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include "main.h"
|
||
|
||
/* !!!以下宏定义信息参数请勿修改!!! */
|
||
|
||
//INNFOS CAN 通信协议指令
|
||
//第一类读取指令
|
||
#define R1_Heartbeat 0x00
|
||
#define R1_Mode 0x55
|
||
#define R1_LastState 0xB0
|
||
#define R1_CurrentFilterState 0X71
|
||
#define R1_VelocityFilterState 0x75
|
||
#define R1_PositionFilterState 0x79
|
||
#define R1_PositionLimitState 0x8B
|
||
#define R1_PowerState 0x2B
|
||
|
||
//第二类读取指令
|
||
#define R2_Voltage 0x45
|
||
#define R2_Current_Max 0x53
|
||
#define R2_CurrentFilterValue 0x73
|
||
#define R2_VelocityFilterValue 0x77
|
||
#define R2_PositionFilterValue 0x7B
|
||
#define R2_MotorTemp 0x5F
|
||
#define R2_InverterTemp 0x60
|
||
#define R2_InverterProtectTemp 0x62
|
||
#define R2_InverterRecoverTemp 0x64
|
||
#define R2_MotorProtectTemp 0x6C
|
||
#define R2_MotorRecoverTemp 0x6E
|
||
#define R2_Error 0xFF
|
||
|
||
//第三类读取指令
|
||
#define R3_Current 0x04
|
||
#define R3_Velocity 0x05
|
||
#define R3_Position 0x06
|
||
#define R3_CurrentFilterP 0x15
|
||
#define R3_CurrentFilterI 0x16
|
||
#define R3_VelocityFilterP 0x17
|
||
#define R3_VelocityFilterI 0x18
|
||
#define R3_PositionFilterP 0x19
|
||
#define R3_PositionFilterI 0x1A
|
||
#define R3_PositionFilterD 0X1B
|
||
#define R3_PPMaxVelocity 0x1C
|
||
#define R3_PPMaxAcceleration 0x1D
|
||
#define R3_PPMaxDeceleration 0x1E
|
||
#define R3_PVMaxVelocity 0x22
|
||
#define R3_PVMaxAcceleration 0x23
|
||
#define R3_PVMaxDeceleration 0x24
|
||
#define R3_CurrentFilterLimitL 0x34
|
||
#define R3_CurrentFilterLimitH 0x35
|
||
#define R3_VelocityFilterLimitL 0x36
|
||
#define R3_VelocityFilterLimitH 0x37
|
||
#define R3_PositionFilterLimitL 0x38
|
||
#define R3_PositionFilterLimitH 0x39
|
||
#define R3_CurrentLimit 0x59
|
||
#define R3_VelocityLimit 0x5B
|
||
#define R3_Inertia 0x7D
|
||
#define R3_PositionLimitH 0x85
|
||
#define R3_PositionLimitL 0x86
|
||
#define R3_PositionOffset 0x8A
|
||
#define R3_HomingCurrentLimitL 0x92
|
||
#define R3_HomingCurrentLimitH 0x93
|
||
#define R3_BlockEngy 0x7F
|
||
|
||
//第四类读取指令
|
||
#define R4_CVP 0x94
|
||
|
||
//第五类读取指令
|
||
#define R5_ShakeHands 0x02
|
||
|
||
//第一类写入命令
|
||
#define W1_Mode 0x07
|
||
#define W1_CurrentFilterState 0X70
|
||
#define W1_VelocityFilterState 0x74
|
||
#define W1_PositionFilterState 0x78
|
||
#define W1_PositionLimitState 0x8C
|
||
#define W1_PowerState 0x2A
|
||
|
||
//第二类写入命令
|
||
#define W2_CurrentFilterValue 0x72
|
||
#define W2_VelocityFilterValue 0x76
|
||
#define W2_PositionFilterValue 0x7A
|
||
#define W2_InverterProtectTemp 0x61
|
||
#define W2_InverterRecoverTemp 0x63
|
||
#define W2_MotorProtectTemp 0x6B
|
||
#define W2_MotorRecoverTemp 0x6D
|
||
|
||
//第三类写入命令
|
||
#define W3_Current 0x08
|
||
#define W3_Velocity 0x09
|
||
#define W3_Position 0x0A
|
||
#define W3_CurrentFilterP 0x0E
|
||
#define W3_CurrentFilterI 0x0F
|
||
#define W3_VelocityFilterP 0x10
|
||
#define W3_VelocityFilterI 0x11
|
||
#define W3_PositionFilterP 0x12
|
||
#define W3_PositionFilterI 0x13
|
||
#define W3_PositionFilterD 0X14
|
||
#define W3_PPMaxVelocity 0x1F
|
||
#define W3_PPMaxAcceleration 0x20
|
||
#define W3_PPMaxDeceleration 0x21
|
||
#define W3_PVMaxVelocity 0x25
|
||
#define W3_PVMaxAcceleration 0x26
|
||
#define W3_PVMaxDeceleration 0x27
|
||
#define W3_CurrentFilterLimitL 0x2E
|
||
#define W3_CurrentFilterLimitH 0x2F
|
||
#define W3_VelocityFilterLimitL 0x30
|
||
#define W3_VelocityFilterLimitH 0x31
|
||
#define W3_PositionFilterLimitL 0x32
|
||
#define W3_PositionFilterLimitH 0x33
|
||
#define W3_CurrentLimit 0x58
|
||
#define W3_VelocityLimit 0x5A
|
||
#define W3_PositionLimitH 0x83
|
||
#define W3_PositionLimitL 0x84
|
||
#define W3_HomingValue 0x87
|
||
#define W3_PositionOffset 0x89
|
||
#define W3_HomingCurrentLimitL 0x90
|
||
#define W3_HomingCurrentLimitH 0x91
|
||
#define W3_BlockEngy 0x7E
|
||
|
||
//第四类写入命令
|
||
#define W4_ClearError 0xFE
|
||
#define W4_ClearHome 0x88
|
||
#define W4_Save 0x0D
|
||
|
||
//第五类写入命令
|
||
#define W5_ChangeID 0x3D
|
||
|
||
//变量缩放值定义
|
||
#define Velocity_Max 6000.0f //速度最大值,固定为6000RPM(仅作为换算用)
|
||
#define BlkEngy_Scal 75.225f //堵转能量缩放值
|
||
#define Profile_Scal 960.0f //梯形参数缩放值
|
||
#define IQ8 256.0f //2^8
|
||
#define IQ10 1024.0f //2^10
|
||
#define IQ24 16777216.0f //2^24
|
||
#define IQ30 1073741824.0f //2^30
|
||
|
||
/* ID为CAN发送帧ID,msg为要发送的数据(地址)
|
||
len为发送数据的长度,返回0成功,返回其他失败 */
|
||
typedef uint8_t (*Send_t)(uint8_t ID, uint8_t *msg, uint8_t len);
|
||
|
||
typedef struct //CAN端口句柄
|
||
{
|
||
//SCA 状态信息
|
||
uint8_t CanPort; //使用的CAN端口号
|
||
uint8_t Retry; //发送失败时重发次数
|
||
Send_t Send; //发送函数,格式参见Send_t
|
||
} CAN_Handler_t;
|
||
|
||
typedef struct //SCA报警信息
|
||
{
|
||
uint16_t Error_Code; //错误代码
|
||
|
||
/* 具体报警信息,0:正常,1:出错 */
|
||
uint8_t WARN_OVER_VOLT; //过压异常
|
||
uint8_t WARN_UNDER_VOLT; //欠压异常
|
||
uint8_t WARN_LOCK_ROTOR; //堵转异常
|
||
uint8_t WARN_OVER_TEMP; //过热异常
|
||
uint8_t WARN_RW_PARA; //读写参数异常
|
||
uint8_t WARN_MUL_CIRCLE; //多圈计数异常
|
||
uint8_t WARN_TEMP_SENSOR_INV; //逆变器温度传感器异常
|
||
uint8_t WARN_CAN_BUS; //CAN通讯异常
|
||
uint8_t WARN_TEMP_SENSOR_MTR; //电机温度传感器异常
|
||
uint8_t WARN_OVER_STEP; //位置模式阶跃大于1
|
||
uint8_t WARN_DRV_PROTEC; //DRV保护
|
||
uint8_t WARN_DVICE; //设备异常
|
||
|
||
} SCA_Warn_t;
|
||
|
||
/*
|
||
SCA变量缓存,用于写入参数时保存目标参数,待成功后再写入句柄中
|
||
读取标志位在阻塞时使用,变量内容可根据项目需要进行裁剪或添加
|
||
*/
|
||
typedef struct
|
||
{
|
||
/* 基础信息 */
|
||
uint8_t ID; //SCA 的ID号
|
||
|
||
/* 第一类数据变量 */
|
||
uint8_t Mode; //当前操作模式
|
||
uint8_t Current_Filter_State; //电流环滤波器状态
|
||
uint8_t Velocity_Filter_State; //速度环滤波器状态
|
||
uint8_t Position_Filter_State; //速度环滤波器状态
|
||
uint8_t Position_Limit_State; //位置限位状态
|
||
uint8_t Power_State; //开关机状态
|
||
/* 读取标志位 */
|
||
uint8_t R_Mode; //读取数据返回标志位 1为有数据返回
|
||
uint8_t R_Last_State;
|
||
uint8_t R_Current_Filter_State;
|
||
uint8_t R_Velocity_Filter_State;
|
||
uint8_t R_Position_Filter_State;
|
||
uint8_t R_Position_Limit_State;
|
||
uint8_t R_Power_State;
|
||
|
||
/* 第二类数据变量 */
|
||
float Current_Filter_Value; //电流环滤波器带宽
|
||
float Velocity_Filter_Value; //速度环滤波器带宽
|
||
float Position_Filter_Value; //位置环滤波器带宽
|
||
float Inverter_Protect_Temp; //逆变器保护温度
|
||
float Inverter_Recover_Temp; //逆变器恢复温度
|
||
float Motor_Protect_Temp; //电机保护温度
|
||
float Motor_Recover_Temp; //电机恢复温度
|
||
/* 读取标志位 */
|
||
uint8_t R_Current_Filter_Value;
|
||
uint8_t R_Velocity_Filter_Value;
|
||
uint8_t R_Position_Filter_Value;
|
||
uint8_t R_Inverter_Protect_Temp;
|
||
uint8_t R_Inverter_Recover_Temp;
|
||
uint8_t R_Motor_Protect_Temp;
|
||
uint8_t R_Motor_Recover_Temp;
|
||
uint8_t R_Voltage;
|
||
uint8_t R_Current_Max;
|
||
uint8_t R_Motor_Temp;
|
||
uint8_t R_Inverter_Temp;
|
||
uint8_t R_Error_Code;
|
||
|
||
/* 第三类数据变量 */
|
||
float Current_Real; //当前电流(单位:A)
|
||
float Velocity_Real; //当前速度(单位:RPM)
|
||
float Position_Real; //当前位置,真实值(单位:R)
|
||
float Current_Filter_P; //电流环的P值
|
||
float Current_Filter_I; //电流环的I值
|
||
float Velocity_Filter_P; //速度环的P值
|
||
float Velocity_Filter_I; //速度环的I值
|
||
float Position_Filter_P; //位置环的P值
|
||
float Position_Filter_I; //位置环的I值
|
||
//float Position_Filter_D; //位置环的D值
|
||
float PP_Max_Velocity; //位置梯形速度最大值
|
||
float PP_Max_Acceleration; //位置梯形加速度最大值
|
||
float PP_Max_Deceleration; //位置梯形减速度最大值
|
||
float PV_Max_Velocity; //速度梯形速度最大值
|
||
float PV_Max_Acceleration; //速度梯形加速度最大值
|
||
float PV_Max_Deceleration; //速度梯形减速度最大值
|
||
//float Current_Filter_Limit_L; //电流环输出下限
|
||
//float Current_Filter_Limit_H; //电流环输出上限
|
||
float Velocity_Filter_Limit_L; //速度环输出下限
|
||
float Velocity_Filter_Limit_H; //速度环输出上限
|
||
float Position_Filter_Limit_L; //位置环输出下限
|
||
float Position_Filter_Limit_H; //位置环输出上限
|
||
float Position_Limit_H; //执行器的位置上限
|
||
float Position_Limit_L; //执行器的位置下限
|
||
float Current_Limit; //电流输入限幅
|
||
float Velocity_Limit; //速度输入限幅
|
||
float Homing_Value; //执行器的Homing值
|
||
float Position_Offset; //执行器的位置偏置
|
||
float Homing_Current_Limit_L; //自动归零电流下限
|
||
float Homing_Current_Limit_H; //自动归零电流上限
|
||
float Blocked_Energy; //堵转锁定能量
|
||
/* 读取标志位 */
|
||
uint8_t R_Current_Real;
|
||
uint8_t R_Velocity_Real;
|
||
uint8_t R_Position_Real;
|
||
uint8_t R_Current_Filter_P;
|
||
uint8_t R_Current_Filter_I;
|
||
uint8_t R_Velocity_Filter_P;
|
||
uint8_t R_Velocity_Filter_I;
|
||
uint8_t R_Position_Filter_P;
|
||
uint8_t R_Position_Filter_I;
|
||
//uint8_t R_Position_Filter_D;
|
||
uint8_t R_PP_Max_Velocity;
|
||
uint8_t R_PP_Max_Acceleration;
|
||
uint8_t R_PP_Max_Deceleration;
|
||
uint8_t R_PV_Max_Velocity;
|
||
uint8_t R_PV_Max_Acceleration;
|
||
uint8_t R_PV_Max_Deceleration;
|
||
//uint8_t R_Current_Filter_Limit_L;
|
||
//uint8_t R_Current_Filter_Limit_H;
|
||
uint8_t R_Velocity_Filter_Limit_L;
|
||
uint8_t R_Velocity_Filter_Limit_H;
|
||
uint8_t R_Position_Filter_Limit_L;
|
||
uint8_t R_Position_Filter_Limit_H;
|
||
uint8_t R_Position_Limit_H;
|
||
uint8_t R_Position_Limit_L;
|
||
uint8_t R_Current_Limit;
|
||
uint8_t R_Velocity_Limit;
|
||
uint8_t R_Homing_Value;
|
||
uint8_t R_Position_Offset;
|
||
uint8_t R_Homing_Current_Limit_L;
|
||
uint8_t R_Homing_Current_Limit_H;
|
||
uint8_t R_Blocked_Energy;
|
||
uint8_t R_CVP;
|
||
uint8_t R_Serial_Num;
|
||
uint8_t W_ClearHome;
|
||
|
||
} Para_Cache_t;
|
||
|
||
/*
|
||
SCA信息句柄,请勿随意更改其中数值,
|
||
变量内容可根据项目需要进行裁剪或添加
|
||
*/
|
||
typedef struct
|
||
{
|
||
/* 协议数据变量区 */
|
||
uint8_t ID; //SCA的ID号
|
||
uint8_t Serial_Num[4]; //序列号
|
||
uint8_t Save_State; //参数保存状态,1为已保存
|
||
uint8_t Online_State; //当前在线状态,1为在线
|
||
uint8_t Update_State; //是否有参数刷新,1为有参数刷新
|
||
CAN_Handler_t *Can; //所使用的CAN端口
|
||
Para_Cache_t paraCache; //参数缓存
|
||
|
||
/* 用户数据变量区 */
|
||
|
||
/* 第一类数据变量 */
|
||
uint8_t Mode; //当前操作模式
|
||
uint8_t Last_State; //上次关机的异常状态,1为正常
|
||
uint8_t Current_Filter_State; //电流环滤波器状态
|
||
uint8_t Velocity_Filter_State; //速度环滤波器状态
|
||
uint8_t Position_Filter_State; //速度环滤波器状态
|
||
uint8_t Position_Limit_State; //位置限位状态
|
||
uint8_t Power_State; //开关机状态
|
||
|
||
/* 第二类数据变量 */
|
||
float Voltage; //当前电压(单位:V)
|
||
float Current_Max; //最大电流量程
|
||
float Current_Filter_Value; //电流环滤波器带宽
|
||
float Velocity_Filter_Value; //速度环滤波器带宽
|
||
float Position_Filter_Value; //位置环滤波器带宽
|
||
float Motor_Temp; //电机温度
|
||
float Inverter_Temp; //逆变器温度
|
||
float Inverter_Protect_Temp; //逆变器保护温度
|
||
float Inverter_Recover_Temp; //逆变器恢复温度
|
||
float Motor_Protect_Temp; //电机保护温度
|
||
float Motor_Recover_Temp; //电机恢复温度
|
||
SCA_Warn_t SCA_Warn; //电机报警信息
|
||
|
||
/* 第三类数据变量 */
|
||
float Current_Real; //当前电流(单位:A)
|
||
float Velocity_Real; //当前速度(单位:RPM)
|
||
float Position_Real; //当前位置,真实值(单位:R)
|
||
float Current_Filter_P; //电流环的P值
|
||
float Current_Filter_I; //电流环的I值
|
||
float Velocity_Filter_P; //速度环的P值
|
||
float Velocity_Filter_I; //速度环的I值
|
||
float Position_Filter_P; //位置环的P值
|
||
float Position_Filter_I; //位置环的I值
|
||
//float Position_Filter_D; //位置环的D值
|
||
float PP_Max_Velocity; //位置梯形速度最大值
|
||
float PP_Max_Acceleration; //位置梯形加速度最大值
|
||
float PP_Max_Deceleration; //位置梯形减速度最大值
|
||
float PV_Max_Velocity; //速度梯形速度最大值
|
||
float PV_Max_Acceleration; //速度梯形加速度最大值
|
||
float PV_Max_Deceleration; //速度梯形减速度最大值
|
||
//float Current_Filter_Limit_L; //电流环输出下限
|
||
//float Current_Filter_Limit_H; //电流环输出上限
|
||
float Velocity_Filter_Limit_L; //速度环输出下限
|
||
float Velocity_Filter_Limit_H; //速度环输出上限
|
||
float Position_Filter_Limit_L; //位置环输出下限
|
||
float Position_Filter_Limit_H; //位置环输出上限
|
||
float Position_Limit_H; //执行器的位置上限
|
||
float Position_Limit_L; //执行器的位置下限
|
||
float Current_Limit; //电流输入限幅
|
||
float Velocity_Limit; //速度输入限幅
|
||
float Homing_Value; //执行器的Homing值
|
||
float Position_Offset; //执行器的位置偏置
|
||
float Homing_Current_Limit_L; //自动归零电流下限
|
||
float Homing_Current_Limit_H; //自动归零电流上限
|
||
float Blocked_Energy; //堵转锁定能量
|
||
|
||
} SCA_Handler_t;
|
||
|
||
enum SCA_Error //SCA通信错误类型枚举
|
||
{
|
||
SCA_NoError = 0, //无错误
|
||
SCA_OverTime, //通信等待超时
|
||
SCA_SendError, //数据发送失败
|
||
SCA_OperationFailed, //操作失败
|
||
SCA_UnknownID, //未找到该ID的执行器句柄
|
||
};
|
||
|
||
/* 数据接收接口,有新的CAN数据包传入时调用
|
||
CanRxMsg 为CAN数据包的接收类型结构体移植时请自行
|
||
根据平台定义CanRxMsg结构类型,此处默认使用STM32
|
||
标准库函数中的接收结构 */
|
||
typedef struct
|
||
{
|
||
uint32_t StdId; /*!< Specifies the standard identifier.
|
||
This parameter can be a value between 0 to 0x7FF. */
|
||
|
||
uint32_t ExtId; /*!< Specifies the extended identifier.
|
||
This parameter can be a value between 0 to 0x1FFFFFFF. */
|
||
|
||
uint8_t IDE; /*!< Specifies the type of identifier for the message that
|
||
will be received. This parameter can be a value of
|
||
@ref CAN_identifier_type */
|
||
|
||
uint8_t RTR; /*!< Specifies the type of frame for the received message.
|
||
This parameter can be a value of
|
||
@ref CAN_remote_transmission_request */
|
||
|
||
uint8_t DLC; /*!< Specifies the length of the frame that will be received.
|
||
This parameter can be a value between 0 to 8 */
|
||
|
||
uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to
|
||
0xFF. */
|
||
|
||
uint8_t FMI; /*!< Specifies the index of the filter the message stored in
|
||
the mailbox passes through. This parameter can be a
|
||
value between 0 to 0xFF */
|
||
} CanRxMsg;
|
||
|
||
void canDispatch(CanRxMsg *RxMsg);
|
||
|
||
/* 以下函数为API层调用 */
|
||
|
||
/* 读取命令接口 */
|
||
uint8_t SCA_Read(SCA_Handler_t *pSCA, uint8_t cmd);
|
||
|
||
/* 五类写入命令 */
|
||
uint8_t SCA_Write_1(SCA_Handler_t *pSCA, uint8_t cmd, uint8_t TxData);
|
||
uint8_t SCA_Write_2(SCA_Handler_t *pSCA, uint8_t cmd, float TxData);
|
||
uint8_t SCA_Write_3(SCA_Handler_t *pSCA, uint8_t cmd, float TxData);
|
||
uint8_t SCA_Write_4(SCA_Handler_t *pSCA, uint8_t cmd);
|
||
uint8_t SCA_Write_5(SCA_Handler_t *pSCA, uint8_t cmd, uint8_t TxData);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
|
||
#endif
|
||
#endif
|