电机TMC260的寄存器如何配置

逸璞丷昊 2017-09-02 08:01:37
困惑好几天了,求助。。。求助。。。电机TMC260是通过SPI接口进行寄存器的指令配置的,我使用的STM32作为MCU,使用库函数进行代码设计的,该怎么去配置寄存器?库函数的SPI发送函数是发送16位的short int的,寄存器是二十位,我该怎么写入数据?
...全文
2629 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸璞丷昊 2019-03-01
  • 打赏
  • 举报
回复
引用 19 楼 逸璞丷昊 的回复:
[quote=引用 18 楼 天龙浩 的回复:] 可以分享下完整的STM32驱动TMC26x的代码吗???下载了你那个407驱动4个TMC的无法使用
已分享,可以到我的下载中去下载,慎重下载![/quote] https://blog.csdn.net/yishuicanhong/article/details/88061233 这是我设计的原理图,对应我分享的代码,有什么问题你可以留言,由于之前签有协议的原因,电路设计不能共享出来。
逸璞丷昊 2019-03-01
  • 打赏
  • 举报
回复
引用 18 楼 天龙浩 的回复:
可以分享下完整的STM32驱动TMC26x的代码吗???下载了你那个407驱动4个TMC的无法使用
已分享,可以到我的下载中去下载,慎重下载!
天龙浩 2019-03-01
  • 打赏
  • 举报
回复
可以分享下完整的STM32驱动TMC26x的代码吗???下载了你那个407驱动4个TMC的无法使用
逸璞丷昊 2019-02-28
  • 打赏
  • 举报
回复
引用 14 楼 liuyi1591537136 的回复:
请问 可以正常驱动电机了么,能否分享一下代码

实在抱歉,你的这条回复我没有注意到。已经完成刚好一年多了,代码共享在我的下载中
逸璞丷昊 2019-02-28
  • 打赏
  • 举报
回复
引用 15 楼 天龙浩 的回复:
各位大佬,我移植了你们的程序和按照协议重新写了,但是TMC2660写数据返回值都是乱七八糟的,电机也完全动不起来,请问这可能是什么问题??怎么判断SPI通讯成功??

现在记不太清楚了。请注意检查引脚接线和代码SPI协议是否写对,上电后应该会电机锁死,这是正常现象。如果没有,请检查电路设计,使能引脚和另一个功能引脚是否正确接线(忘记引脚名字了)。实在不行,我的下载资料里有电路设计和驱动代码,仅供参考。
天龙浩 2019-02-28
  • 打赏
  • 举报
回复
各位大佬,我移植了你们的程序和按照协议重新写了,但是TMC2660写数据返回值都是乱七八糟的,电机也完全动不起来,请问这可能是什么问题??怎么判断SPI通讯成功??
ly715715 2018-05-04
  • 打赏
  • 举报
回复
请问 可以正常驱动电机了么,能否分享一下代码
ly715715 2018-05-02
  • 打赏
  • 举报
回复
请问楼主TMC260可以正常驱动了么?能否分享一下代码
  • 打赏
  • 举报
回复
不知道你那电机动没动,貌似用spi控制要控制什么A,B相电流 又SIN又什么的 搞不懂 楼主弄得怎么样了 我现在是DIR/STEP模式
逸璞丷昊 2017-09-06
  • 打赏
  • 举报
回复
引用 3 楼 qq_20553613 的回复:
1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
我是不是可以理解为按照每个寄存器的功能得到该寄存器需要的命令值(20位),然后把五组20位数据发送给TMC芯片就是初始化配置了?求指点
逸璞丷昊 2017-09-06
  • 打赏
  • 举报
回复
引用 2 楼 uid123 的回复:
地址加偏移地址的方式,参考操作系统之类的教材。
没懂。。。
逸璞丷昊 2017-09-06
  • 打赏
  • 举报
回复
引用 1 楼 tianxj001 的回复:
是的,TMC260是20位帧传输格式的SPI 而STM32 好像只支持8&16位帧传输格式,所以,你没法直接用STM32的硬件SPI端口。 好在STM32速度足够快哈,所以编写一个软SPI驱动貌似也很简单嘛,就像我们编软串口、软I2C一样的弄。 仔细对照官方文档的时序,和下面表格的极限参数,驱动写出来应该很容易的。
嗯嗯,在试着自己用IO模拟SPI去写数据了,只是这款芯片的配置还是不太懂,模拟之后直接按照芯片手册的初始化方式发送五组配置命令就行了吗?
逸璞丷昊 2017-09-06
  • 打赏
  • 举报
