自己设计的一个MCU+TMC4361A+TMC2160步进电机驱动器,目标是建立一个闭环的步进电机驱动器。最简单的开环测试时,TMC4361A的内部斜坡发生器一直不能够工作,但是MCU->TMC4361A,TMC4361A->TMC2160的SPI接口通讯都是正常的,测试TMC2160也能够正常工作,以下是测试程序的流程摘要:
TMC4361A 寄存器设置汇总
一、初始化阶段(tmc4361_app.c 中 tmc4361_init())
寄存器 地址 写入值 说明
GENERAL_CONF 0x00 0x00046000 使能 DCO 内部时钟(bit18), STDBY_CLK=DISABLE(bit14:13=11)
CLK_FREQ 0x31 0x00F42400 外部时钟频率 = 16,000,000 Hz
SPI_OUT_CONF 0x04 0x4440004C Driver SPI = TMC21xx格式(0xC), COVER数据长度=5字节, SPI时序参数
REFERENCE_CONF 0x0B 0x00000000 禁用左右限位开关
START_CONF 0x0D 0x00000000 禁用外部START引脚控制
ENC_IN_CONF 0x07 0x00000000 禁用编码器接口
STATUS 0x0F 0xFFFFFFFF 清除所有状态标志
0x2C 0x2C 0x0000002D bit5=1 步进输出使能, bit0=1(保留芯片初始值), bits3:0=0xD
STP_LENGTH_ADD 0x10 0x00060002 步进脉冲宽度=2个时钟周期(=125ns@16MHz)
CURRENT_CONF 0x05 0x00000083 保持/驱动电流缩放使能(bit1:0=11), DCEN_ON(bit7=1)强制DCEN高
SCALE_VALUES 0x06 0x00101010 保持/驱动/提升电流缩放值各为16(0x10)
二、斜坡测试阶段(main.c:233-245)
寄存器 地址 写入值 说明
STATUS 0x0F 0xFFFFFFFF 清除状态标志
RAMPMODE 0x20 0 先设为HOLD模式
VMAX 0x24 0 目标速度归零
AMAX 0x28 8000 (2000<<2) 最大加速度 = 2000 step/s²
VSTART 0x2A 10 启动速度 = 10 step/s
VMAX 0x24 512000 (2000<<8) 目标速度 = 2000 step/s
RAMPMODE 0x20 1 改为速度模式→期望斜坡发生器启动
三、验证结果
- 20ms 等待后读取
- VACTUAL(0x22) = 0 ← 斜坡发生器未工作
- STATUS(0x0F) = 0x80000187
- bit0(TARGET_REACHED)=1, bit2(VEL_REACHED)=1
- bit3(VEL_STATE)=0 → 电机静止
- bit4(RAMP_STATE)=0 → 斜坡未运行
- bit7(FS_ACTIVE)=1, bit8(ENC_FAIL)=1
四、硬件环境
参数 值
MCU AT32F435CGU7
TMC4361A 版本 0x02
TMC2160 版本 0x30
外部时钟 有源晶振 16MHz, 示波器实测正常
SPI 通信速率 ~3.1MHz (SPI2 DIV_64)
TMC4361A→TMC2160 驱动SPI+步进/方向引脚已连接
五、已确认正常的功能(排除干扰)
- TMC4361A SPI 寄存器读写
- Cover Datagram → TMC2160 寄存器读写
- TMC2160 XDIRECT 直接电流控制(软件步进,电机可正/反转和定位)
- DCEN 信号(CURRENT_CONF bit7=1 强制高)
- 外部时钟信号(示波器确认16MHz)
- NFREEZE 引脚(PB11 拉高)
- 编码器禁用(ENC_IN_CONF=0)
仅 TMC4361A 内部斜坡发生器不启动,即使所有配置寄存器已正确设置。