187 lines
5.9 KiB
C
187 lines
5.9 KiB
C
/**
|
|
* @file emm_v5.h
|
|
* @brief Emm_V5.0 步进闭环电机驱动器 - ESP-IDF 组件
|
|
* @author 移植自 Arduino 版本 (原作者: ZHANGDATOU)
|
|
*
|
|
* 通信协议: UART, 115200bps, 8N1
|
|
* 使用方式:
|
|
* Emm_V5_Init(UART_NUM_1, GPIO_NUM_6, GPIO_NUM_7);
|
|
*/
|
|
|
|
#ifndef EMM_V5_H
|
|
#define EMM_V5_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include "driver/uart.h"
|
|
#include "driver/gpio.h"
|
|
#include "esp_log.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================
|
|
* 可配置常量
|
|
* ============================================================ */
|
|
#define EMM_V5_UART_BAUDRATE 115200
|
|
#define EMM_V5_UART_BUF_SIZE 256
|
|
|
|
/* 接收超时时间 (毫秒) */
|
|
#define EMM_V5_RX_TIMEOUT_MS 100
|
|
|
|
/* ============================================================
|
|
* 系统参数枚举 (与 Arduino 版本一致)
|
|
* ============================================================ */
|
|
typedef enum {
|
|
S_VER = 0, /* 读取固件版本和对应的硬件版本 */
|
|
S_RL = 1, /* 读取相电阻和相电感 */
|
|
S_PID = 2, /* 读取PID参数 */
|
|
S_VBUS = 3, /* 读取总线电压 */
|
|
S_CPHA = 5, /* 读取相电流 */
|
|
S_ENCL = 7, /* 读取经过线性化校准后的编码器值 */
|
|
S_TPOS = 8, /* 读取电机目标位置角度 */
|
|
S_VEL = 9, /* 读取电机实时转速 */
|
|
S_CPOS = 10, /* 读取电机实时位置角度 */
|
|
S_PERR = 11, /* 读取电机位置误差角度 */
|
|
S_FLAG = 13, /* 读取使能/到位/堵转状态标志位 */
|
|
S_Conf = 14, /* 读取驱动参数 */
|
|
S_State = 15, /* 读取系统状态参数 */
|
|
S_ORG = 16, /* 读取正在回零/回零失败状态标志位 */
|
|
} EmmSysParams_t;
|
|
|
|
/* ============================================================
|
|
* API 函数声明
|
|
* ============================================================ */
|
|
|
|
/**
|
|
* @brief 初始化 UART 和 LED GPIO
|
|
* @param port UART 端口号, 如 UART_NUM_1
|
|
* @param tx_pin TX 引脚, 如 GPIO_NUM_6
|
|
* @param rx_pin RX 引脚, 如 GPIO_NUM_7
|
|
*/
|
|
void Emm_V5_Init(uart_port_t port, int tx_pin, int rx_pin);
|
|
|
|
/**
|
|
* @brief 将当前位置清零
|
|
* @param addr 电机地址
|
|
*/
|
|
void Emm_V5_Reset_CurPos_To_Zero(uint8_t addr);
|
|
|
|
/**
|
|
* @brief 解除堵转保护
|
|
* @param addr 电机地址
|
|
*/
|
|
void Emm_V5_Reset_Clog_Pro(uint8_t addr);
|
|
|
|
/**
|
|
* @brief 读取系统参数
|
|
* @param addr 电机地址
|
|
* @param s 系统参数类型 (@see EmmSysParams_t)
|
|
*/
|
|
void Emm_V5_Read_Sys_Params(uint8_t addr, EmmSysParams_t s);
|
|
|
|
/**
|
|
* @brief 修改开环/闭环控制模式
|
|
* @param addr 电机地址
|
|
* @param svF 是否存储, false=不存储, true=存储
|
|
* @param ctrl_mode 控制模式: 0=关闭脉冲输入, 1=开环, 2=闭环, 3=En复用为限位/到位输出
|
|
*/
|
|
void Emm_V5_Modify_Ctrl_Mode(uint8_t addr, bool svF, uint8_t ctrl_mode);
|
|
|
|
/**
|
|
* @brief 使能信号控制
|
|
* @param addr 电机地址
|
|
* @param state 使能状态, true=使能, false=关闭
|
|
* @param snF 多机同步标志, false=不启用, true=启用
|
|
*/
|
|
void Emm_V5_En_Control(uint8_t addr, bool state, bool snF);
|
|
|
|
/**
|
|
* @brief 速度模式控制
|
|
* @param addr 电机地址
|
|
* @param dir 方向, 0=CW, 其他=CCW
|
|
* @param vel 速度 0~5000 RPM
|
|
* @param acc 加速度 0~255 (0=直接启动)
|
|
* @param snF 多机同步标志, false=不启用, true=启用
|
|
*/
|
|
void Emm_V5_Vel_Control(uint8_t addr, uint8_t dir, uint16_t vel, uint8_t acc, bool snF);
|
|
|
|
/**
|
|
* @brief 位置模式控制
|
|
* @param addr 电机地址
|
|
* @param dir 方向, 0=CW, 其他=CCW
|
|
* @param vel 速度 0~5000 RPM
|
|
* @param acc 加速度 0~255 (0=直接启动)
|
|
* @param clk 脉冲数 0~(2^32-1)
|
|
* @param raF 相位/绝对标志, false=相对运动, true=绝对运动
|
|
* @param snF 多机同步标志, false=不启用, true=启用
|
|
*/
|
|
void Emm_V5_Pos_Control(uint8_t addr, uint8_t dir, uint16_t vel, uint8_t acc,
|
|
uint32_t clk, bool raF, bool snF);
|
|
|
|
/**
|
|
* @brief 立即停止电机 (所有控制模式通用)
|
|
* @param addr 电机地址
|
|
* @param snF 多机同步标志, false=不启用, true=启用
|
|
*/
|
|
void Emm_V5_Stop_Now(uint8_t addr, bool snF);
|
|
|
|
/**
|
|
* @brief 触发多机同步开始运动
|
|
* @param addr 电机地址
|
|
*/
|
|
void Emm_V5_Synchronous_motion(uint8_t addr);
|
|
|
|
/**
|
|
* @brief 设置单圈回零的零点位置
|
|
* @param addr 电机地址
|
|
* @param svF 是否存储, false=不存储, true=存储
|
|
*/
|
|
void Emm_V5_Origin_Set_O(uint8_t addr, bool svF);
|
|
|
|
/**
|
|
* @brief 修改回零参数
|
|
* @param addr 电机地址
|
|
* @param svF 是否存储, false=不存储, true=存储
|
|
* @param o_mode 回零模式: 0=单圈就近, 1=单圈方向, 2=多圈无限位碰撞, 3=多圈有限位开关
|
|
* @param o_dir 回零方向, 0=CW, 其他=CCW
|
|
* @param o_vel 回零速度 (RPM)
|
|
* @param o_tm 回零超时时间 (ms)
|
|
* @param sl_vel 碰撞检测转速 (RPM)
|
|
* @param sl_ma 碰撞检测电流 (mA)
|
|
* @param sl_ms 碰撞检测时间 (ms)
|
|
* @param potF 上电自动回零, false=不使能, true=使能
|
|
*/
|
|
void Emm_V5_Origin_Modify_Params(uint8_t addr, bool svF, uint8_t o_mode,
|
|
uint8_t o_dir, uint16_t o_vel, uint32_t o_tm,
|
|
uint16_t sl_vel, uint16_t sl_ma, uint16_t sl_ms, bool potF);
|
|
|
|
/**
|
|
* @brief 触发回零
|
|
* @param addr 电机地址
|
|
* @param o_mode 回零模式: 0=单圈就近, 1=单圈方向, 2=多圈无限位碰撞, 3=多圈有限位开关
|
|
* @param snF 多机同步标志, false=不启用, true=启用
|
|
*/
|
|
void Emm_V5_Origin_Trigger_Return(uint8_t addr, uint8_t o_mode, bool snF);
|
|
|
|
/**
|
|
* @brief 强制中断并退出回零
|
|
* @param addr 电机地址
|
|
*/
|
|
void Emm_V5_Origin_Interrupt(uint8_t addr);
|
|
|
|
/**
|
|
* @brief 接收电机返回数据 (100ms 超时判定帧结束)
|
|
* @param rxCmd 接收缓冲区
|
|
* @param maxLen 缓冲区最大长度
|
|
* @return 实际接收到的字节数
|
|
*/
|
|
uint8_t Emm_V5_Receive_Data(uint8_t *rxCmd, uint8_t maxLen);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* EMM_V5_H */
|