
1. 本篇内容
本篇介绍TMC5160步进电机驱动芯片的操作函数库,TMC5160用于驱动两相四线制步进电机,支持脉冲、SPI方式控制。
2. 使用说明
要使用本库,请将TMC5160.lib和TMC5160.h添加到工程中。
本库依赖两个外部函数 Sean_Send、Sean_Recv,请在SeanLib.c中实现。
2.1 头文件介绍
头文件中定义了TMC5160芯片的所有寄存器:
c
/******** 通用配置寄存器 *************************************************************/
#define TMC_GCONF_ADDR 0x00 //GCONF 全局配置标志
#define TMC_TEST_MODE (0x00000001 << 17) //使能Test Mode,使能引脚ENCN _ DCO上的模拟测试输出
#define TMC_DIRECT_MODE (0x00000001 << 16) //使能direct_mode,电机线圈电流和极性通过串行接口直接编程
#define TMC_STOP_ENABLE (0x00000001 << 15) //紧急停止: ENCA_DCIN在高电平时停止定序器
#define TMC_HYSTERESIS (0x00000001 << 14) //步进step频率的比较磁滞是1/32,设置0是1/16
#define TMC_DIAG1_MODE (0x00000001 << 13) //SWP_DIAG1推挽输出(高电平有效),默认集电级开路输出
#define TMC_DIAG0_MODE (0x00000001 << 12) //SWN_DIAG0推挽输出(高电平有效),默认集电级开路输出
#define TMC_DIAG1_STEPS_SKIPPED (0x00000001 << 11) //使能DIAG1在dcStep模式下失步时翻转输出信号(LOST_STEPS增加)
#define TMC_DIAG1_ONSTATE (0x00000001 << 10) //使能DIAG1输出斩波器导通阶段指示信号
#define TMC_DIAG1_INDEX (0x00000001 << 9) //使能DIAG1输出 索引位置信号
#define TMC_DIAG1_STALL_DIR (0x00000001 << 8) //SD_MODE=1时输出电机堵转信号,SD_MODE=0时输出方向信号
#define TMC_DIAG0_STALL_STEP (0x00000001 << 7) //SD_MODE=1时输出电机堵转有效信号,SD_MODE=0时输出步进STEP信号
#define TMC_DIAG0_OTPW (0x00000001 << 6) //使能DIAG0输出驱动器过热预警( otpw )指示信号,仅 SD_MODE=1
#define TMC_DIAG0_ERROR (0x00000001 << 5) //使能DIAG0输出故障指示信号:过温、对地短路、电荷泵欠压
#define TMC_SHAFT (0x00000001 << 4) //电机反向
#define TMC_STEP_FILTER (0x00000001 << 3) //使用外部步进STEP输入源时候,使能步进STEP输入滤波器
#define TMC_PWM_MODE (0x00000001 << 2) //使能stealthChop电压PWM模式
#define TMC_FASTSANDSTILL (0x00000001 << 1) //使用较短的步进信号的超时时长,超过该时间输出静止标志
#define TMC_RECALIBRATE (0x00000001 << 0) //驱动器禁用期间的过零重新校准(通过ENN或TOFF设置)
#define TMC_GSTAT_ADDR 0x01 //全局状态标志寄存器地址
#define TMC_IS_RESET(reg) (((reg) & 0x00000001) > 0) //芯片已复位
#define TMC_IS_ERROR(reg) (((reg) & 0x00000002) > 0) //发生错误
#define TMC_IS_UNDERVOL(reg) (((reg) & 0x00000004) > 0) //欠压
#define TMC_IFCNT_ADDR 0x02 //接口传输计数器
#define TMC_SLAVE_CONF_ADDR 0x03 //设置UART接口的单元地址和SENDDELAY
#define TMC_IOIN_ADDR 0x04 //高8位芯片版本,低8位所有可用输入引脚的状态
#define TMC_DRV_CONF_ADDR 0x0A //MOSFET的驱动配置
//bit 0 -4 BBMTIME, 导通前的延时时间,以时间为单位
//bit 8 -11 BBMCLKS, 导通前的延时时间,以时钟周期数为单位
//bit 16-17 OTSELECT, 选择桥关断的过温级别,冷却至120°C / OTPW后恢复
//bit 18-19 DRVSTRENGTH, 栅极驱动器电流的选择。根据外部MOSFETs的栅极电荷选择栅极驱动电流
//bit 20-21 FILT_ISENSE, 采样运放的滤波时间常数,以减小另一线圈的振铃和耦合
#define TMC_GLOBAL_SCALER_ADDR 0x0B //电机电流的全局缩放[8bits]
/********** 速度相关的驱动特性控制寄存器 **********************************************/
#define TMC_CURRENT_ADDR 0x10 //驱动电流控制寄存器地址
#define TMC_DELAY_HOLD 6
#define TMC_CURRENT(run,hold) ((TMC_DELAY_HOLD << 16) | ((run) << 8) | (hold))
//计算方法:(DELAY << 16) | (I_RUN << 8) | I_HOLD
//I_HOLD:静止状态电机电流, I_RUN:运行电流, DELAY:降电流时钟周期
//IHOLD = 12 //0-32
//IRUN = 24 //0-32 建议大于16
//HOLDDELAY = 6 //进入保持状态的延时时间
#define TMC_TPOWER_DOWN_ADDR 0x11 //设置电机静止后到电机开始降电流的之间的延时时间
#define TMC_TPWMTHRS_ADDR 0x13 //stealthChop 电压PWM 模式的上限速度
/********** 斜坡发生器运动寄存器 *****************************************************/
#define TMC_MODE_ADDR 0x20 //模式寄存器地址
#define TMC_MODE_POSITION 0x00000000 //位置模式(使用所有A、D和V参数)
#define TMC_MODE_ACCEL 0x00000001 //速度模式到正VMAX (使用AMAX加速度)
#define TMC_MODE_DCCEL 0x00000002 //速度模式至负VMAX (使用AMAX加速度)
#define TMC_MODE_HOLD 0x00000003 //保持模式(除非发生停止事件,否则速度保持不变)
#define TMC_XACTUAL_ADDR 0x21 //实际电机位置,在位置模式下,修改内容将启动一个运动[32bits]
#define TMC_VACTUAL_ADDR 0x22 //斜坡发生器产生的实际电机速度[24bits]
#define TMC_VSTART_ADDR 0x23 //电机起动速度寄存器地址[18bits]
#define TMC_A1_ADDR 0x24 //VSTART和V1之间的加速度[16bits]
#define TMC_V1_ADDR 0x25 //第一加速/减速阶段阈值速度[20bits]
#define TMC_NOT_A1 0x00000000 //写0仅使用AMAX和DMAX
#define TMC_AMAX_ADDR 0x26 //V1和VMAX之间的加速度,这是速度模式的加速度和减速值[16bits]
#define TMC_VMAX_ADDR 0x27 //运动斜坡目标速度寄存器地址[23bits]
#define TMC_DMAX_ADDR 0x28 //VMAX和V1之间的减速度[16bits]
#define TMC_D1_ADDR 0x2A //V1和VSTOP之间的减速度[16bits]
#define TMC_VSTOP_ADDR 0x2B //电机停止速度寄存器地址[18]
#define TMC_TZEROWAIT_ADDR 0x2C //下一次移动或方向反转开始前,下降到零速度后的等待时间。时间范围约为0至2秒[16bits]
/********** 斜坡发生器驱动特性控制寄存器组 ******************************************/
#define TMC_SW_MODE_ADDR 0x34 //开关模式配置
#define TMC_SOFT_STOP 0x00000800 //使能软停,默认硬停
#define TMC_POL_STOP_R 0x00000008 //反转右参考开关,低电平有效,默认高电平有效
#define TMC_POL_STOP_L 0x00000004 //反转左参考开关,低电平有效,默认高电平有效
#define TMC_STOP_R_EN 0x00000002 //使能右参考开关,有效时电机停止,恢复时电机启动
#define TMC_STOP_L_EN 0x00000001 //使能左参考开关,有效时电机停止,恢复时电机启动
#define TMC_RAMP_STAT_ADDR 0x35 //RAMP_STAT 斜坡和参考开关状态寄存器
//#define TMC_IS_STOP(reg) (((reg) & 0x0400) > 0) //电机实际速度为0
#define TMC_XLATCH 0x36 //斜坡发生器锁存位置,在可编程开关事件时锁存XACTUAL
/********** 电机驱动寄存器 *********************************************************/
#define TMC_CHOPCONF_ADDR 0x6C //斩波器配置寄存器
#define TMC_DIS_SHORT_TO_VS (0x0000001 << 31) //禁用对电源的短路保护
#define TMC_DIS_SHORT_TO_GND (0x0000001 << 30) //禁用对地的短路保护
#define TMC_DOUBLE_EDGE (0x0000001 << 29) //使能每个STEP脉冲边缘采样,以降低步进STEP信号的频率要求
#define TMC_INT_POL256 (0x0000001 << 28) //使能256微步插值,实际微步分辨率( MRES )被插值至256微步
#define TMC_MRES(mres) (((mres) & 0x0000000F) << 24) //降低微步分辨率,0-8分别表示细分256、128、64...1
#define TMC_TPFD(tpfd) (((tpfd) & 0x0000000F) << 20) //降低电机的中程共振,被动快速衰减时间设置控制电桥极性变化后插入的快速衰减阶段的持续时间
#define TMC_VHIGHCHM (0x0000001 << 19) //高速斩波模式
#define TMC_VHIGHFS (0x0000001 << 18) //高速全步选择
#define TMC_TBL(tbl) (((tbl) & 0x000000003) << 15) //消影时间选择
#define TMC_CHM (0x0000001 << 14) //斩波方式,具有快速衰减时间的恒定关闭时间
#define TMC_DIS_FDCC (0x0000001 << 12) //禁用快速衰减模式,仅chm为1时有效
#define TMC_HEND_OFFSET(v) (((v) & 0x0000000F) << 7) //chm=1时,为正弦波偏移量,chm=0时为磁滞低值
#define TMC_HSTRT(hstrt) (((hstrt) & 0x0000007) << 4) //chm=0时有效,磁滞起始值累加到HEND
#define TMC_TFD(tfd) ((((tfd) & 0x00000008) << 7) | (((tfd) & 0x00000007) << 4)) //chm=1时有效,快衰减时间设置
#define TMC_TOFF(toff) ((toff) & 0x0000000F) //关断时间和驱动器使能
#define TMC_COOLCONF_ADDR 0x6D //coolStep 智能电流控制寄存器和stallGuard 2配置
#define TMC_DCCTRL_ADDR 0x6E //dcStep ( DC )自动换向配置寄存器
#define TMC_DRV_STAT_ADDR 0x6F //stallGuard2值和驱动错误标志寄存器
#define TMC_IS_STOP(reg) (((reg) & 0x80000000) > 0) //停止指示
#define TMC_IS_AOC(reg) (((reg) & 0x40000000) > 0) //A相开路,仅低速时有效
#define TMC_IS_BOC(reg) (((reg) & 0x20000000) > 0) //B相开路,仅低速时有效
#define TMC_IS_BESC(reg) (((reg) & 0x10000000) > 0) //B相对地短路
#define TMC_IS_AESC(reg) (((reg) & 0x08000000) > 0) //A相对地短路
#define TMC_IS_OT(reg) (((reg) & 0x04000000) > 0) //过温预警
#define TMC_IS_LR(reg) (((reg) & 0x01000000) > 0) //堵转,容易误报
#define TMC_IS_BPSC(reg) (((reg) & 0x00002000) > 0) //B相对电源短路
#define TMC_IS_APSC(reg) (((reg) & 0x00001000) > 0) //A相对电源短路
#define TMC_HAS_ERROR(reg) (((reg) & 0x1A003000) > 0) //除堵转之外的报警
#define TMC_PWMCONF_ADDR 0x70 //电压脉宽调制模式寄存器
另外定义一个设备结构体,以及两个外部函数的声明:
c
//定义一个TMC5160芯片的对象结构体
typedef struct
{
unsigned int CS_Pin; //CS信号的位带区地址
void (*Write) (unsigned char, unsigned int); //写寄存器函数指针
unsigned int (*Read) (unsigned char); //读寄存器函数指针
}TMC5160_t;
/* 外部函数声明,根据需要在SeanLib.c中实现 *************************************/
//数据发送函数
extern void Sean_Send (void * Dev, unsigned char * Data, unsigned short Len);
//数据接收函数
unsigned short Sean_Recv (void * Dev, unsigned char * Data, unsigned short MaxLen);
2.2 创建芯片设备
使用下面的函数创建芯片设备指针:
c
/*******************************************************************************
* 功 能: 创建一个TMC5160芯片控制的马达对象
* 参 数:
* PinAddr_CS : 片选引脚,如 BITBAND_ADDR(GPIOD->ODR, 5)
* 返回值: 创建成功,返回马达设备指针,否则返回空指针NULL
*******************************************************************************/
extern TMC5160_t * NewTMC5160 (unsigned int PinAddr_CS);
示例:
c
TMC5160_t * Motor;
Motor = NewTMC5160(BITBAND_ADDR(GPIOA->ODR, 4)); //创建一个马达
if (Motor == NULL)
{
Error_Handle(0, "Creat motor failed!");
}
//芯片初始化
Motor->Write(TMC_CHOPCONF_ADDR, TMC_CHOPCONF); //CHOPCONF: TOFF=3, HSTRT=4, HEND=1, TBL=2, CHM=0 (spreadCycle)
Motor->Write(TMC_TPOWER_DOWN_ADDR, TMC_TPOWERDOWN); //TPOWERDOWN=10: 电机静止到电流减小之间的延时
Motor->Write(TMC_GCONF_ADDR, TMC_GCONF); //EN_PWM_MODE=1 enables stealthChop (缺省 PWM_CONF 值)
Motor->Write(TMC_TPWMTHRS_ADDR, TMC_TPWMTHRS); //TPWM_THRS=500 对应切换速度 35000 = ca. 30RPM
Motor->Write(TMC_V1_ADDR, TMC_NOT_A1); //不使用二段加减速
#if ONLY_USE_REF_PIN //如果仅使用参考引脚控制电机运行,则需要更新TMC的速度寄存器
{
Motor->Write(TMC_VMAX_ADDR, Config.Speed * Config.PEL); //设置运行速度
Motor->Write(TMC_SW_MODE_ADDR, TMC_SOFT_STOP | TMC_STOP_L_EN); //设置软停、使能左参考开关
}
#else //不使用参考引脚控制电机运行时,仅设置软停
{
Motor->Write(TMC_SW_MODE_ADDR, TMC_SOFT_STOP); //设置软停
}
#endif
Motor->Write(TMC_VSTART_ADDR, Config.VStart * TMC_SPEED_MUL); //设置启动速度
Motor->Write(TMC_VSTOP_ADDR, Config.VStop * TMC_SPEED_MUL); //设置停止速度
Motor->Write(TMC_AMAX_ADDR, Config.Accel * TMC_SPEED_MUL); //设置加速度
Motor->Write(TMC_DMAX_ADDR, Config.Dccel * TMC_SPEED_MUL); //设置减速度
Motor->Write(TMC_CURRENT_ADDR, TMC_CURRENT(Config.IRun, Config.IHold)); //设置电流控制寄存器
Motor->Write(TMC_MODE_ADDR, TMC_MODE_ACCEL); //加速运动模式
初始化完成,就可以控制马达运动了。
3. 其它
速度计算:
c
#define FCLK 12000000 //时钟频率,内部时钟12MHz
#define PERIOD ((0x00000001 << 24) / FCLK) //速度控制的时钟周期,2^24/FLCK
#define SUBDIVIDE 256 //细分数
#define STEP_ANGLE 1.8f //步距角
#define REDUCTION_RATIO 10 //齿轮减速比
#define TMC_SPEED_MUL 11930 //速度比值
//计算公式:PERIOD * SUBDIVIDE * (360 / STEP_ANGLE) * REDUCTION_RATIO / 60(rpm->rps)
//速度(uStep/s)=目标速度(rpm)*TMC_SPEED_MUL
关于马达的运动控制方法,请查阅TMC5160的数据手册,本库仅提供了寄存器地址的定义和读写方法。