TMC2300防丢步步进电机驱动芯片使用小结

概述

  TMC2300驱动电压2-11V,QFN3*3 20PIN。具有两种驱动方式(1.脉冲+方向引脚 2.单线串口),可实现无感负载测量,通过负载测量可实现电机的防丢步设计。

典型应用框图及引脚说明

 

STEP:  脉冲输入引脚    DIR :方向控制引脚  MODE:0:单线串口控制模式 1:脉冲+方向控制模式

AD0、AD1:在脉冲+方向模式下配置驱动细分,在单线串口模式下是硬件通讯地址。

DIAG:在单线串口模式下,可配置为脉冲输出,电机每步进一步输出一个脉冲。也可配置为丢步输出,当检测即将丢步时输出一个脉冲。

典型拓扑结构

通过配合TMC2300的AD0与AD1引脚,每个模拟开关后可以挂在4个驱动芯片。

 

 

重点寄存器说明

1.全局配置寄存器

 

 

2.速度设置寄存器(写入一个int型数据,int型数据的符号控制旋转方向)

   当速度写入0时,芯片可通过外部脉冲实现速度控制。即使在串口模式下,DIR方向控制引脚依然起作用。

 

3.负载寄存器,共10位有效位,但第0、第9位始终为0。当负载越大时该寄存器里的值越小。

 

 4.恒流斩波配置寄存器

mres0-3共4位用于步进电机的驱动细分配置,0-9分别对应256/128/64/32/16/8/4/2细分、整步

 

自己做的评估板

 

 

 

 

部分代码

 

uint8_t TMC2300_ReadWrite_buf[8] = { 0 };

void tmc2300_writeInt(uint8_t chip_address,uint8_t reg_address, int32_t value)
{
		TMC2300_ReadWrite_buf[0] = 0x05;
		TMC2300_ReadWrite_buf[1] = chip_address;
		TMC2300_ReadWrite_buf[2] = reg_address | 0x80;
		TMC2300_ReadWrite_buf[3] = (value >> 24) & 0xFF;
		TMC2300_ReadWrite_buf[4] = (value >> 16) & 0xFF;
		TMC2300_ReadWrite_buf[5] = (value >> 8 ) & 0xFF;
		TMC2300_ReadWrite_buf[6] = (value      ) & 0xFF;
		swuart_calcCRC(TMC2300_ReadWrite_buf, 8);

		HAL_UART_Transmit_DMA(&huart2, TMC2300_ReadWrite_buf, 8);
}

void tmc2300_readInt(uint8_t chip_address,uint8_t reg_address)
{

	TMC2300_ReadWrite_buf[0] = 0x05;
	TMC2300_ReadWrite_buf[1] = chip_address;
	TMC2300_ReadWrite_buf[2] = reg_address;

	swuart_calcCRC(TMC2300_ReadWrite_buf, 4);

	HAL_UART_Transmit_DMA(&huart2, TMC2300_ReadWrite_buf, 4);

}

void swuart_calcCRC(uint8_t* datagram, uint8_t datagramLength)
{
    int i,j;
    uint8_t* crc = datagram + (datagramLength-1); // CRC located in last byte of message
    uint8_t currentByte;
    *crc = 0;
    for (i=0; i<(datagramLength-1); i++)
    { // Execute for all bytes of a message
        currentByte = datagram[i]; // 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
}

  

 

posted @ 2022-08-17 15:34  90后大叔666  阅读(1281)  评论(0编辑  收藏  举报