[STM32][TMC2660]关于TMC2660电机驱动芯片的初始化操作

TMC2660通过SPI进行芯片参数的控制,一共需要初始化5个参数,具体参数含义可在数据手册上查到,这里不再做过多解释。

直接贴代码,根据自己的平台自行移植即可。

#define     REG_DRVCTRL                         0X00000000
#define     REG_CHOPCONF                        0X00080000
#define     REG_SMARTEN                         0X000A0000
#define     REG_SGCSCONF                        0X000C0000
#define     REG_DRVCONF                         0X000E0000

#define SET_BUS_MODE_DRVCONF                    0x000E0000	   // 设置工作在SETP/DIR模式
#define SET_SETP_DIR_MODE_DRVCTR                0x00000104	   // 默认16细分,可以根据实际修改细分数 双脉冲沿模式  0x00000004->单脉冲 0x00000104->双脉冲
#define SET_SETP_DIR_MODE_DRVCTR2               0x00000000	   // 默认16细分,可以根据实际修改细分数 双脉冲沿模式  0x00000004->单脉冲 0x00000104->双脉冲
#define SET_CURRENT_MODE_SGCSCONF               0x000C0000	   //设置线圈电流、力矩,默认最小1/32
#define SET_COOLSTEP_MODE_SMARTEN               0x000A0000	   //1/4CS
#define SET_CHOPPER_MODE_CHOPCONF               0x00080000	   //设置斩波模式,可以根据实际情况更改




void motor_tmc_config( uint32_t param )
{
    spi_cs_control( SPI_CS_ENABLE );

    spi_readwritebyte( (uint8_t)(param>>16) );
    spi_readwritebyte( (uint8_t)(param>>8) );
    spi_readwritebyte( (uint8_t)param );
    
    spi_cs_control( SPI_CS_DISABLE );
    
}



// 初始化配置TMC参数
void motor_tmc_param_init( void )
{
//    motor_tmc_config( SET_CHOPPER_MODE_CHOPCONF|0X000812BA );
//    motor_tmc_config( SET_COOLSTEP_MODE_SMARTEN|0X000A2468 );
    
//    motor_tmc_config( SET_CHOPPER_MODE_CHOPCONF|0x000901B4 );
//    motor_tmc_config( SET_COOLSTEP_MODE_SMARTEN|0X000A0202 );
//    motor_tmc_config( SET_BUS_MODE_DRVCONF | 0x0050 );
//    motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 );
//    motor_tmc_config( SET_CURRENT_MODE_SGCSCONF|0x000C0000 );
//    
//    motor_curr_set( 30 );
    // CHOPCONF 0x801B1 8-地址  1B(18)-正弦波偏移:B(3)快速衰减时间 1-缓慢衰减阶段的持续时间 对噪声影响大
    // SMARTEN  0xA0202 A-地址  智控电流
    // DRVCONF  0xEA140 E-地址  A-坡度控制:高位和低位均为10:中间值  1-短接到地检测定时器 1.2us 4-作为电流设定的采样电阻值边界:165mV重要,对噪声影响大
    // DRVCTR   0x00000 0-地址  000-256细分
    // SGCSCONF 0xC0000 C-地址  其余默认参数 后5位,电流,驱动能力
    motor_tmc_config( SET_CHOPPER_MODE_CHOPCONF | 0x000801B1 );
    motor_tmc_config( SET_COOLSTEP_MODE_SMARTEN|0X000A0202 );
    motor_tmc_config( SET_BUS_MODE_DRVCONF | 0x000EA140  );
    
    // 细分设置
    //motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 );
    switch( m_param.subdiv )
    {
    case 1:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x08 );
        break;
    case 2:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x07 );
        break;
    case 4:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x06 );
        break;
    case 8:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x05 );
        break;
    case 16:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x04 );
        break;
    case 32:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x03 );
        break;
    case 64:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x02 );
        break;
    case 128:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x01 );
        break;
    case 256:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x00 );
        break;
    
    default:
        motor_tmc_config( SET_SETP_DIR_MODE_DRVCTR2 | 0x00 );
        break;
    }
    
    motor_tmc_config( SET_CURRENT_MODE_SGCSCONF|0x000C0000 );
    
    motor_curr_set( 80 );
}



void motor_curr_set( uint16_t power )
{
    uint32_t tTorqueVal = 0;	    //线圈电流设置为零

    tTorqueVal = (tTorqueVal|(uint32_t)((float)((float)(31*power)/(float)250)));

    motor_tmc_config( SET_CURRENT_MODE_SGCSCONF | tTorqueVal );
}




