This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRV8334:驱动外部 MOSFET 时输出卡在低电平(无 SPI、F28P550SJ9PZ)

Guru**** 2484505 points
Other Parts Discussed in Thread: DRV8334, CSD88599Q5DC

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1553876/drv8334-outputs-stuck-low-when-driving-external-mosfets-no-spi-f28p550sj9pz

器件型号:DRV8334
CSD88599Q5DC 中讨论的其他器件

工具/软件:

您好:

我在使用时遇到问题 DRV8334 外部 H 桥来驱动有刷直流电机。

DRV8334 已连接并路由至 A TMS320F28P550SJ9PZ 微控制器。
目前、我未使用 SPI 接口、器件以其默认(硬件)配置运行。

当前设置:

  • PVDD:+12V

  • NSLEEP:拉至高电平

  • DRVOFF:低电平 (0)

  • PWM 输入:INHA(20kHz、50%占空比)

  • INLA:0

  • INHB:0

  • INLB:1.

  • 外部 MOSFET:CSD88599Q5DC

  • 自举电容器:1 µF 与 2.7Ω 电阻器串联

  • VMOT(MOSFET 电源):+20V

  • 电机连接:半桥 A 和 B 之间连接的有刷直流电机、半桥 C 保持未连接状态

  • nFAULT 引脚:高电平(未置位)

观察到的行为:

  • GHA、GHB、GHC 输出:波形 在~6kHz 时拉至低电平、振幅~5.2V

  • GLA、GLB、GLC 输出:逻辑低电平 (0V)

  • 输出波形与输入 PWM 信号不匹配。

目标:
我希望 DRV8334 正确驱动外部 MOSFET、以便输出信号重现输入 PWM、在这种非 SPI 配置中实现正确的电机控制。

问题:

  1. 为什么尽管采用上述配置、输出仍然保持低电平?

  2. DRV8334 在没有 SPI 设置的情况下将 PWM 转发到外部 MOSFET 是否需要任何特定条件或引脚配置?

