/** * @file tmc5160.h * @brief TMC5160 步进电机驱动芯片驱动头文件 * @note 支持 SPI 和 UART 双接口通信 * 支持完整的运动控制、StallGuard4 堵转检测、StealthChop/SpreadCycle * 适用于 STM32F103C8T6 + HAL 库 */ #ifndef __TMC5160_H #define __TMC5160_H #include "stm32f1xx_hal.h" /* ======================== 通信接口类型 ======================== */ typedef enum { TMC5160_INTERFACE_SPI, /* SPI 接口 */ TMC5160_INTERFACE_UART /* 单线 UART 接口 */ } TMC5160_Interface; /* ======================== 斜坡模式 ======================== */ typedef enum { TMC5160_MODE_POSITION = 0, /* 定位模式(梯形/S形斜坡) */ TMC5160_MODE_VEL_POS = 1, /* 正向速度模式 */ TMC5160_MODE_VEL_NEG = 2, /* 反向速度模式 */ TMC5160_MODE_HOLD = 3 /* 保持模式(速度为零) */ } TMC5160_RampMode; /* ======================== 细分设置 ======================== */ typedef enum { TMC5160_MRES_256 = 0, /* 256 细分 */ TMC5160_MRES_128 = 1, TMC5160_MRES_64 = 2, TMC5160_MRES_32 = 3, TMC5160_MRES_16 = 4, TMC5160_MRES_8 = 5, TMC5160_MRES_4 = 6, TMC5160_MRES_2 = 7, TMC5160_MRES_1 = 8 /* 整步 */ } TMC5160_MicrostepRes; /* ======================== 寄存器地址定义 ======================== */ /* --- 通用配置寄存器 --- */ #define TMC5160_GCONF 0x00 /* 全局配置 */ #define TMC5160_GSTAT 0x01 /* 全局状态标志 */ #define TMC5160_IFCNT 0x02 /* UART 接口计数器 */ #define TMC5160_SLAVECONF 0x03 /* UART 从机配置 */ #define TMC5160_IOIN 0x04 /* IO 输入引脚状态(读) */ #define TMC5160_OUTPUT 0x04 /* IO 输出控制(写) */ #define TMC5160_X_COMPARE 0x05 /* 位置比较寄存器 */ #define TMC5160_OTP_PROG 0x06 /* OTP 编程 */ #define TMC5160_OTP_READ 0x07 /* OTP 读取 */ #define TMC5160_FACTORY_CONF 0x08 /* 工厂配置 */ #define TMC5160_SHORT_CONF 0x09 /* 短路保护配置 */ #define TMC5160_DRV_CONF 0x0A /* 驱动配置 */ #define TMC5160_GLOBAL_SCALER 0x0B /* 全局电流缩放 (0=256) */ #define TMC5160_OFFSET_READ 0x0C /* 偏移读取 */ /* --- 速度相关控制寄存器 --- */ #define TMC5160_IHOLD_IRUN 0x10 /* 保持/运行电流及延迟 */ #define TMC5160_TPOWERDOWN 0x11 /* 停止后降低电流的延迟时间 */ #define TMC5160_TSTEP 0x12 /* 实际步进间隔时间(只读) */ #define TMC5160_TPWMTHRS 0x13 /* StealthChop 速度上限阈值 */ #define TMC5160_TCOOLTHRS 0x14 /* CoolStep/StallGuard 速度下限阈值 */ #define TMC5160_THIGH 0x15 /* 高速模式切换阈值 */ /* --- 斜坡发生器寄存器 --- */ #define TMC5160_RAMPMODE 0x20 /* 斜坡模式选择 */ #define TMC5160_XACTUAL 0x21 /* 当前实际位置 */ #define TMC5160_VACTUAL 0x22 /* 当前实际速度(只读) */ #define TMC5160_VSTART 0x23 /* 起始速度 */ #define TMC5160_A1 0x24 /* 第一段加速度 */ #define TMC5160_V1 0x25 /* 第一段目标速度 */ #define TMC5160_AMAX 0x26 /* 最大加速度 */ #define TMC5160_VMAX 0x27 /* 最大速度 */ #define TMC5160_DMAX 0x28 /* 最大减速度 */ #define TMC5160_D1 0x2A /* 第一段减速度 */ #define TMC5160_VSTOP 0x2B /* 停止速度(建议 >=10) */ #define TMC5160_TZEROWAIT 0x2C /* 到达零速后等待时间 */ #define TMC5160_XTARGET 0x2D /* 目标位置 */ /* --- 斜坡状态寄存器 --- */ #define TMC5160_SW_MODE 0x34 /* 参考开关与StallGuard停止配置 */ #define TMC5160_RAMP_STAT 0x35 /* 斜坡状态标志 */ #define TMC5160_XLATCH 0x36 /* 锁存位置 */ /* --- 编码器寄存器 --- */ #define TMC5160_ENCMODE 0x38 /* 编码器模式配置 */ #define TMC5160_X_ENC 0x39 /* 编码器位置 */ #define TMC5160_ENC_CONST 0x3A /* 编码器常数 */ #define TMC5160_ENC_STATUS 0x3B /* 编码器状态 */ #define TMC5160_ENC_LATCH 0x3C /* 编码器锁存位置 */ #define TMC5160_ENC_DEVIATION 0x3D /* 编码器偏差允许值 */ /* --- 斩波器与驱动寄存器 --- */ #define TMC5160_CHOPCONF 0x6C /* 斩波器配置 */ #define TMC5160_COOLCONF 0x6D /* CoolStep 与 StallGuard 配置 */ #define TMC5160_DCCTRL 0x6E /* DC 步进控制 */ #define TMC5160_DRV_STATUS 0x6F /* 驱动状态(只读) */ #define TMC5160_PWMCONF 0x70 /* StealthChop PWM 配置 */ #define TMC5160_PWM_SCALE 0x71 /* PWM 缩放值(只读) */ #define TMC5160_PWM_AUTO 0x72 /* PWM 自动调节值(只读) */ #define TMC5160_LOST_STEPS 0x73 /* 丢步计数(只读) */ /* ======================== GCONF 位定义 ======================== */ #define TMC5160_GCONF_RECALIBRATE (1UL << 0) #define TMC5160_GCONF_FASTSTANDSTILL (1UL << 1) #define TMC5160_GCONF_EN_PWM_MODE (1UL << 2) /* 启用 StealthChop */ #define TMC5160_GCONF_MULTISTEP_FILT (1UL << 3) #define TMC5160_GCONF_SHAFT (1UL << 4) /* 反转电机方向 */ #define TMC5160_GCONF_DIAG0_ERROR (1UL << 5) #define TMC5160_GCONF_DIAG0_OTPW (1UL << 6) #define TMC5160_GCONF_DIAG0_STALL (1UL << 7) /* DIAG0 输出堵转信号 */ #define TMC5160_GCONF_DIAG1_STALL (1UL << 8) /* DIAG1 输出堵转信号 */ #define TMC5160_GCONF_DIAG1_INDEX (1UL << 9) #define TMC5160_GCONF_DIAG1_ONSTATE (1UL << 10) #define TMC5160_GCONF_DIAG1_STEPS_SKIPPED (1UL << 11) #define TMC5160_GCONF_DIAG0_PUSHPULL (1UL << 12) #define TMC5160_GCONF_DIAG1_PUSHPULL (1UL << 13) #define TMC5160_GCONF_SMALL_HYSTERESIS (1UL << 14) #define TMC5160_GCONF_STOP_ENABLE (1UL << 15) #define TMC5160_GCONF_DIRECT_MODE (1UL << 16) #define TMC5160_GCONF_TEST_MODE (1UL << 17) /* ======================== DRV_STATUS 位定义 ======================== */ #define TMC5160_DRV_SG_RESULT_MASK 0x3FFUL /* StallGuard 结果 [9:0] */ #define TMC5160_DRV_S2VSA (1UL << 12) #define TMC5160_DRV_S2VSB (1UL << 13) #define TMC5160_DRV_STEALTH (1UL << 14) /* StealthChop 活跃 */ #define TMC5160_DRV_FSACTIVE (1UL << 15) /* 全步模式活跃 */ #define TMC5160_DRV_CS_ACTUAL_MASK (0x1FUL << 16) /* 实际电流 [20:16] */ #define TMC5160_DRV_CS_ACTUAL_SHIFT 16 #define TMC5160_DRV_STALLGUARD (1UL << 24) /* StallGuard 标志 */ #define TMC5160_DRV_OT (1UL << 25) /* 过温关断 */ #define TMC5160_DRV_OTPW (1UL << 26) /* 过温预警 */ #define TMC5160_DRV_S2GA (1UL << 27) /* A相对地短路 */ #define TMC5160_DRV_S2GB (1UL << 28) /* B相对地短路 */ #define TMC5160_DRV_OLA (1UL << 29) /* A相开路 */ #define TMC5160_DRV_OLB (1UL << 30) /* B相开路 */ #define TMC5160_DRV_STST (1UL << 31) /* 电机静止 */ /* ======================== RAMP_STAT 位定义 ======================== */ #define TMC5160_RS_STOP_L (1UL << 0) /* 左限位开关触发 */ #define TMC5160_RS_STOP_R (1UL << 1) /* 右限位开关触发 */ #define TMC5160_RS_LATCH_L (1UL << 2) #define TMC5160_RS_LATCH_R (1UL << 3) #define TMC5160_RS_EV_STOP_L (1UL << 4) /* 左限位停止事件 */ #define TMC5160_RS_EV_STOP_R (1UL << 5) /* 右限位停止事件 */ #define TMC5160_RS_EV_STOP_SG (1UL << 6) /* StallGuard 停止事件 */ #define TMC5160_RS_EV_POS_REACHED (1UL << 7) /* 到达目标位置事件 */ #define TMC5160_RS_VEL_REACHED (1UL << 8) /* 到达目标速度 */ #define TMC5160_RS_POS_REACHED (1UL << 9) /* 位置已到达 */ #define TMC5160_RS_VZERO (1UL << 10) /* 速度为零 */ #define TMC5160_RS_ZEROWAIT (1UL << 11) /* 零速等待中 */ #define TMC5160_RS_SECOND_MOVE (1UL << 12) /* 第二次运动 */ #define TMC5160_RS_SG (1UL << 13) /* StallGuard 实时状态 */ /* ======================== CHOPCONF 位偏移 ======================== */ #define TMC5160_CHOPCONF_TOFF_MASK 0x0FUL #define TMC5160_CHOPCONF_HSTRT_SHIFT 4 #define TMC5160_CHOPCONF_HEND_SHIFT 7 #define TMC5160_CHOPCONF_TBL_SHIFT 15 #define TMC5160_CHOPCONF_VHIGHFS (1UL << 18) #define TMC5160_CHOPCONF_VHIGHCHM (1UL << 19) #define TMC5160_CHOPCONF_MRES_SHIFT 24 #define TMC5160_CHOPCONF_INTPOL (1UL << 28) /* 256细分插值 */ #define TMC5160_CHOPCONF_DEDGE (1UL << 29) #define TMC5160_CHOPCONF_DISS2G (1UL << 30) #define TMC5160_CHOPCONF_DISS2VS (1UL << 31) /* ======================== StallGuard 回调函数类型 ======================== */ typedef void (*TMC5160_StallCallback)(void); /* ======================== TMC5160 句柄结构体 ======================== */ typedef struct { TMC5160_Interface interface; /* 通信接口类型 */ /* SPI 接口相关 */ SPI_HandleTypeDef *hspi; /* SPI 句柄指针 */ GPIO_TypeDef *cs_port; /* 片选 GPIO 端口 */ uint16_t cs_pin; /* 片选 GPIO 引脚 */ /* UART 接口相关 */ UART_HandleTypeDef *huart; /* UART 句柄指针 */ uint8_t slave_addr; /* UART 从机地址 (0-3) */ /* 运行状态 */ uint8_t spi_status; /* 最近一次 SPI 状态字节 */ /* StallGuard 回调 */ TMC5160_StallCallback stall_callback; } TMC5160_HandleTypeDef; /* ======================== 初始化配置结构体 ======================== */ typedef struct { uint8_t run_current; /* 运行电流 0-31 (IRUN) */ uint8_t hold_current; /* 保持电流 0-31 (IHOLD) */ uint8_t hold_delay; /* 保持延迟 0-15 (IHOLDDELAY) */ uint8_t global_scaler; /* 全局电流缩放 0-255, 0表示256 */ TMC5160_MicrostepRes microstep_res; /* 细分设置 */ uint8_t en_pwm_mode; /* 1=StealthChop, 0=SpreadCycle */ uint8_t shaft; /* 电机方向 0/1 */ uint8_t interpolation; /* 256细分插值 0/1 */ uint8_t toff; /* 斩波器关断时间 (3-15, 推荐3-5) */ uint8_t tbl; /* 比较器空白时间 (0-3, 推荐2) */ uint8_t hstrt; /* 迟滞起始值 (0-7) */ uint8_t hend; /* 迟滞结束值 (0-15, 实际值 -3~12) */ } TMC5160_InitTypeDef; /* ======================== 函数声明 ======================== */ /* ---------- 底层寄存器读写 ---------- */ void TMC5160_WriteRegister(TMC5160_HandleTypeDef *htmc, uint8_t reg, uint32_t value); uint32_t TMC5160_ReadRegister(TMC5160_HandleTypeDef *htmc, uint8_t reg); /* ---------- 初始化与复位 ---------- */ HAL_StatusTypeDef TMC5160_Init(TMC5160_HandleTypeDef *htmc, TMC5160_InitTypeDef *config); void TMC5160_DeInit(TMC5160_HandleTypeDef *htmc); uint32_t TMC5160_GetVersion(TMC5160_HandleTypeDef *htmc); /* ---------- 运动控制 ---------- */ void TMC5160_SetRampMode(TMC5160_HandleTypeDef *htmc, TMC5160_RampMode mode); void TMC5160_MoveTo(TMC5160_HandleTypeDef *htmc, int32_t position); void TMC5160_MoveBy(TMC5160_HandleTypeDef *htmc, int32_t offset); void TMC5160_Rotate(TMC5160_HandleTypeDef *htmc, int32_t velocity); void TMC5160_Stop(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsPositionReached(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsVelocityReached(TMC5160_HandleTypeDef *htmc); /* ---------- 位置与速度读写 ---------- */ void TMC5160_SetTargetPosition(TMC5160_HandleTypeDef *htmc, int32_t position); int32_t TMC5160_GetTargetPosition(TMC5160_HandleTypeDef *htmc); void TMC5160_SetActualPosition(TMC5160_HandleTypeDef *htmc, int32_t position); int32_t TMC5160_GetActualPosition(TMC5160_HandleTypeDef *htmc); int32_t TMC5160_GetActualVelocity(TMC5160_HandleTypeDef *htmc); /* ---------- 斜坡参数设置 ---------- */ void TMC5160_SetVMAX(TMC5160_HandleTypeDef *htmc, uint32_t vmax); void TMC5160_SetAMAX(TMC5160_HandleTypeDef *htmc, uint32_t amax); void TMC5160_SetDMAX(TMC5160_HandleTypeDef *htmc, uint32_t dmax); void TMC5160_SetV1(TMC5160_HandleTypeDef *htmc, uint32_t v1); void TMC5160_SetA1(TMC5160_HandleTypeDef *htmc, uint32_t a1); void TMC5160_SetD1(TMC5160_HandleTypeDef *htmc, uint32_t d1); void TMC5160_SetVSTART(TMC5160_HandleTypeDef *htmc, uint32_t vstart); void TMC5160_SetVSTOP(TMC5160_HandleTypeDef *htmc, uint32_t vstop); void TMC5160_SetTZEROWAIT(TMC5160_HandleTypeDef *htmc, uint32_t tzerowait); /* ---------- 电流控制 ---------- */ void TMC5160_SetRunCurrent(TMC5160_HandleTypeDef *htmc, uint8_t current); void TMC5160_SetHoldCurrent(TMC5160_HandleTypeDef *htmc, uint8_t current); void TMC5160_SetIHoldIRun(TMC5160_HandleTypeDef *htmc, uint8_t ihold, uint8_t irun, uint8_t iholddelay); void TMC5160_SetGlobalScaler(TMC5160_HandleTypeDef *htmc, uint8_t scaler); /* ---------- 斩波器配置 ---------- */ void TMC5160_SetChopConf(TMC5160_HandleTypeDef *htmc, uint8_t toff, uint8_t hstrt, uint8_t hend, uint8_t tbl); void TMC5160_SetMicrostepResolution(TMC5160_HandleTypeDef *htmc, TMC5160_MicrostepRes mres); void TMC5160_EnableInterpolation(TMC5160_HandleTypeDef *htmc, uint8_t enable); /* ---------- StealthChop / SpreadCycle ---------- */ void TMC5160_EnableStealthChop(TMC5160_HandleTypeDef *htmc, uint8_t enable); void TMC5160_SetPWMConf(TMC5160_HandleTypeDef *htmc, uint32_t pwmconf); void TMC5160_SetTPWMTHRS(TMC5160_HandleTypeDef *htmc, uint32_t tpwmthrs); /* ---------- StallGuard4 堵转检测 ---------- */ void TMC5160_SetStallGuardThreshold(TMC5160_HandleTypeDef *htmc, int8_t sgt); void TMC5160_SetTCOOLTHRS(TMC5160_HandleTypeDef *htmc, uint32_t tcoolthrs); void TMC5160_SetTHIGH(TMC5160_HandleTypeDef *htmc, uint32_t thigh); uint16_t TMC5160_GetStallGuardResult(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsStalled(TMC5160_HandleTypeDef *htmc); void TMC5160_EnableStallGuardStop(TMC5160_HandleTypeDef *htmc, uint8_t enable); void TMC5160_SetStallCallback(TMC5160_HandleTypeDef *htmc, TMC5160_StallCallback cb); void TMC5160_StallGuardPoll(TMC5160_HandleTypeDef *htmc); /* ---------- CoolStep 自适应电流 ---------- */ void TMC5160_SetCoolConf(TMC5160_HandleTypeDef *htmc, uint32_t coolconf); void TMC5160_ConfigCoolStep(TMC5160_HandleTypeDef *htmc, uint8_t semin, uint8_t semax, uint8_t seup, uint8_t sedn, uint8_t seimin); /* ---------- 状态查询 ---------- */ uint32_t TMC5160_GetDrvStatus(TMC5160_HandleTypeDef *htmc); uint32_t TMC5160_GetRampStat(TMC5160_HandleTypeDef *htmc); uint32_t TMC5160_GetGStat(TMC5160_HandleTypeDef *htmc); void TMC5160_ClearGStat(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_GetCurrentCS(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsOverTemp(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsOverTempWarning(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsShortToGround(TMC5160_HandleTypeDef *htmc); uint8_t TMC5160_IsOpenLoad(TMC5160_HandleTypeDef *htmc); uint32_t TMC5160_GetTStep(TMC5160_HandleTypeDef *htmc); /* ---------- 电机方向 ---------- */ void TMC5160_SetDirection(TMC5160_HandleTypeDef *htmc, uint8_t shaft); /* ---------- 编码器 ---------- */ void TMC5160_SetEncMode(TMC5160_HandleTypeDef *htmc, uint32_t encmode); int32_t TMC5160_GetEncPosition(TMC5160_HandleTypeDef *htmc); void TMC5160_SetEncPosition(TMC5160_HandleTypeDef *htmc, int32_t position); void TMC5160_SetEncConst(TMC5160_HandleTypeDef *htmc, uint32_t enc_const); /* ---------- 限位开关配置 ---------- */ void TMC5160_SetSWMode(TMC5160_HandleTypeDef *htmc, uint32_t sw_mode); uint32_t TMC5160_GetSWMode(TMC5160_HandleTypeDef *htmc); /* ---------- 功率管理 ---------- */ void TMC5160_SetTPOWERDOWN(TMC5160_HandleTypeDef *htmc, uint8_t tpowerdown); /* ---------- DIAG 引脚配置 ---------- */ void TMC5160_ConfigDiag0(TMC5160_HandleTypeDef *htmc, uint8_t stall, uint8_t error, uint8_t otpw); void TMC5160_ConfigDiag1(TMC5160_HandleTypeDef *htmc, uint8_t stall, uint8_t index, uint8_t onstate); #endif /* __TMC5160_H */