完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
1.TMC260
TCM260是德国TRINAMIC公司产的步进电机驱动芯片,综合性能应该是步进电机驱动芯片中排前列的,当然价格也是。TMC260程序上兼容TMC2660、TMC262,其中TMC2660是比较新的型号,驱动电流也比TMC260要大;TMC262是外置mos管,可驱动大功率步进电机,如57步进电机等。在之前“用过的几款步进电机驱动IC”的文章中,有简单介绍过,因此有坛友发私信或者留言询问该芯片的驱动程序,所以总结下自己的使用经验。 其实集成步进电机驱动芯片,对于驱动电机来说是非常简易,通过脉冲方波或者总线(spi、i2c)发送指令即可驱动。TMC260也不例外,TMC260有两种驱动电机转动的方式,一是通过脉冲方波,二是通过spi接口发送指令。但是TMC260中有关参数的设置必须通过spi接口进行操作,如电流大小(力矩)、细分步矩角以及获取状态信息等。 对于spi发送命令的控制方式,可能会存在延时,特别是一类总线为了便于用户层调用,对spi总线进行了多层封装的情况下,如在RTOS中。为提高电机速度,鄙人用的是第一种方式,通过脉冲方波控制电机转动,电机的相关参数则通过spi总线设置或者获取。对于转动控制则比较好理解和实现,通过定时器或者PWM输出控制“STEP”引脚即可,脉冲频率的高低控制转动速度的快慢;控制方向通过普通IO口控制“DIRECT”引脚高低电平切换,故这块不作赘述。下面重点介绍下spi配置参数方面,如果参数没有正确配置,也是无法控制电机转动或者出现转动噪音大的情况。 2.TMC260 SPI总线实现 spi总线依然是基于“spi抽象/硬件spi”中的spi封装函数。 首先定义TMC260 spi总线指针设备和TMC260指针设备。 源码中,命名是TMC2660,因为后面更换使用为TMC2660,但程序完全兼容。 static struct spi_dev_device tmc2660_spi_dev[1];//暂时只有一个电机 static struct spi_bus_device spi_bus0; 第二步,实现spi 总线片选函数,即是普通IO口翻转。 static void spi0_cs(unsigned char state) { if (state) GPIO_SetBits(TMC2660_PORTY_CS, TMC2660_GPIOY_CS); else GPIO_ResetBits(TMC2660_PORTY_CS, TMC2660_GPIOY_CS); } 第三步,TMC260收发函数实现。 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); } 其中: —TMC260 spi是非标spi,一帧完整的数据是20bit,可以通过硬件spi驱动,无效位会自动忽略,如下图,从手册中获悉,使用24bit(3字节)传输,高4bit会自动忽略。所以这里还是用硬件spi。 —20bit的数据,spi设置为8bit模式,所以最少需要3字节(24bit)的缓存。 —返回值即是芯片的状态信息,每发一帧都会有相关信息返回。 —输入参数,分别是spi端口号和待写的数据。 —从时序图分析,用到的是spi封装函数中的“spi_send_recv”,即是发送完成同时也完成数据的接收,效率非常高。 3.TMC260 寄存器配置 TMC260严格来说没有标准寄存器,在一串20bit的串行数据流中,以高3位选择不同的功能,后面17位表示数据,包括写入或者返回的状态数据。 每一个寄存器都有详细的描述和使用方式,代码中进行宏定义。 #define REG_DRVCTRL 0X00000000 #define REG_CHOPCONF 0X00080000 #define REG_SMARTEN 0X000A0000 #define REG_SGCSCONF 0X000C0000 #define REG_DRVCONF 0X000E0000 1)REG_DRVCTRL 控制寄存器,如设置电流细分,其中细分数从1到256。 #define MICROSTEP_256 0X00 #define MICROSTEP_128 0X01 #define MICROSTEP_64 0X02 #define MICROSTEP_32 0X03 #define MICROSTEP_16 0X04 #define MICROSTEP_8 0X05 #define MICROSTEP_4 0X06 #define MICROSTEP_2 0X07 #define MICROSTEP_1 0X08 函数如下: void tmc2660_set_subdivide(char mode,u8 motor_index) { u8 step = 0; u32 cmd = 0; switch(mode) { case 0: step = MICROSTEP_1; break; case 1: step = MICROSTEP_2; break; case 2: step = MICROSTEP_4; break; case 3: step = MICROSTEP_8; break; case 4: step = MICROSTEP_16; break; case 5: step = MICROSTEP_32; break; case 6: step = MICROSTEP_64; break; case 7: step = MICROSTEP_128; break; case 8: step = MICROSTEP_256; break; default: step = MICROSTEP_16; break; } cmd = REG_DRVCTRL | step; tmc2660_spi_xfer(motor_index,cmd); } 2)REG_CHOPCONF 暂未用到。 3)REG_SMARTEN 智能设置,默认自动模式,暂未用到。 4)REG_SGCSCONF 配置寄存器,如设定最大输出电流,即是电机力矩。 void tmc2660_set_force(u8 force,u8 motor_index) { u8 temp; int cmd = 0; temp = force/8; cmd = REG_SGCSCONF | SCG_DEFAULT | temp; tmc2660_spi_xfer(motor_index,cmd); } 5)REG_DRVCONF 动力相关配置寄存器,如可以选择大电流模式,或者普通模式。 大电流模式: tmc2660_spi_xfer(0,REG_DRVCONF | 0X0010); 普通模式: tmc2660_spi_xfer(0,REG_DRVCONF | 0X0050); 4.TMC260初始化 void tmc2660_init(u8 motor_index) { GPIO_InitTypeDef GPIO_InitStructure; //spi io RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC,ENABLE); //spi cs PA4 GPIO_InitStructure.GPIO_Pin = TMC2660_GPIOY_CS; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TMC2660_PORTY_CS, &GPIO_InitStructure); //device init stm32f1xx_spi_init(&spi_bus0,8,0,0); tmc2660_spi_dev[0].spi_cs = spi0_cs; tmc2660_spi_dev[0].spi_bus = &spi_bus0; //enable GPIO_InitStructure.GPIO_Pin = TMC2660_GPIOY_EN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TMC2660_PORTY_EN,&GPIO_InitStructure); //step GPIO_InitStructure.GPIO_Pin = TMC2660_GPIOY_STEP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TMC2660_PORTY_STEP,&GPIO_InitStructure); //dir GPIO_InitStructure.GPIO_Pin = TMC2660_GPIOY_DIR; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TMC2660_PORTY_DIR,&GPIO_InitStructure); //原点光电开关 PB11 GPIO_InitStructure.GPIO_Pin = SenseY_GPIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(SenseY_PORT, &GPIO_InitStructure); TMC2660_OUTY_CS = 1; TMC2660_OUTY_EN = 0; //enable TMC2660_OUTY_DIR = 0; //正反转控制 tmc2660_spi_xfer(YMOTOR,REG_DRVCONF | 0X0050); //0X0010->305mV 0X0050->165mV 与电机电流相关 tmc2660_spi_xfer(YMOTOR,REG_DRVCTRL | MICROSTEP_16); tmc2660_spi_xfer(YMOTOR,0x901b4); //0x94557 tmc2660_spi_xfer(YMOTOR,0xa0202); //0xa0202->1/2CS 0xa8202->1/4CS tmc2660_spi_xfer(YMOTOR,REG_SGCSCONF | SCG_DEFAULT | 0x00); //后5位为电流大小 tmc2660_set_force(0,YMOTOR); tmc2660_set_subdivide(0x04,YMOTOR); } 主要功能包括: 1)IO口初始化,步进控制、方向控制、使能控制、原点位置等IO口初始化。 2)spi总线指针初始化。 3)TMC2660控制芯片默认参数配置。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:47 , Processed in 0.826552 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号