提前感谢您的帮助。


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joris、

    您将需要通过 SPI 写入寄存器 0x1B、以便将 ENABLE_DRV 位设置为高电平、从而启用栅极驱动器输出。

    如果不写入此寄存器、您只能使用 nSLEEP 引脚退出睡眠模式、而该引脚会将您置于待机模式、此时栅极驱动输出会被禁用。

    此致、

    -亚当

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Adam、

    感谢您的答复。

    我尝试了您的解决方案、但遗憾的是、它不起作用。

    目前、我对 DRV8334 使用以下初始化序列。 但是、一旦我将 ENABLE_DRV 设置为高电平、nFAULT 引脚就会置位。 检查错误状态寄存器时、报告的故障为 VCP_OV。

    以下是我的测量结果:

    • VCP = 26V

    • VDRAIN = 12.34V(通过 12V 稳压器供电)

    • 自举电容器= 1 µF

    此外、DRV_STAT 引脚始终保持低电平。

    我已经测试了初始化序列的不同变体、但这个版本是到目前为止功能最齐全的版本。

    DRV8334 是否有已知/已验证的初始化序列来避免此 VCP_OV 故障?  

    代码:  

    //========================
    //主要
    //========================
    内部 main (void)
      sysctl_disableWatchdog ();
      sysctl_disableMCD()
     
      设备初始化 ();
      device_initGPIO()
      BOARD_INIT ();   

      SPI_setcharLength (mySPI0_BASE、16);

      //可取消 CRC 0x3800096E
      uint32_t SPI_DESABLE_CRC = 0x3800096E
      SPI_transmit32Bits (mySPI0_BASE、SPI_desable_crc、0);

      SPI_setcharLength (mySPI0_BASE、8);

      // IC_CTRL2 读取开始
      uint32_t SPI_IC_CTRL2_read = 0b001101110000000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_read、0);

      // IC_CTRL2 清除标志
      uint32_t SPI_IC_CTRL2_cnFAULT = 0b00110110000000000000111
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_CnFAULT、0);

      // IC_CTRL2 禁用 GVDD
      uint32_t SPI_IC_CTRL2_GVDD = 0b001100000001000000110
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_GVDD、0);

      // MON_CTRL6 设定值 (0x30)
      uint32_t SPI_MON_CTRL6 = 0b011000000000010111011
      SPI_transmit24 位 (mySPI0_BASE、SPI_MON_CTRL6、0);

      // d é lais d'acquisition du nFAULT
      DEVICE_DELAY_US (1000000);

      // IC_CTRL2 设定值(0x1B、0 覆铜)
      uint32_t SPI_IC_CTRL2_DRV = 0b001101100001000000110
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_DRV、0);

      // IC_STAT1 读取
      uint32_t SPI_IC_STAT1 = 0b00000001000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT1、0);
      
      // IC_STAT2 读取
      uint32_t SPI_IC_STAT2 = 0b00000011000000000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT2、0);

      // IC_STAT3 读取
      uint32_t SPI_IC_STAT3 = 0b000001010000000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT3、0);

      // IC_STAT4 读取  
      uint32_t SPI_IC_STAT4 = 0b000001110000000000000
      SPI_TRANSMIT24 位 (mySPI0_BASE、SPI_IC_STAT4、0);

      // IC_STAT5 读取  
      uint32_t SPI_IC_STAT5 = 0b000010010000000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT5、0);

      // IC_STAT6 读取  
      uint32_t SPI_IC_STAT6 = 0b0000101100000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT6、0);

      interrupt_initModule()
      Interrupt_initVectorTable()

      initperipherals()
      initTimer0_60kHz ();
      fsm_init()

      UART_init (115200);

      EINT;
      ERTM;

      for(;;)
      {
        (* Alpha_State_Ptr)();
      }
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joris:

    使用您提供的测量值时、VCP-VDRAIN 非常接近阈值

    那么、一旦打开器件电源并发现此故障、您是否能够清除它并使其保持清除状态? 您是否能够增大 VDRAIN? 什么是 PVDD?

    此致、

    Yara

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Yara:

    I 使 VMOTOR = 19V 且 PVDD = 12V
    目前、PVDD 与 VDRAIN 连接到同一源。

    为了进行测试、我可以增加 VMOTOR 电压或连接外部电源。

    器件上电后、我清除 CLR_FLT。 但是、我不会清除 VCP_OV 状态、因为它是只读的。

    此致、
    Joris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joris:

    如果故障条件已消除、则向 CLR_FLT 写入 1 应该清除您的故障。如果在向 CLR_FLT 写入 1 后 VCP_OV 确实清除了、这意味着 VCP 超过阈值、因此 VDRAIN 可能无法稳定?

    此致、

    Yara

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yara 您好:

    我们目前通过设置为 20V 的稳压电源为 PVDD 和 VDRAIN (VMOTOR) 使用相同的电源电压
    VCP 上的电压在 (VCP–VDRAIN)= 13.85V 时保持稳定、根据数据表、这对应于过压条件。

    我们怀疑 DRV8334 的初始化序列可能不正确、无法正确启用驱动器 (ENABLE_DRV = 1b)。

    我们的当前顺序如下:

    • 禁用 CRC(以简化调试)
    • 设置 CLR_FLT = 1b

    • 设置 DIS_GVDD_SS = 0b(原型)

    • 设置 ALL_CH = 0b

    • 设置 ENABLE_DRV = 1b

    但是、每当我们写入 ENABLE_DRV = 1b 时、nFAULT LED 都会亮起。

    您能否确认在 ENABLE_DRV = 1b 的情况下使器件进入功能模式所需的正确初始化序列?

    我们正在使用 DRV8334 数据表(2023 年 12 月–2025 年 5 月修订)。

    //========================
    //主要
    //========================
    内部 main (void)
      sysctl_disableWatchdog ();
      sysctl_disableMCD()
     
      设备初始化 ();
      device_initGPIO()
      BOARD_INIT ();   

      SPI_setcharLength (mySPI0_BASE、16);

      //可取消 CRC 0x3800096E
      uint32_t SPI_DESABLE_CRC = 0x3800096E
      SPI_transmit32Bits (mySPI0_BASE、SPI_desable_crc、0);

      SPI_setcharLength (mySPI0_BASE、8);

      // IC_CTRL2 读取开始
      uint32_t SPI_IC_CTRL2_read = 0b001101110000000000000
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_read、0);

      // IC_CTRL2 清除标志
      uint32_t SPI_IC_CTRL2_cnFAULT = 0b00110110000000000000111
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_CnFAULT、0);

      // IC_CTRL2 禁用 GVDD
      //uint32_t SPI_IC_CTRL2_GVDD = 0b001100000001000000110;
      //SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_GVDD、0);

      // MON_CTRL6 设定值 (0x30)
      uint32_t SPI_MON_CTRL6 = 0b011000000000010111011
      SPI_transmit24 位 (mySPI0_BASE、SPI_MON_CTRL6、0);

      // IC_CTRL2 清除标志
      uint32_t SPI_IC_CTRL2_cnFAULT_2 = 0b00110110000000000000111
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_cnFAULT_2、0);

      // d é lais d'acquisition du nFAULT
      DEVICE_DELAY_US (1000000);

      // IC_CTRL2 设定值(0x1B、0 覆铜)
      uint32_t SPI_IC_CTRL2_DRV = 0b001101100000000000110
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_DRV、0);

      DEVICE_DELAY_US (100);

      // SPI_TEST 设定值(0x36、0 覆铜)
      uint32_t SPI_TEST = 0b01101100111111111111111111
      SPI_transmit24 位 (mySPI0_BASE、SPI_SPI_TEST、0);

      DEVICE_DELAY_US (100);

      // SPI_TEST 设定值(0x36、1 个覆铜区)
      uint32_t SPI_TEST_READ = 0b0110110111111111111111111111
      SPI_transmit24 位 (mySPI0_BASE、SPI_SPI_TEST_READ、0);

      DEVICE_DELAY_US (100);

      // IC_STAT1 读取
      //uint32_t SPI_IC_STAT1 = 0b00000001000000000;
      //SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT1、0);
      
      // IC_STAT2 读取
      //uint32_t SPI_IC_STAT2 = 0b00000011000000000000000;
      //SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT2、0);

      // IC_STAT3 读取
      //uint32_t SPI_IC_STAT3 = 0b000001010000000000000;
      //SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT3、0);

      // IC_STAT4 读取  
      //uint32_t SPI_IC_STAT4 = 0b000001110000000000000;
      //SPI_TRANSMIT24 位 (mySPI0_BASE、SPI_IC_STAT4、0);

      // IC_STAT5 读取  
      //uint32_t SPI_IC_STAT5 = 0b000010010000000000000;
      //SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT5、0);

      // IC_STAT6 读取  
      //uint32_t SPI_IC_STAT6 = 0b0000101100000000000;
      //SPI_transmit24 位 (mySPI0_BASE、SPI_IC_STAT6、0);

      interrupt_initModule()
      Interrupt_initVectorTable()

      initperipherals()
      initTimer0_60kHz ();
      fsm_init()

      UART_init (115200);

      EINT;
      ERTM;

      for(;;)
      {
        (* Alpha_State_Ptr)();
      }
    }

    此致、
    Joris




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我们已经解决了 DRV8334 初始化的问题。
    下面是我们使用的顺序:

    • 禁用 CRC8

    • 将 ALL_CH 位设置为 0b (MON_CTRL6)

    • 清除 nFAULT 标志位 (1b)(IC_CTRL2)

    • 器件延迟:100µs

    • 将 ENABLE_DRV 设置为 1b (IC_CTRL2)

    另一个阻塞点是 PWM 初始化状态。 最初、我们将 PWM 设置为高电平、但它们在启动时必须设置为低电平。

    代码:  

    SPI_setcharLength (mySPI0_BASE、16);

      //可取消 CRC 0x3800096E
      uint32_t SPI_DESABLE_CRC = 0x3800096E
      SPI_transmit32Bits (mySPI0_BASE、SPI_desable_crc、0);

      SPI_setcharLength (mySPI0_BASE、8);

      // MON_CTRL6 设置值 (0x30)、ALL_CH
      uint32_t SPI_MON_CTRL6 = 0b011000000000010111011
      SPI_transmit24 位 (mySPI0_BASE、SPI_MON_CTRL6、0);

      // IC_CTRL2 清除标志、nFAULT
      uint32_t SPI_IC_CTRL2_cnFAULT_2 = 0b00110110000000000000111
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_cnFAULT_2、0);

      // 延迟 nFAULT
      DEVICE_DELAY_US (100);

      // IC_CTRL2 设置值(0x1B、0 用于写入)
      uint32_t SPI_IC_CTRL2_DRV = 0b001101100000000000110
      SPI_transmit24 位 (mySPI0_BASE、SPI_IC_CTRL2_DRV、0);