Dummy-Robot/2.Firmware/REF-STM32F4-fw/Robot/actuators/mintasca/sca_protocol.h
peng-zhihui 52c8328f51 [Fw] Add Dummy controller firmware.
Add description of Firmware.
2021-10-27 11:17:37 +08:00

437 lines
16 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @文 件 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发送帧IDmsg为要发送的数据地址
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