/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
* Function Name  : SPI_ReadWriteByte
* Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
* Input          : uint8_t TxData 待发送的数
* Output         : None
* Return         : uint8_t RxData 收到的数
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
uint8_t spi_readwritebyte( uint8_t data )
{
    uint32_t over_time = 10000;
    
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
    {
        over_time--;
        if ( over_time == 0 )
            break;
//        wdog_feed();
    }
    SPI_SendData8( SPI2, data );
    over_time = 10000;
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
    {
        over_time--;
        if ( over_time == 0 )
            break;
//        wdog_feed();
    }

    return SPI_ReceiveData8(SPI2);
}


 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的STM32驱动TMC5031步进电机控制器的示例代码: ```c #include "stm32f1xx_hal.h" #include "tmc5031.h" // 定义SPI句柄 SPI_HandleTypeDef hspi1; // 初始化函数 void TMC5031_Init(void) { // 配置SPI hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } // 初始化TMC5031 TMC5031_Reset(); TMC5031_Setup(); } // 重置函数 void TMC5031_Reset(void) { // 将RESET引脚拉低 HAL_GPIO_WritePin(TMC5031_RESET_GPIO_Port, TMC5031_RESET_Pin, GPIO_PIN_RESET); HAL_Delay(1); // 将RESET引脚拉高 HAL_GPIO_WritePin(TMC5031_RESET_GPIO_Port, TMC5031_RESET_Pin, GPIO_PIN_SET); HAL_Delay(1); } // 设置函数 void TMC5031_Setup(void) { // 配置寄存器,详见TMC5031手册 TMC5031_WriteRegister(TMC5031_GCONF, 0x00000001); TMC5031_WriteRegister(TMC5031_IHOLD_IRUN, 0x00011F00); TMC5031_WriteRegister(TMC5031_TPOWERDOWN, 0x0000000A); } // 读取寄存器函数 uint32_t TMC5031_ReadRegister(uint8_t address) { uint8_t txData[4]; uint8_t rxData[4]; uint32_t result; // 构造发送数据 txData[0] = address | 0x80; txData[1] = 0x00; txData[2] = 0x00; txData[3] = 0x00; // 发送SPI数据 HAL_GPIO_WritePin(TMC5031_CS_GPIO_Port, TMC5031_CS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, txData, rxData, 4, 1000); HAL_GPIO_WritePin(TMC5031_CS_GPIO_Port, TMC5031_CS_Pin, GPIO_PIN_SET); // 解析返回数据 result = (rxData[0] << 24) | (rxData[1] << 16) | (rxData[2] << 8) | rxData[3]; return result; } // 写入寄存器函数 void TMC5031_WriteRegister(uint8_t address, uint32_t value) { uint8_t txData[4]; // 构造发送数据 txData[0] = address; txData[1] = (value >> 24) & 0xFF; txData[2] = (value >> 16) & 0xFF; txData[3] = (value >> 8) & 0xFF; // 发送SPI数据 HAL_GPIO_WritePin(TMC5031_CS_GPIO_Port, TMC5031_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, txData, 4, 1000); HAL_GPIO_WritePin(TMC5031_CS_GPIO_Port, TMC5031_CS_Pin, GPIO_PIN_SET); } // 步进电机控制函数 void TMC5031_Move(int32_t steps, uint32_t speed) { uint32_t status; uint32_t velocity; uint32_t acceleration; // 读取当前状态 status = TMC5031_ReadRegister(TMC5031_DRV_STATUS); // 获取速度和加速度 velocity = (speed * 256) / 200; acceleration = (velocity * 256) / 500; // 配置运动参数 TMC5031_WriteRegister(TMC5031_VSTART, velocity / 2); TMC5031_WriteRegister(TMC5031_A1, acceleration); TMC5031_WriteRegister(TMC5031_V1, velocity); TMC5031_WriteRegister(TMC5031_AMAX, acceleration * 2); TMC5031_WriteRegister(TMC5031_VMAX, velocity * 2); TMC5031_WriteRegister(TMC5031_DMAX, acceleration * 2); TMC5031_WriteRegister(TMC5031_D1, acceleration); TMC5031_WriteRegister(TMC5031_VSTOP, velocity / 2); // 启动运动 TMC5031_WriteRegister(TMC5031_RAMPMODE, 0x00000001); TMC5031_WriteRegister(TMC5031_XTARGET, status + steps); // 等待运动完成 while ((TMC5031_ReadRegister(TMC5031_DRV_STATUS) & 0x00000080) == 0) { HAL_Delay(1); } } ``` 需要根据具体的硬件电路进行修改,包括SPI接口和步进电机控制器的引脚等。同时,还需要根据TMC5031的手册进行寄存器配置和参数设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值