基于STM32的TMC5160步进电机独立模式驱动方案
TMC5160是一款高集成度步进电机驱动芯片,支持三种不同的控制模式。本文重点介绍第三种模式——独立运行模式(Standalone Mode),该模式下无需SPI通信,仅需配置GPIO引脚并输出脉冲信号即可驱动电机。
工作模式配置
TMC5160通过SD_MODE和SPI_MODE两个引脚电平组合确定工作模式:
| SD_MODE | SPI_MODE | 工作模式 | 说明 |
|---|---|---|---|
| 低电平 | 高电平 | SPI模式 | 通过SPI配置寄存器,内部梯形曲线发生器控制运动 |
| 高电平 | 高电平 | SPI+脉冲/方向 | SPI配置参数,外部脉冲控制运动 |
| 高电平 | 低电平 | 独立模式 | CFG引脚配置,外部脉冲控制,无需MCU |
独立模式适合简单的运动控制场景,硬件连接简化,成本降低。
硬件连接设计
以STM32F103为例,引脚映射关系如下:
| TMC5160引脚 | STM32引脚 | 功能说明 |
|---|---|---|
| STEP | PA8 | 步进脉冲输入 |
| DIR | PA5 | 方向控制 |
| EN | PA6 | 使能信号 |
| SD_MODE | PB1 | 模式选择(接高) |
| SPI_MODE | PB0 | 模式选择(接低) |
| CFG0-CFG6 | PB2, PB12-PB15 | 细分等参数配置 |
软件实现
GPIO初始化
配置各功能引脚为推挽输出模式:
void TMC5160_Standalone_Init(void)
{
GPIO_InitTypeDef GPIO_Config;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// PA5(DIR), PA6(EN), PA7(CFG相关), PA8(STEP)
GPIO_Config.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;
GPIO_Config.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Config.Pull = GPIO_PULLUP;
GPIO_Config.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_Config);
// PB0(SPI_MODE), PB1(SD_MODE), PB2, PB12-PB15(CFG配置)
GPIO_Config.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2
| GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOB, &GPIO_Config);
// 设置独立模式:SD_MODE=1, SPI_MODE=0
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
// 使能驱动
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
// 方向设置(正转)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
// CFG配置引脚电平设置(根据需要的细分等级调整)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2 | GPIO_PIN_15, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}
脉冲生成与速度控制
采用定时器中断方式在PA8产生方波脉冲。系统时钟72MHz,预分频72,自动重装载值500,中断周期0.5ms,翻转两次形成完整脉冲,输出频率1kHz。
volatile uint32_t pulse_cnt = 0;
volatile uint8_t step_level = 0;
void TIM_Step_IRQHandler(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
// 电平翻转生成脉冲
step_level ^= 1;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, step_level ? GPIO_PIN_SET : GPIO_PIN_RESET);
// 仅在上升沿计数(或下降沿,保持一致即可)
if(step_level)
{
pulse_cnt++;
// 每转一圈暂停(假设16细分,200步/转)
if(pulse_cnt >= 3200)
{
HAL_TIM_Base_Stop_IT(&htim3);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
// 延时2秒后重启
HAL_Delay(2000);
pulse_cnt = 0;
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_TIM_Base_Start_IT(&htim3);
}
}
}
}
转速计算
电机转速与脉冲频率的换算关系:
转速(rpm) = (脉冲频率 × 60) / (每转脉冲数)
以1.8°步距角电机、16细分为例:
- 每转所需脉冲 = 200 × 16 = 3200个
- 1kHz脉冲频率对应转速 = (1000 × 60) / 3200 ≈ 18.75 rpm
调整定时器参数即可改变运行速度:减小重装载值提高频率加速,增大则减速。
方向与使能控制
void Motor_SetDirection(uint8_t dir)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, dir ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
void Motor_Enable(uint8_t en)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, en ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
注意事项
- CFG引脚配置在独立模式下通过硬件电平确定,上电前需固定电平
- STEP引脚脉冲宽度需满足芯片最小脉宽要求(通常≥100ns)
- 电流衰减模式、堵转检测等高级功能在独立模式下不可用,需SPI模式配置
- 建议添加加速曲线,避免直接高频启动造成失步