淘宝上售卖的TMC2209模块引脚大都和这个图一样,简单对比一下就可以了,使用串口配置的话,只需要确定你的MS1和MS2引脚的高低电平,因为这决定了该模块的从机地址,如果你只有一个的话推荐两个都接地,这样从机地址就是0x00,如果你有天生反骨的话,那么就需要看数据手册,不过只有低两位会变,具体可以看下面给出的芯片手册。
有了设备地址之后我们先要了解一下TMC2209芯片的通信方式,首先我们要看一下引脚怎么接,这里有个坑,该模块引出的脚为默认第四脚,并不是第四和第五脚是通信的两个引脚,该芯片是用一个引脚进行收发,只不过主机发送引脚要接一个1K电阻。
可以看到模块上是通过一个0欧电阻实现的4,5脚选择,我当时就是因为这里怎么都通信不上,一度怀疑是自己的问题。
有了这些我们先来看一下发送数据格式,从芯片数据手册中我们可以看到,先发第四位同步码,然后高四位保留,然后是从机地址,然后是寄存器地址,和你要写入寄存器的数据,如果是接收就没有这个,最后是CRC校验码,这个可以根据手册上给出的程序直接用就OK的。
他这个图片上面极其的具有迷惑性,表格第二行说必须高位在前,但是串口是最低位先行,当时通信接口也接不上,也是怀疑人生了好久,最后也是看了几篇其他人的博客才知道正常写就行了,文章后面我会贴出来他们博客的原文链接。
接下来是读取的数据格式,这个就很简单了,但是要注意,写的时候需要把寄存器地址或上0x80,写的时候是不需要的。
我是需要使用步进电机做电流控制和转速控制,但是目前我只做了转速控制,所以实例只有控制转速和放方向的,首先我们通过数据手册找到控制速度的寄存器,如下图
使用该寄存器后,外部STEP接口将被禁用,也就是说,可以通过串口来指定速度,不需要配置主机定时器也可以控制,但是建议STEP引脚不要悬空,会受到外部干扰,导致没上电时电机误动。首先先发送同步码0x50,使芯片自适应波特率(不低于9000),然后发送从机地址,我这里都是接地的,所以是0x00,然后是寄存器地址,0x22|0x80,然后就是设定我们的电机速度了,但是这里还有一个坑,我们可以看到,在数据手册上写出的,high to low byte,也就是我们正常从高位往低位写就行了,不需要把数据反过来写(我在这里也调了半天速度),然后根据我的实测,虽然是32位数据,速度传感器需要24位数据,比如说这个速度0x00 0x00 0x00 0x22,它实际上是0,也就是说它的24位数据实际上是从前三个字节开始的,具体你们可以验证一下,然后就是使用程序生成CRC校验位了。附上本人的辣鸡程序(emmm,找不到代码格式咋写,直接贴上来吧)
#include <stdio.h>
// General Registers Addresses
typedef enum {
GCONF = 0x00,
GSTAT ,
IFCNT ,
SLAVECONF ,
OTP_PROG ,
OTP_READ ,
IOIN ,
FACTORY_CONF
}General_Registers;
// Velocity Dependent Control Addresses
typedef enum {
IHOLD_IRUN = 0x10,
TPOWER_DOWN ,
TSTEP ,
TPWMTHRS ,
VACTUAL = 0x22 , // 电机速度控制寄存器
TCOOLTHRS = 0x14 ,
SGTHRS = 0x40 ,
SG_RESULT ,
COOLCONF
}Velocity_Dependent;
//
#define SYNC 0X05
#define SLAVE_ADDR 0X00
#define READ_REG 0X00
#define WRIT_REG 0X80
//05 00 6C CA
//05 00 A2 00 00 02 00 55
//05 00 A2 00 00 00 22 D5
//05 00 A2 00 00 22 22 DA
//05 00 A2 00 22 22 22 F7
//05 00 A2 22 22 22 00 EF
//05 00 A2 82 22 22 00 A1 正转
//05 00 A2 FF FF FE 00 95 反转
typedef unsigned char UCHAR;
UCHAR write_de[8] = { SYNC, SLAVE_ADDR, VACTUAL | WRIT_REG, 0xF1, 0xF0, 0x22, 0x01, 0x00 };
UCHAR write_speed[8] = { SYNC, SLAVE_ADDR, VACTUAL | WRIT_REG, 0xFF, 0xFF, 0xFE, 0x00, 0x00 };
// 计算 CRC 校验和
void swuart_calcCRC(UCHAR* datagram, UCHAR datagramLength) {
int i, j;
UCHAR* crc = datagram + (datagramLength - 1); // CRC 存储在数据包的最后一个字节
UCHAR currentByte;
*crc = 0; // 初始化 CRC 为 0
for (i = 0; i < (datagramLength - 1); i++) { // 处理除最后一个字节外的所有字节
currentByte = datagram[i];
for (j = 0; j < 8; j++) { // 处理当前字节的每一位
if ((*crc >> 7) ^ (currentByte & 0x01)) {
*crc = (*crc << 1) ^ 0x07; // 如果 CRC 高位与当前字节最低位异或结果为 1,则 CRC 左移并异或多项式 0x07
} else {
*crc = (*crc << 1); // 否则,CRC 仅左移
}
currentByte = currentByte >> 1; // 当前字节右移处理下一位
}
}
}
int main(void)
{
UCHAR i;
swuart_calcCRC(read_buff, 4);
swuart_calcCRC(write_buff, 8);
swuart_calcCRC(write_speed, 8);
for (i = 0; i < 4; i++) {
printf(“%02x ”, read_buff[i]);
}
printf(“ ”);
for (i = 0; i < 8; i++) {
printf(“%02x ”, write_buff[i]);
}
printf(“ ”);
printf(“write_speed ”);
for (i = 0; i < 8; i++) {
printf(“%02x ”, write_speed[i]);
}
}
选择你想要的寄存器修改到数组中,运行程序你就可以得到你要通信的数据格式了(别问为啥不是单片机通讯,问就是公司太辣鸡了),下面附上运行结果
如果有能帮到你,请不要吝啬你的点赞
参考文章链接:
串口配置TMC2209电机驱动模块.
使用uart串口配置TMC2209模块.
BIGTREETECH WIKI
TMC2209
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/13332.html