[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);
}
[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);
}
发布评论