基于UART通讯控制TMC2208/2209模块驱动两相四线步进电机

电子说

1.4w人已加入

描述

@TOC


通讯控制

前言

前期已经介绍过TMC2208/2209模块的概述,两者区别,性能参数以及驱动电流的计算,就不再多赘述。
TMC2208/2209模块除了通过外部硬件控制驱动,还可以通过串口配置寄存器实现转速,方向,细分等设置来控制驱动,这篇主要介绍如何通过串口(UART)通讯控制TMC2208/2209模块驱动2相4线步进电机。

一、寄存器说明

用串口控制TMC2208/2209模块,就必须了解模块的相关寄存器有哪些,以及寄存器的每一位需要怎么设置。串口控制就是通过配置寄存器来控制驱动,这里以TMC2209为例进行说明。
通讯控制
通讯控制
通讯控制
通讯控制
通讯控制
通讯控制

二、UART的帧指令编写

写指令:长度为64位,0-7:8位帧头,8-15:8位设备地址,16-23:7位寄存器地址+读写位,24-55:32位数据写入,56-63:8位CRC校验。返回值为写入什么就回显什么。注意:寄存器地址需要加上写入位,即寄存器地址 | 0x80。
通讯控制
往0x00寄存器写入数据为例:帧头:0x55,设备地址可根据MS1和MS2引脚选择,这里使用默认地址:0x00,写入寄存器地址:0x00|0x80为0x80,写入数据:0x00000081,最后CRC校验,即帧指令为55 00 80 00 00 00 81 CRC。得到0x00寄存器配置:设置使用VREF为参考电压,微步分辨率由MSTEP寄存器选择。下面的读指令也是如此,不过寄存器地址不需要加读写位,寄存器本身地址就是读。

读指令:长度为32位,0-7位为帧头,8-15位为设备地址,16-23位为寄存器地址,24-31位为CRC校验。
通讯控制
读指令返回值:长度为64位,0-7位为帧头,8-15位为响应地址,16-23位为寄存器地址,24-55位为读取的数据,56-63位为CRC校验。
通讯控制
注意:CRC校验为标准的LSB-first CRC,是LSB到MSB,计算CRC不能用普通的CRC-8计算。CRC计算可以用手册给的示例进行计算。

void swuart_calcCRC(UCHAR* datagram, UCHAR datagramLength) 
{ 
	int i,j; 
	UCHAR* crc = datagram + (datagramLength-1); // CRC located in last byte of message 
	UCHAR currentByte; 
	*crc = 0; 
	for (i=0; i< (datagramLength-1); i++) {      
		currentByte = datagram[i];                
		// Execute for all bytes of a message 
		// Retrieve a byte to be sent from Array 
	for (j=0; j< 8; j++) { 
		if ((*crc > > 7) ^ (currentByte&0x01))   // update CRC based result of XOR operation 
		{ 
			*crc = (*crc < < 1) ^ 0x07; 
		} 
		else 
		{ 
			*crc = (*crc < < 1); 
		} 
		currentByte = currentByte > > 1; 
	} // for CRC bit 
	} // for message byte 
}

这里整理了一些帧指令,可直接使用。

05 00 80 00 00 00 C1 C9设置启动UART模式和寄存器控制微步,电机正转
05 00 80 00 00 00 C9 B9设置电机反转
05 00 90 00 00 00 00 50设置IRUN和IHOLD都为0,注意:电流不会降到0
05 00 91 00 20 10 04 24设置IRUN=16,IHOLD=4,IHOLDDELAY=0.5s
05 00 91 00 00 00 17 51设置TPOWER DOWN=0.5s
05 00 EC 10 00 00 03 AA设置1/256微步
05 00 EC 11 00 00 03 9B设置1/128微步
05 00 EC 12 00 00 03 31设置1/64微步
05 00 EC 13 00 00 03 00设置1/32微步
05 00 EC 14 00 00 03 64设置1/16微步
05 00 EC 15 00 00 03 55设置1/8微步
05 00 EC 16 00 00 03 FF设置1/4微步
05 00 EC 17 00 00 03 CE设置1/2微步
05 00 EC 18 00 00 03 CD设置全步
05 00 A2 00 00 FF 00 D9以61,440步频正转
05 00 A2 00 00 04 00 A0以1024步频正转
05 00 A2 FF FF FC 00 CE以1024步频反转
05 00 06 6F读IOIN
05 00 6C CA读CHOPCONF
05 00 70 62读PWMCONF
05 00 71 EB读PWM_SCALE
05 00 72 A5读PWM_AUTO

