CGcontroller/tmc5160_driver/tmc5160.h

312 lines
17 KiB
C
Raw Permalink 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.

/**
* @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 */