SeanLib系列函数库-TMC5160

查看其它库函数说明,请点击此处跳转到SeanLib主页

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的数据手册,本库仅提供了寄存器地址的定义和读写方法。

相关推荐
万亿少女的梦1687 小时前
基于STM32F103C8T6与ASR Pro的语音控制四足机器人设计
stm32·语音识别·嵌入式系统·四足机器人·舵机控制
嵌入式-老费9 小时前
esp32开发与应用(与stm32f103工控板配合之上篇)
stm32·单片机·嵌入式硬件
周洲083011 小时前
裸机程序 vs RTOS架构深度对比|嵌入式项目选型标准、源码实战、优缺点全解析
stm32·嵌入式硬件
王光环1 天前
STM32H750串口一直进IRQ问题解决
stm32·单片机·嵌入式硬件
2401_854151551 天前
STM32 选项字节与读写保护(RDP)
stm32·单片机·嵌入式硬件
AI的探索之旅1 天前
AI Agent辅助立创EDA设计——从原理图到PCB
人工智能·stm32·硬件工程
振南的单片机世界1 天前
单片机:一颗芯片包办CPU、内存、外设的“单芯片计算机”
arm开发·stm32·单片机·嵌入式硬件
LuDvei2 天前
STM32串行通信DMA的使用
stm32·单片机·嵌入式硬件
似是燕归来2 天前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发