KmdFoc 指令结构
大约 7 分钟KmdFoc使用指南
KmdFoc 指令结构
合理的设置参数,对于 FOC 的稳定和高效运行有着不可忽视的作用,我们不应该只满足于自己做的东西仅限于玩具的层次,在此应当尽可能的发挥它的性能和价值。在此我无法向你过多地解释 PID、低通滤波、锁相环、Clark、Park 变换等的知识,希望可以自行了解相关内容,这可以帮助你更好的使用 KmdFoc,甚至于你也可以尝试设计自己的 FOC 驱动器。
重要
CAN 数据帧中的 uint8_t 格式的 buffer[0-3]、buffer[4-7],分别对应 32 位的范型数据(int, uint32_t, float)pData[0]、pData[1],数据按小端模式(数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中)。
HAL_KMD_MOTOR_DISABLE
注
用户可以通过此命令失能 FOC 控制。
HAL_KMD_MOTOR_CTR
注
- 用户可以通过此命令设置电机状态,在函数
hal_kmd_motor_receive_callback中会利用pData[0]作为二级命令进行进一步的操作,主要包含以下设置。 - 发送值:
pData[0]→pData[0]的低 16 位表示二级 ID,tHalMotorCmd = pData[0]&0XFFpData[1]→ 0
- 返回值:
pData[0] = [(result<<16)|(tHalMotorCmd)]result表示指令结果返回,为 0 表示正常,非 0 表示失败tHalMotorCmd
pData[1] = [float\int...]
HAL_MOTOR_DISABLE
注
- 失能电机时,会返回当前的位置,数据位于
pData[1]。 - 返回值:
pData[1] = 当前位置
HAL_MOTOR_ENABLE
注
- 使能电机时,FOC 控制器会稳定在当前位置,并返回当前的位置,数据位于
pData[1]。 - 返回值:
pData[1] = 当前位置
HAL_MOTOR_ERROR_REPORT
注
- 该数据帧是主动上报的,不能发送指令进行获取。值得注意的是,对于主动上报类型必须在设置通信方式后才能主动上报(也就是必须在获取版本号之后)。
- 该消息在发生错误后会主动上报
- 返回值:
pData[1] = (((uint16_t)pFocFsm->state) << 16) | (pFocFsm->motor_err & 0XFFFF);state→ 当前运行状态motor_err→ 错误标志
重要
motor_err 实际表示含义
typedef enum eHalMotorError
{
MOTOR_ERR_OVER_VOLTAGE = 0,
MOTOR_ERR_UNDER_VOLTAGE = 1,
MOTOR_ERR_OVER_SPEED = 2,
MOTOR_ERR_OVER_CURRENT = 3,
MOTOR_ERR_ENCODER = 4,
MOTOR_ERR_CAN_CONFLICT = 5,
MOTOR_ERR_HANLDER = 15,
MOTOR_ERR_NUM = 16,//此位无效
}tHalMotorError;
// Errors
#define ERR_OVER_VOLTAGE ((uint16_t)1 << MOTOR_ERR_OVER_VOLTAGE)
#define ERR_UNDER_VOLTAGE ((uint16_t)1 << MOTOR_ERR_UNDER_VOLTAGE)
#define ERR_OVER_SPEED ((uint16_t)1 << MOTOR_ERR_OVER_SPEED)
#define ERR_OVER_CURRENT ((uint16_t)1 << MOTOR_ERR_OVER_CURRENT)
#define ERR_ENCODER ((uint16_t)1 << MOTOR_ERR_ENCODER)
#define ERR_CAN_CONFLICT ((uint16_t)1 << MOTOR_ERR_CAN_CONFLICT)
#define ERR_HANLDER_IRQ ((uint16_t)1 << MOTOR_ERR_HANLDER)HAL_MOTOR_ERROR_RESET
注
- 清除电机错误状态。
- 返回值:
pData[1] = 0
HAL_MOTOR_GET_STAT
注
- 获取电机状态。
- 返回值:
pData[1] = (((uint16_t)pFocFsm->state) << 16) | (pFocFsm->motor_err & 0XFFFF);state→ 当前运行状态motor_err→ 错误标志
HAL_MOTOR_CALIBRATION_START
注
- 开始校准。
- 返回值:
pData[1] = 0
HAL_MOTOR_CALIBRATION_ABORT
注
- 停止校准。
- 返回值:
pData[1] = 0
HAL_MOTOR_CONFIGS_UPDATA
注
- 保存参数。
- 返回值:
pData[1] = 0
HAL_MOTOR_CONFIGS_RESET_ALL
注
- 复位所有参数。
- 返回值:
pData[1] = 0
HAL_KMD_CALIBRATION_REPORT
注
- 报告校准。
- 校准数据为校准过程中主动上报,其前提是已经初始化通信方式。
- 校准结果数据处理在
hal_kmd_cali_receive_callback获取。 - 发送值:
- 无需发送
- 返回值:
pData[0] = [(result<<16)|(cali_report_id)]result始终为 0cali_report_id
pData[1] = [float\int...]
HAL_CALIBRATION_ERROR = 0
注
- 校准错误上报。
- 返回值:
pData[1] = mCalibError,int //mCalibError为校准错误标志,0 表示正常
HAL_CALIBRATION_RES = 1, //电阻
注
- 校准结果电阻阻值上报。
- 返回值:
pData[1] = 电阻值,float
HAL_CALIBRATION_IND = 2, //电感
注
- 校准结果电感值上报。
- 返回值:
pData[1] = 电感值,float
HAL_CALIBRATION_PAIRS = 3, //极对数
注
- 校准结果极对数上报。
- 返回值:
pData[1] = 极对数,int
HAL_CALIBRATION_DIR = 4, //极性
注
- 校准结果极性上报。
- 返回值:
pData[1] = 极性,int
HAL_CALIBRATION_OFFSET = 5, //偏移
注
- 校准结果编码器偏移上报。
- 返回值:
pData[1] = 编码器偏移,int
HAL_CALIBRATION_POSITION = 6, //电机位置
注
- 校准过程电机位置上报。
- 返回值:
pData[1] = 电机当前位置,float
HAL_CALIBRATION_END = 7, //校准结束
注
- 校准结束校准结果通知。
- 返回值:
pData[1] = mCalibError,int //mCalibError为校准错误标志,0 表示正常
HAL_CALIBRATION_OFFSET_LUT = 10,//校准数据头
注
- 校准结束上报校准结果数组。
cali_report_id = HAL_CALIBRATION_OFFSET_LUT+i(i<128)- 返回值:
pData[1] = offset_lut[i],int // 编码器校准数组
HAL_KMD_READY_SET_POSITION
注
- 设置目标位置 → 返回值 [float,0]
- 发送值:
pData[0] = 设置目标位置,floatpData[1] = 0
- 返回值:
pData[0] = 当前目标位置,floatpData[1] = 0
HAL_KMD_READY_SET_VELOCITY
注
- 设置目标转速 → 返回值 [float,0]
- 发送值:
pData[0] = 设置目标转速,floatpData[1] = 0
- 返回值:
pData[0] = 当前目标转速,floatpData[1] = 0
HAL_KMD_READY_SET_CURRENT
注
- 设置目标电流 → 返回值 [float,0]
- 发送值:
pData[0] = 设置目标电流,floatpData[1] = 0
- 返回值:
pData[0] = 当前目标电流,floatpData[1] = 0
HAL_KMD_GET_POSITION
注
- 目标位置,实际位置 → 返回值 [float,float]
- 发送值:
pData[0] = 0pData[1] = 0
- 返回值:
pData[0] = 目标位置pData[1] = 实际位置
HAL_KMD_GET_VELOCITY
注
- 目标转速,实际转速 → 返回值 [float,float]
- 发送值:
pData[0] = 0pData[1] = 0
- 返回值:
pData[0] = 目标转速pData[1] = 实际转速
HAL_KMD_GET_CURRENT
注
- 目标电流,实际电流 → 返回值 [float,float]
- 发送值:
pData[0] = 0pData[1] = 0
- 返回值:
pData[0] = 目标电流pData[1] = 实际电流
HAL_KMD_GET_FOCBUS
注
- 总线电压,实际电压 → 返回值 [float,float]
- 发送值:
pData[0] = 0pData[1] = 0
- 返回值:
pData[0] = 总线电压pData[1] = 实际电压
HAL_KMD_SET_CONFIG
注
- 设置参数 → 返回值 [(result<<16)|(tHalUsrConfigsCmd),实际值(int/float)]
- 发送值:
pData[0] = tHalUsrConfigsCmdpData[1] = 设置参数值,float\int
- 返回值:
pData[0] = (0<<16)|tHalUsrConfigsCmdpData[1] = 实际值(int/float)
HAL_KMD_GET_CONFIG
注
- 获取参数 → 返回值 [(result<<16)|(tHalUsrConfigsCmd),实际值(int/float)]
- 发送值:
pData[0] = tHalUsrConfigsCmdpData[1] = 0
- 返回值:
pData[0] = (0<<16)|tHalUsrConfigsCmdpData[1] = 实际值(int/float)
HAL_KMD_GET_FW_VERSION
注
- 获取电机版本号
- 发送值:
pData[0] = 0pData[1] = 0
- 返回值:
pData[0] = (version[0]) | (version[1] << 16)pData[1] = (version[2]) | (version[3] << 16)
HAL_KMD_FSM_HEARTBEAT0
注
- 报告电机状态 0,在设置上报数据和心跳周期后将自动的进行周期性上报,以减少发送获取信息请求占用一定的数据通信带宽。
- 无需发送
- 返回值:
pData[0] = (((uint16_t)pFocFsm->state) << 16) | (pFocFsm->motor_err & 0XFFFF)pData[1] = 实际位置
HAL_KMD_POS_HEARTBEAT1
注
- 报告位置信息 1,在设置上报数据和心跳周期后将自动的进行周期性上报,以减少发送获取信息请求占用一定的数据通信带宽。
- 无需发送
- 返回值:
pData[0] = 目标位置pData[1] = 实际位置
HAL_KMD_VEL_HEARTBEAT2
注
- 报告速度信息 2,在设置上报数据和心跳周期后将自动的进行周期性上报,以减少发送获取信息请求占用一定的数据通信带宽。
- 返回值:
pData[0] = 目标转速pData[1] = 实际转速
HAL_KMD_CUR_HEARTBEAT3
注
- 报告电流信息 3,在设置上报数据和心跳周期后将自动的进行周期性上报,以减少发送获取信息请求占用一定的数据通信带宽。
- 返回值:
pData[0] = 目标电流pData[1] = 实际电流
HAL_KMD_BUS_HEARTBEAT4
注
- 报告总线信息 4,在设置上报数据和心跳周期后将自动的进行周期性上报,以减少发送获取信息请求占用一定的数据通信带宽。
- 返回值:
pData[0] = 总线电压pData[1] = 实际电压
重要
HAL_KMD_FSM_HEARTBEAT0~HAL_KMD_BUS_HEARTBEAT4 为主动上报,对于主动上报类型都必须在初始化通信方式(也就是发送获取版本号之后才能触发)。同时 HAL_KMD_FSM_HEARTBEAT0~HAL_KMD_BUS_HEARTBEAT4 的命令可以通过设置 user_config 数据进行配置,HAL_USER_CONFIG_CAN_HEARTBEAT_MS 命令会设置上报周期,非 0 值将启动上报,设备端会周期性检查使能的上报数据位,并对使能的数据进行周期性上报,而使能位则通过 HAL_USER_CONFIG_CAN_HEARTBEAT_CH 进行数据选择,更详细的请查阅 user_config 参数设置内容。