电子说
@TOC

前期已经介绍过TMC2208/2209模块的概述,两者区别,性能参数以及驱动电流的计算,就不再多赘述。
TMC2208/2209模块除了通过外部硬件控制驱动,还可以通过串口配置寄存器实现转速,方向,细分等设置来控制驱动,这篇主要介绍如何通过串口(UART)通讯控制TMC2208/2209模块驱动2相4线步进电机。
用串口控制TMC2208/2209模块,就必须了解模块的相关寄存器有哪些,以及寄存器的每一位需要怎么设置。串口控制就是通过配置寄存器来控制驱动,这里以TMC2209为例进行说明。





写指令:长度为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串口采用单线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配置器安装:
如图所示:左边为相应寄存器,右边为需要写入的数值,设置参数推荐使用配置器来配置。
OTP则是0x05寄存器的配置,具体参数看上面的0x05寄存器配置表。


审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !