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.

[参考译文] DRV8353RS-EVM:DRV8353RS SPI 寄存器在写入和放大器后读取了错误的字;运行期间滑行控制失败

Guru**** 2770105 points

Other Parts Discussed in Thread: DRV8353RS-EVM

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1607478/drv8353rs-evm-drv8353rs-spi-registers-read-wrong-words-after-write-coast-control-fails-during-run-time

器件型号: DRV8353RS-EVM

尊敬的小组:

SPI 写入方法存在问题、如数据表中所述。 在写入过程中、文本中提出 nSCS 的几个问题是完全无效的、无法以任何串行频率 (IE、30/KHZ 60MHz 9KHz、12kHz、16KHz, 65kHz 等 数据表似乎需要更新、并且状态不会在 RS 版本中增加 nSCS 引脚? 否则、带有 SDI 数据的控制 DRV 寄存器将在字写入之间以>400ns 的时间进行捕获和传播。

然而、当我们在写入多个控制寄存器(位拆裂)后尝试进行任何循环读取时、SDO 移出的数据会以任何 STE 时钟速率返回奇数值。 没有 SDO 回读的一次性 SDI 写入似乎成功。 根据分流放大器电流反馈的分频方式、将增益 10 设置为死区 100ns 和 HS/LS 电流强度、通过示波器探头捕获查看结果。  

更大的问题是控制寄存器 0x02 第 2 位正在设置 SDI 捕获并在电机运行期间传播、但半桥不会进入高阻抗状态、PWM 模式 00b 6x。 如果 MCU PWM 输出设为高阻抗、则 DRV 输出不遵循输入引脚的驱动状态!

一些背景:drv8353rs 由 UMCSDK v5.03 drv8353s.c/h 文件通过 CPUTM1 和一次性 SPI 字命令以秒为间隔驱动、在 CCS 调试表达式窗口中执行捕获和传播。 但是、当在电机运行时设置滑行控制位寄存器 0x02h 时、drv8353rs 半桥不会进入高阻抗、直接进行 SPI 写入(如下所示)似乎会制动 PWM 驱动输出。    

问题:

1.如果在 Rx 阻塞 FIFO 或 RX 缓冲器读取模式下 MCU SPI 外设读取 SDO 移出数据、为什么 SPI SDO 控制寄存器写入看起来会捕获和传播、但随机改变奇数值、而在写入期间 nSCS 引脚上升时间大于 400ns?  通过 XDS110 调试探针在 CCS 调试表达式窗口中将读取命令 bool 位设置为 0x1 时、下面显示的第二个代码示例?

2.为什么对控制寄存器 0x02h 滑行位 2 进行单次写入似乎会导致半桥上发生制动操作! 数据表(SLVSDY6A–2018 年 8 月–2019 年 6 月修订)是否包含不正确的信息?  

3.为什么在写入 RS 器件类期间、这个热门器件数据表未附加关于 nSCS SPI 控制引脚的正确讨论? 将 RS 器件上的 nSCS 引脚增大至>400ns 会导致 SDO 和 SDI 数据在任何 MCU SDI 频率设置或 SPI 接收器模式、Rx 缓冲器或非/阻断 FIFO 中被改编?

            /* Enable drv8353rs to disable PWM drive gates */
            drvicVars_M1.ctrlReg02.bit.COAST = true;
            // Manual write DRV8353RS control registers
            drvicVars_M1.manWriteCmd = 1;
            HAL_writeDRVData(halHandle_M1, &drvicVars_M1);
            // Wait 1ms
            DEVICE_DELAY_US(1000);
            // Manual write DRV8353RS control registers
            drvicVars_M1.manWriteCmd = 1;
            HAL_writeDRVData(halHandle_M1, &drvicVars_M1);
        /* One second timer for drv8353rs module registers */
        if(HAL_getCPUTimerStatus(halHandle_M1, HAL_CPU_TIMER1) &&
                            (motorVars_M1.motorState == MOTOR_STOP_IDLE))
        {
             /* clear overflow flag */
             HAL_clearCPUTimerFlag(halHandle_M1, HAL_CPU_TIMER1);
             //
             CPUTimer_reloadTimerCounter(HAL_CPU_TIMER1);
             //
             drvicVars_M1.ctrlReg03.bit.IDRIVEP_HS = DRV8353_ISOUR_HS_0P150_A; //820mA DRV8353_ISOUR_HS_0P820_A
             drvicVars_M1.ctrlReg03.bit.IDRIVEN_HS = DRV8353_ISINK_HS_1P100_A; //640mA DRV8353_ISINK_HS_1P640_A

             drvicVars_M1.ctrlReg04.bit.IDRIVEP_LS = DRV8353_ISOUR_LS_0P150_A; //820mA DRV8353_ISOUR_LS_0P820_A
             drvicVars_M1.ctrlReg04.bit.IDRIVEN_LS = DRV8353_ISINK_LS_0P600_A; //640mA DRV8353_ISINK_LS_1P640_A

             drvicVars_M1.ctrlReg05.bit.VDS_LVL = DRV8353_VDS_LEVEL_1P500_V;
             drvicVars_M1.ctrlReg05.bit.OCP_MODE = DRV8353_LATCHED_SHUTDOWN;
             drvicVars_M1.ctrlReg05.bit.DEAD_TIME = DRV8353_DEADTIME_100_NS;

             drvicVars_M1.ctrlReg06.bit.CSA_GAIN = DRV8353_Gain_10VpV;
             drvicVars_M1.ctrlReg06.bit.LS_REF = false;
             drvicVars_M1.ctrlReg06.bit.VREF_DIV = true;
             drvicVars_M1.ctrlReg06.bit.CSA_FET = false;
             drvicVars_M1.ctrlReg02.bit.OCP_ACT = true; // All NEXFets shut down in OVC condition
             drvicVars_M1.ctrlReg02.bit.COAST = false;
             //
             drvicVars_M1.writeCmd = 1;
             HAL_writeDRVData(motorHandle_M1->halMtrHandle, &drvicVars_M1);
             //
             drvicVars_M1.readCmd = 1;
             HAL_readDRVData(motorHandle_M1->halMtrHandle, &drvicVars_M1);

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

    CCS 调试探针 XDS110

            

    滑行位 02 设置 dos 未将 drv8353rs PWM 输出设置为无效状态!

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

    您好:

    综上所述、为了达成我的理解、您说在执行写入命令后对 SDO 线路进行回读将导致发送缓冲区中的数据损坏、导致后续写入无效?

    因此、当您发出写入命令并忽略回读时、您观察到的行为是正确的、因为器件根据更新的行为正确进行写入?

    如果我的理解有误、请告诉我。 一旦我知道我理解了问题、我就可以进行一些挖掘来真正找到答案。

    谢谢!

    Joseph

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

    您好、Joseph:

    因此、当您发出写入命令并忽略回读时、您观察到的行为是正确的、因为设备根据更新的行为正确地进行了写入?

    实际上、与上升 nSCS 引脚相比、对所有控制寄存器进行单次写入更频繁地捕获 SDI 数据、这是捕获预期数据的完全失败。 我们只知道在 FOC 控制算法期间电机驱动器崩溃时、所有寄存器的单个 SPI 写入都会失败 UMCSDK v5.03。  

    为什么 8353 内部控制器即使写入两次、也不会从 SPI 发出单个命令来进入滑行状态? 器件中似乎有某种勘误表! 当 PWM 输入切换数据到半桥时、我们是否必须在两个字之间将 nSCS 输入提高到>400ns? 我们请注意、当 SPI 在电机空闲期间以一秒 CPUTM1 间隔写入两条命令时、SPI Rx 缓冲器会接收 SDO 数据。 这表示 8353 SPI 已通过 XS110 调试探针轮询 500ms。   

    同样、 在 SPI 写入 8353 SDI 引脚期间、当 nSCS 引脚被触发时、所有寄存器的单次写入被改编。 或者、返回到 SPI Rx 缓冲器然后 CCS 调试的 SDO 不是 CPUTM1 几秒钟迭代后写入的 SDO。 我们可能期望对 8353 的第一次写入可能会回读为一些默认寄存器数据、但并非所有其他 B2B R/W  

    EN 引脚在 38µs 期间拉至低电平、然后在此后拉至高电平、以清除任何 POR 代码故障。 随后、我们在 POR 之后对所有控制寄存器进行双写之前、向 8353 添加了清除故障命令。 如果我们在写入数据流后将 B2B 读取置为有效、请注意清除故障位正在复位、但其他寄存器具有某种默认控制字、看似来自移动的控制表 (drv8353s.h)。

    我恐怕要将直流电源电压提高到>24V、直到 8353 将栅极驱动滑行命令置为有效。  UMCSDK v5.03 代码在突然停止或故障期间不会使电机减速、它会返回到 PWM 50%占空比、或将 PWM 驱动为低电平或高阻抗、8353 不会遵从这两种状态。 电机定子发出的 BEMF 制动声音、磁场崩溃太可怕了! 显然、在 MOSFET 中产生更高的电流、同时它们会产生低待机相电流!  

    注意:在所有情况下、8353rs 不会将通过 (drv8353s.c) 写入的每个 REG 字上的寄存器数据移出 SDO 引脚。 似乎只有在 REG 0x02h - 0x07h 循环写入之后、SPI Rx 接收器(缓冲器)才会显示 8353 SDO 移出一些数据。 8353 数据表未提及 SDI 上的优先写入暂停 SDO 移位数据、除非 C 代码 对任何 11 位寄存器写入执行原始(写入后读取)。 无论如何、这与为什么对 REG 0x02h 滑行位执行独占单字写入不会在输入端存在 PWM 信号时将 3 相输出置于高阻抗状态几乎没有关系、占空比为 50%以进行测试。

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

    已注意到失败:

    器件修订版本 F280039CSPZ $#-YMLLLLS (PZ) EPWM 寄存器勘误表!!!!

    这些位无法通过 x39c C2000 器件 driverlib 调用来设置:  

    REG:20.17.2.45 TZSEL 寄存器(偏移= 80h)[复位= 0000h]  

    条件:DACA/B H/L TzCtrl REG 位被设置对设置动作限定符没有影响!

    20.17.2.55 TZCLR 寄存器(偏移= 97h)[复位= 0000h]

    UMCSDK v5.03:将 ePWM 跳闸区标志禁用到任何动作限定器(低阻抗或高阻抗)状态时、会导致之后出现不稳定的电流和代码行为! 强制 DCA_EVENT_H-A/B 动作限定符设置 TZ-x 位、但当 TZx 组合操作被触发为由紧急停止命令限定时不会发生任何反应。 这是由于函数 setup_ePWMfaults () 中没有设置 TzCtrl 位!

     解决方法有:不会将 ePWM A/B 置于低阻抗或高阻抗、会将任何动作限定器置为有效、但电机驱动器将与 DRV8353RS_EVM 配合使用、风险由您自行承担! 奇怪的是、相同的 x39c PZ 器件 CMPSSx 可以禁用外部直流逆变器上的 ePWM A/B 输出、但不能在连接 EVM 的+24VDC 电源下禁用。 奇怪的+80Vdc CMPSS3 跳闸 DACL 故障使 8353 三相输出高阻抗状态。 使 CMPSS3L 输出反相消除了+24VDC 电源下不存在的锁存 DAC 故障。 这证明 PWM 输入是直通的、但 UMCSDK v5.03 不希望禁用 50%占空比。 至少+24VDC 电源禁用功能 OST 导致在 MOTOR_STOP_IDLE 测试中进行相电流调节!   

            /* Select DCA inputs for CMPSS-High enabled sources DCA-H/L-A1 events */
            EPWM_selectDigitalCompareTripInput (obj->pwmHandle[cnt], EPWM_DC_TRIP_COMBINATION, EPWM_DC_TYPE_DCAH);
    
            /* Select DCB inputs for CMPSS-Low enabled sources DCB-H/L-B1 events */
            EPWM_selectDigitalCompareTripInput (obj->pwmHandle[cnt], EPWM_DC_TRIP_COMBINATION, EPWM_DC_TYPE_DCBH);
        
            /* Set DC-1A filter input event source */
            EPWM_setDigitalCompareFilterInput(obj->pwmHandle[cnt], EPWM_DC_WINDOW_SOURCE_DCAEVT1);
    
            /* Set DC-1B filter input event source */
            EPWM_setDigitalCompareFilterInput(obj->pwmHandle[cnt], EPWM_DC_WINDOW_SOURCE_DCBEVT1);
      
            EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                                   EPWM_TZ_ACTION_EVENT_TZA,
                                            EPWM_TZ_ACTION_LOW);
            //
            EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                                   EPWM_TZ_ACTION_EVENT_DCAEVT1,
                                            EPWM_TZ_ACTION_LOW);
    
            EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                                   EPWM_TZ_ACTION_EVENT_TZB,
                                            EPWM_TZ_ACTION_LOW);
            //
            EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                                   EPWM_TZ_ACTION_EVENT_DCBEVT1,
                                            EPWM_TZ_ACTION_LOW);                                
            //
            // Oneshot TZ1 DRV83XXRS nFault Active LOW
            EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
                                       EPWM_TZ_SIGNAL_OSHT1);
                                       
            EPWM_enableTripZoneSignals(obj->pwmHandle[0],
                              (EPWM_TZ_SIGNAL_DCAEVT1 | EPWM_TZ_SIGNAL_DCBEVT1));
            EPWM_enableTripZoneSignals(obj->pwmHandle[1],
                              (EPWM_TZ_SIGNAL_DCAEVT1 | EPWM_TZ_SIGNAL_DCBEVT1));
            EPWM_enableTripZoneSignals(obj->pwmHandle[2],
                              (EPWM_TZ_SIGNAL_DCAEVT1 | EPWM_TZ_SIGNAL_DCBEVT1));
    

    注意:电机正在运行并设置了这些标志、不应正在运行!

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

    您好:

    这与您遇到的有关使用 SDK 时行为的软件问题有关?  

    这与器件硬件本身无关?

    谢谢、

    Joseph

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

    显然、报告了勘误表 ePWM 模块 x39c PZ 器件、只有 CMPSSn 报告了 ePWM 问题。 然而、 当 TZOST 标志被强制或清除时、DCA1、DCB1 事件标志会保持置位状态。 TZOST 标志显示在 CCS 调试中被清除、但 DCA1 DCB1 事件标志在禁用的 PWM 输出中保持设置是典型的行为、直到我们运行电机。

    即使在 SDK 在启用 PWM 的情况下运行电机(不设置 TZOST 标志)、也是如此。 运行偏移计算后、代码会禁用 PWM 输出、我们的代码会强制调用 DCA1 DCB1 事件 (hal.h) 禁用 PWM。 因此、当我们强制禁用 DCA1 或 DCB1 事件或 TZOST 标志不会被调用 driverlib 清除时、器件勘误表会保持隐藏状态。

    只有当 PWMA1/B1 驱动通过设置 TZOST 标志禁用输出后、在清除后应处于活动状态时、才会清除当 DRV8353RS-EVM 连接到 LauncXL-39c 时、DCA1、DCB1、TZOST1 事件从未被清除的此勘误表问题。

    通过在设置了任何 TZOST 标志以主动禁用 PWM 输出后进行测试、可以解决此问题。 循环测试 TZOST TZCLR 位实际上被清除,这是一种 AI 代理监视行为。 x39c MCU 120MHz 和 x49c 100MHz、原始 TZOST 代码 (hal.h) 未能在 x39c 上置为有效

    因此、当未设置 TZOST 标志时、在偏移计算运行后、在看到 50%占空比方面仍然存在混淆。 这是在使用 x49c 进行测试和后来测试 x39c 之间的某个时间。 因此、在偏移计算后看到 50%的占空比保持不变、没有响铃、在电机停止运行后返回了 50%的占空比。 50%占空比不会仅导致微小的电流、但 PWM 不会保持启用状态。 它的唯一工作方式是禁用 TZOST 设置、并保留强制 DCA1 DCB1 TZOST1 事件 1 标志被设置或清除、直到将 WA 补丁添加到 hal.h 中

       

    // hal.h enable PWM TZOST flags:
        uint16_t cnt;
    
        for(cnt = 0; cnt < 3; cnt++)
        {
    
            /* Ensure the One Shot trip flag status register BITS are clear  */
            while(HWREG(obj->pwmHandle[cnt] + EPWM_O_TZOSTFLG) &= EPWM_TZ_FLAG_DCAEVT1)
            {
                /* Clear DCA1 DCB1 Event 1 Flags  */
                EPWM_clearOneShotTripZoneFlag(obj->pwmHandle[cnt], EPWM_TZ_OST_FLAG_DCAEVT1);
                break;
            }
            //
            DEVICE_DELAY_US(10);
            //
            while(HWREG(obj->pwmHandle[cnt] + EPWM_O_TZOSTFLG) &= EPWM_TZ_FLAG_DCBEVT1)
            {
                /* Clear DCA1 DCB1 Event 1 Flags  */
                EPWM_clearOneShotTripZoneFlag(obj->pwmHandle[cnt], EPWM_TZ_OST_FLAG_DCBEVT1);
                break;
            }
    
            /* Clear DCA1, DCB1 events, TZ-7,8,9 CBC6 OST flags */
            EPWM_clearTripZoneFlag(obj->pwmHandle[cnt],(EPWM_TZ_FLAG_OST | EPWM_TZ_FLAG_CBC |
                   EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCBEVT1));
            //
            DEVICE_DELAY_US(10);
    
            // Clear any Trip Zone flag
            EPWM_clearTripZoneFlag(obj->pwmHandle[cnt], HAL_TZFLAG_INTERRUPT_ALL); 
            
            return;
    }

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

    你好 Genatco

    我们正在寻找合适的人来回答您的问题。 请留出几天的时间进行回复。

    谢谢你  

    Amir Hussain

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

    尊敬的 Amair:

    该主题主要涉及 DRV8353RS 控制寄存器并不总是将 SDI 位置为有效。  至少在我们收到的 EVM 中、更多的是一些示例 SPI 驱动程序代码假设按说明设置寄存器的方式。 另请注意、x39c PZ 器件 EPWM 中有一个用于清除 TZOST 位锁存器的勘误表、尽管这些位在 CCS 调试中似乎通过 XDS110 调试探针清除、但操作限定符不会响应强制清除标志位。   

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

    您好:

    我可以关闭这个线程,我们继续在另一个线程和通过私人消息进行通信,以整合信息。

    谢谢、

    Joseph