注意:TMC2208/2209模块没有掉电保存功能,配置完参数后如果掉电就会恢复为默认设置。

三、TMC2209串口连接

TMC2209串口采用单线uart,其连接方式如下:
通讯控制
根据手册可知,TMC2209可选择内部时钟或外部时钟,模块的CLK引脚默认下拉到GND,且其内部集成有步进脉冲发生器,可选择使用内部脉冲发生器提供脉冲信号还是使用外部脉冲发生器提供脉冲信号(0x22设置为0为外部脉冲模式,不为0内部脉冲模式),即如果使用外部发生器提供脉冲信号,STEP引脚就需要连接,反之悬空。而其他引脚悬空即可。
通讯控制

四、相关寄存器参数计算说明

看寄存器表,不是所有寄存器都和0x00寄存器那样在寄存器表就明确说明要写入什么数值,写入的数值指的是什么。没有明确说明的需要查看手册找到具体描述来确定需要写入什么数值,而且有些数值需要进行相应计算得出。这里以0x10和0x11寄存器为例说明。

0x10寄存器:
IRUN:电机运行电流
IHOLD:电机静止保持电流
根据上面的0x10寄存器描述可知,IRUN,IHOLD是写入0~31的值来设置电流,即将电流分为32等份。如何计算每等份电流多大,可根据手册给出的公式计算。
通讯控制
其中CS就是需要写入寄存器的值(0-31),RSE为0.11欧,Vfs为设置的参考电压。

IHOLDDELAY:决定电机从运行电流逐步降到静止电流的过渡时间,当检测到静止stst=1且TPOWERDOWN到时后,才开始平滑下降。共有 IRUN - IHOLD个电流步进下降,每一步延迟是2^18 / fclk的IHOLDDELAY倍,TMC2209内部时钟默认为fclk=12MHz,所以t ≈ 21.85ms x IHOLDDELAY。总下降时间:
通讯控制
最终到IHOLDDELAY的时间 = TPOWERDOWN + tramp,IHOLDDELAY取值 = 0~15,0表示无平滑。

0x11寄存器:
TPOWERDOWN:当驱动芯片检测到电机停止转动之后,不会马上切断电机保持电流,而是等待一段时间,这段时间就是TPOWERDOWN设置的延迟,时间设置范围0至5.6s。
通讯控制
TPOWERDOWN取值 = 0~255,0表示无延迟。
通讯控制
通过上面的计算来确定写入的值对应实际IRUN,IHOLD电流,IHOLDDELAY过渡时间,TPOWERDOWN延迟时间是多少。

五、用TMC220X配置器配置寄存器

除了通过对应帧指令配置寄存器外。还可以用TMC220X配置器配置寄存器,配置器只需要知道对应寄存器的作用,直接写入数值配置即可。不用知道该寄存器对应每一位需要写入什么数值,也不需要繁琐的计算,来编写帧指令配置寄存器。当然,TMC220X配置器不是所有寄存器都可以配置,只有一部分寄存器可配置。

TMC220X配置器安装:

  1. 安装脚本沟通器(适用于 Windows、Linux、MacOS)
  2. 下载TMC220X配置器
  3. 使用 ScriptCommunicator(脚本沟通器) 启动 TMC220X.scez 文件
  4. 选择芯片:TMC2208 或 TMC2209
  5. 选择串行端口并单击连接
  6. 配置器中的修改直接传输,即修改数值直接写入到寄存器。

如图所示:左边为相应寄存器,右边为需要写入的数值,设置参数推荐使用配置器来配置。
通讯控制
OTP则是0x05寄存器的配置,具体参数看上面的0x05寄存器配置表。
通讯控制

六、效果展示

通讯控制

通讯控制

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分