回复
引用 8 楼 qq_20553613 的回复:
[quote=引用 7 楼 tianxj001 的回复:] [quote=引用 3 楼 qq_20553613 的回复:] 1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
stm32F1XX系列根本没有此功能,到stm32F0XX,也只是开始有了4-16位变动数据位选择 如果要做20位 必须选择10位 分2次发送 ,你说应该是更新的后续型号吧。 按照stm32F1XX属于基础型号来说,你这个方法性价比和可操作性都是问题。[/quote] 楼主可能理解我的意思了,我的意思不是动态位数发送;看tmc260的手册就知道,可以整字节发送,即发送3个字节(24位,从的我代码也可以看出来),高4位无效位tmc260会忽略的(很多非标准spi器件都会支持这个功能);目前,我用的tmc2660,兼容tmc260,stm32F1驱动,已在产品上使用。[/quote] 好厉害,我明白你的意思了,我发20位是通过IO模拟的,所以一次发送没有问题,回头我也好好看看32的SPI库函数发送,谢谢
tianxj001 2017-09-06
  • 打赏
  • 举报
回复
引用 8 楼 qq_20553613 的回复:
楼主可能理解我的意思了,我的意思不是动态位数发送;看tmc260的手册就知道,可以整字节发送,即发送3个字节(24位,从的我代码也可以看出来),高4位无效位tmc260会忽略的(很多非标准spi器件都会支持这个功能);目前,我用的tmc2660,兼容tmc260,stm32F1驱动,已在产品上使用。
才看明白,我以为你说的是STM32有变字长SPI功能,原来是tmc260有变字长接受高位0直接无视功能,那么你这样的方式就可以用8位spi硬件三次连续发送就可以了。简单方便。
Acuity. 2017-09-06
  • 打赏
  • 举报
回复
引用 6 楼 yishuicanhong 的回复:
[quote=引用 3 楼 qq_20553613 的回复:] 1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
我是不是可以理解为按照每个寄存器的功能得到该寄存器需要的命令值(20位),然后把五组20位数据发送给TMC芯片就是初始化配置了?求指点[/quote] 对的,就是这样;这个器件并没有普通器件的寄存器,按照它的格式发送20位数据即是设置了。
Acuity. 2017-09-06
  • 打赏
  • 举报
回复
引用 7 楼 tianxj001 的回复:
[quote=引用 3 楼 qq_20553613 的回复:] 1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
stm32F1XX系列根本没有此功能,到stm32F0XX,也只是开始有了4-16位变动数据位选择 如果要做20位 必须选择10位 分2次发送 ,你说应该是更新的后续型号吧。 按照stm32F1XX属于基础型号来说,你这个方法性价比和可操作性都是问题。[/quote] 楼主可能理解我的意思了,我的意思不是动态位数发送;看tmc260的手册就知道,可以整字节发送,即发送3个字节(24位,从的我代码也可以看出来),高4位无效位tmc260会忽略的(很多非标准spi器件都会支持这个功能);目前,我用的tmc2660,兼容tmc260,stm32F1驱动,已在产品上使用。
tianxj001 2017-09-06
  • 打赏
  • 举报
回复
引用 3 楼 qq_20553613 的回复:
1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
stm32F1XX系列根本没有此功能,到stm32F0XX,也只是开始有了4-16位变动数据位选择 如果要做20位 必须选择10位 分2次发送 ,你说应该是更新的后续型号吧。 按照stm32F1XX属于基础型号来说,你这个方法性价比和可操作性都是问题。
Acuity. 2017-09-05
  • 打赏
  • 举报
回复
1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
uid123 2017-09-04
  • 打赏
  • 举报
回复
地址加偏移地址的方式,参考操作系统之类的教材。
tianxj001 2017-09-03
  • 打赏
  • 举报
回复
是的,TMC260是20位帧传输格式的SPI 而STM32 好像只支持8&16位帧传输格式,所以,你没法直接用STM32的硬件SPI端口。
好在STM32速度足够快哈,所以编写一个软SPI驱动貌似也很简单嘛,就像我们编软串口、软I2C一样的弄。

仔细对照官方文档的时序,和下面表格的极限参数,驱动写出来应该很容易的。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