Post Go back to editing

TMC4361A斜坡发生器工作异常

自己设计的一个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+步进/方向引脚已连接

五、已确认正常的功能(排除干扰)
White check mark TMC4361A SPI 寄存器读写
White check mark Cover Datagram → TMC2160 寄存器读写
White check mark TMC2160 XDIRECT 直接电流控制(软件步进,电机可正/反转和定位)
White check mark DCEN 信号(CURRENT_CONF bit7=1 强制高)
White check mark 外部时钟信号(示波器确认16MHz)
White check mark NFREEZE 引脚(PB11 拉高)
White check mark 编码器禁用(ENC_IN_CONF=0)

仅 TMC4361A 内部斜坡发生器不启动,即使所有配置寄存器已正确设置。

  • 按照API示例程序的顺序测试,仍然一样的问题。下面附上测试的过程摘要:

    芯片信息
    - TMC4361A VERSION: 0x00000002
    - TMC2160 IOIN VERSION: 0x30
    - 外部时钟: 16MHz 有源晶振,示波器实测频率幅度正常
    - MCU: AT32F435CGU7

    现象
    TMC4361A 内部斜坡发生器不启动。写入 RAMPMODE=1, VMAX=512000 后,VACTUAL(0x22) 始终为 0,STATUS(0x0F) 显示 RAMP_STATE=0, VEL_STATE=0(斜坡未运行、电机静止)。同芯片通过 Cover Datagram 直接控制 TMC2160 XDIRECT 可正常驱动电机。
    初始化寄存器写入顺序及值
    地址 寄存器名                      写入值          说明
    0x00 GENERAL_CONF       0x00046000 DCO内部时钟使能,SDIN_MODE=00(内部阶梯生成)
    0x31 CLK_FREQ                 0x00F42400 16000000 Hz
    0x04 SPI_OUT_CONF        0x4440004C SPI格式=TMC21xx(0xC),cover数据长度=5字节
    0x0B REFERENCE_CONF 0x00000000 禁用限位开关
    0x0D START_CONF           0x00000000 禁用外部START引脚
    0x07 ENC_IN_CONF           0x00000000 禁用编码器
    0x0F STATUS                      0xFFFFFFFF 清除所有状态标志
    0x10 STP_LENGTH_ADD  0x00060002 步进脉宽=2时钟周期
    0x05 CURRENT_CONF     0x00000083 hold/drive电流使能,DCEN_ON=1
    0x06 SCALE_VALUES        0x00101010 保持/驱动/提升电流缩放
    0x20 RAMPMODE              0x00000001 速度模式+软斜坡
    0x28 AMAX                          0x00013880 最大加速度 20000步/s²
    0x29 DMAX                          0x00013880 最大减速度 20000步/s²
    0x2D BOW1                         0x000003E8
    0x2E BOW2                         0x000003E8
    0x2F BOW3                         0x000003E8
    0x30 BOW4                         0x000003E8

    启动斜坡的后续写入
    地址 寄存器名        写入值
    0x0F STATUS        0xFFFFFFFF
    0x20 RAMPMODE 0x00000001
    0x25 VSTART        1
    0x26 VSTOP          1
    0x24 VMAX             512000

    回读结果
    - 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
    已排除的因素
    White check mark 外部16MHz晶振(示波器确认正常)
    White check mark SPI寄存器读写(所有写值可正确回读)
    White check mark Cover Datagram(TMC2160寄存器读写正常)
    White check mark DCEN信号(CURRENT_CONF bit7=1强制高)
    White check mark NFREEZE引脚(MCU拉高)
    White check mark 编码器禁用(ENC_IN_CONF=0)
    White check mark 遵循AN-032所述初始化顺序
    White check mark 参考EvalBoard代码的启动方式(OPERATION_MODE_FIELD + VMAX)
    问题仅限 TMC4361A 内部斜坡发生器不启动,SPI通信和驱动链路正常。怀疑芯片版本 VERSION=0x02 可能存在寄存器映射差异,请提供此版本的完整数据手册或寄存器映射表。