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.

[参考译文] TMS320F28P659DK-Q1:通过 ADC 实现 DRV8343S F28P65x 定制电路板电流测量问题。

Guru**** 2551110 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1542338/tms320f28p659dk-q1-drv8343s-f28p65x-custom-board-current-measurement-issue-via-adc

器件型号:TMS320F28P659DK-Q1


工具/软件:

您好 TI 专家、

我们目前正在开发一个定制电路板、该电路板使用 DRV8343 电机驱动器和 F28P65x 微控制器(100PZP 封装)以 20kHz 的频率驱动 PMSM 电机。 我们的代码之前在 LaunchXL 和驱动程序评估套件上进行了验证、并按预期运行。

但是、当在我们的定制电路板上运行相同代码时、我们会遇到 ADCA 通道上相电流 Iv 和 IW 的 ADC 读数问题。 这些通道始终显示约 2048(约 1.65V)的值、并通过 DAC 绘制信号可确认在该水平下存在平坦信号。 有趣的是、在单独的 ADCA 通道上正确读取直流母线电压 (Vdc)、这表明 ADC 模块本身正在工作。

我们设置中的唯一主要区别是微控制器封装、我们的定制电路板使用 100PZP 型号、而 LaunchXL 使用 256BGA。 我们已相应地移植代码、并验证 DRV8343 和 MCU ADC 输入之间的 RC 网络是否与 LaunchXL 上使用的参考设计相匹配。

请您提供以下方面的指导:

  • 此问题是否更有可能与硬件或软件有关?

  • 您建议采取哪些诊断步骤来帮助找出根本原因?

  • 两种 MCU 封装之间是否存在任何可能影响 ADC 通道映射或功能的已知行为或配置差异?

  • 这是您在类似情况下遇到的常见问题吗? 如果是、典型的根本原因或解决方案是什么?

非常感谢您提供的任何见解或建议。

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

    尊敬的 Ashwin:

    感谢您发布该查询。  

    此问题是否更有可能与硬件或软件有关?

    需要了解更多详细信息、要消除代码、是否可以共享代码。 (只有 ADC 配置也应该有所帮助)  

    这是您在类似情况下遇到的常见问题吗? 如果是、典型的根本原因或解决方案是什么?

    不,这是看不到的  

    两个 MCU 封装之间是否存在任何已知行为或配置差异、从而影响 ADC 通道映射或功能?

    100QFP 封装上的通道数比 256BGA 封装少。 您能告诉我们哪些通道用于出现问题的应用吗?  

     -谢谢、

    Nilesh

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

    您好、Nilesh

    感谢您的答复

    需要了解更多详细信息、要消除代码、就可以共享代码。 (仅 ADC 配置也应有所帮助)

    // ****************************************************************************
    // ****************************************************************************
    // Configure ADC
    // ****************************************************************************
    // ****************************************************************************
    void configureADC()
    {
    
        uint16_t base;
    
        for (base = 0; base < 3; base++)
        {
            // Set 12-bit single ended conversion mode
            ADC_setMode(adcHandle[base], ADC_RESOLUTION_12BIT,
                        ADC_MODE_SINGLE_ENDED);
    
            // Set main clock scaling factor (100MHz max clock for the ADC module)
            ADC_setPrescaler(adcHandle[base], ADC_CLK_DIV_4_0);
    
            // set the ADC interrupt pulse generation to end of conversion
            ADC_setInterruptPulseMode(adcHandle[base], ADC_PULSE_END_OF_CONV);
    
            // enable the ADC
            ADC_enableConverter(adcHandle[base]);
    
            // set priority of SOCs
            ADC_setSOCPriority(adcHandle[base], ADC_PRI_ALL_HIPRI);
    
            //
            // ! Caution: Make sure J15 on LaunchPad is removed for reference to be internal
            //
            ADC_setVREF(adcHandle[base], ADC_REFERENCE_INTERNAL,
                        ADC_REFERENCE_2_5V);
        }
    
        // delay to allow ADCs to power up
        DEVICE_DELAY_US(1500U);
    
        // ********************************
        // Motor current phase V
        // ********************************
    
        ADC_setupSOC(MTR_IV_ADC_BASE, MTR_IV_ADC_SOC_NUM, MTR_ADC_TRIGGER_SOC,
        MTR_IV_ADC_CH_NUM,
                     20);
    
        // Configure the post processing block (PPB) to eliminate subtraction
        // related calculation
        // PPB is associated with SOC0
        ADC_setupPPB(MTR_IV_ADC_BASE, MTR_IV_ADC_PPB_NUM, MTR_IV_ADC_SOC_NUM);
        // Write zero to this for now till offset ISR is run
        ADC_setPPBCalibrationOffset(MTR_IV_ADC_BASE, MTR_IV_ADC_PPB_NUM, 0);
    
        // ********************************
        // Motor current phase W
        // ********************************
    
        ADC_setupSOC(MTR_IW_ADC_BASE, MTR_IW_ADC_SOC_NUM, MTR_ADC_TRIGGER_SOC,
        MTR_IW_ADC_CH_NUM,
                     20);   // 28
    
        // Configure PPB to eliminate subtraction related calculation
        // PPB is associated with SOC0
        ADC_setupPPB(MTR_IW_ADC_BASE, MTR_IW_ADC_PPB_NUM, MTR_IW_ADC_SOC_NUM);
    
        // Write zero to this for now till offset ISR is run
        ADC_setPPBCalibrationOffset(MTR_IW_ADC_BASE, MTR_IW_ADC_PPB_NUM, 0);
    
        // ********************************
        // Vdc @ C14
        //*********************************
        ADC_setupSOC(MTR_VDC_ADC_BASE, MTR_VDC_ADC_SOC_NUM, MTR_ADC_TRIGGER_SOC,
        MTR_VDC_ADC_CH_NUM,
                     20);
    
        // Configure PPB to eliminate subtraction related calculation
        // PPB is associated with SOC1
        ADC_setupPPB(MTR_VDC_ADC_BASE, MTR_VDC_ADC_PPB_NUM, MTR_VDC_ADC_SOC_NUM);
    
        // Write zero to this for now till offset ISR is run
        ADC_setPPBCalibrationOffset(MTR_VDC_ADC_BASE, MTR_VDC_ADC_PPB_NUM, 0);
    
        // ********************************
        // WHEEL ANGLE @ B7
    //    //*********************************
    //    ADC_setupSOC(ADC_WHEEL_ANGLE_BASE, ADC_SOC_NUM_WHEEL_ANGLE,
    //                 MTR_ADC_TRIGGER_SOC,
    //                 ADC_WHEEL_ANGLE_CH_NUM,
    //                 100);
    //    ADC_setupSOC(ADC_WHEEL_ANGLE_BASE, ADC_SOC_NUM_WHEEL_ANGLE, ADC_TRIGGER_SW_ONLY,
    //                 ADC_WHEEL_ANGLE_CH_NUM, 100);
    
        // Configure PPB to eliminate subtraction related calculation
        // PPB is associated with SOC1
    //    ADC_setupPPB(ADC_WHEEL_ANGLE_BASE, MTR_VDC_ADC_PPB_NUM, MTR_VDC_ADC_SOC_NUM);
    
        // Write zero to this for now till offset ISR is run
    //    ADC_setPPBCalibrationOffset(MTR_VDC_ADC_BASE, MTR_VDC_ADC_PPB_NUM, 0);
    
        return;
    }

    100QFP 封装上的通道数比 256BGA 封装少。 您能否告诉我们哪些信道用于出现问题的应用程序。

    我们使用的是 ADCA 通道 1 2 和 14、其中的问题出在通道 1 和 2 中、我们测量驱动器电流检测放大器的相电流输出。
    我们做了更多的测试,其中我们试图隔离驱动器和控制器,以单独测试它们,他们似乎都工作正常,和 ADC 似乎能够采样和输出的值 DAC 完全正常。 但当同时使用它们时、它似乎没有按预期工作。
    我们如何诊断此问题以找出问题的根本原因。

    此致
    Ashwin Bhaskar A.  

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

    尊敬的 Ashwin:  

    感谢您分享代码。 根据您在下面进行的实验、似乎存在硬件问题。

    我们做了更多的测试,我们试图隔离驱动器和控制器来单独测试它们,它们似乎都可以正常工作,并且 ADC 似乎能够在 DAC 上采样和输出完美的值。 但当同时使用它们时、它似乎没有按预期工作。
    我们如何诊断此问题以找出问题的根本原因。
    [/报价]

    电路的电流检测放大器部分似乎无法正常工作。  

    如果可能、您能否分享电流检测放大器电路所用的电路图片段。  

    我可以检查是否有任何问题。

    谢谢、

    Nilesh

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

    你好、Nilesh、

    看起来我们发现了这个问题,我们检查了 ADC 采样和 MOSFET 导通时间,似乎不同步, ADC 总是在 FET 的关断点采样。 这看起来像是硬件引起的软件问题、因为在我们的评估板设置中、这不是问题。 您能给我们一些原因造成这种延迟的见解吗?
    我将运行更多测试、并将结果附加到这里。 如果你需要电路原理图,我仍然可以在私人 dm 分享它.

    此致
    Ashwin Bhaskar A.

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

    尊敬的 Ashwin:

    我假设您使用 ePWM 来控制 INH 和 INL 引脚。 我们可以在软件端检查其配置。  

    如果您能在 DM 上分享原理图、我将很好地洞察情况、为您提供我可以建议的任何调试步骤。  

    谢谢、

    Nilesh

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

    你好、Nilesh、

    我现在可以提供 ePWM 配置,我将在 DM 上发送原理图。

    我想问一下从 TM320F28P650DK9 切换到 TMS320F28P659DK8-Q1 对 ADC、EPWM 等的工作方式及其同步时序有何影响。 我们切换到 DK8 版本,因为它符合汽车标准。  
    更新:当我们反转 ePWM 上的引脚功能时、我们能够实现位置控制、但我不确定这是否是标准解决方案。

    void configurePWM(void)
    {
        uint16_t base;
    
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        // *****************************************
        // Inverter PWM configuration - PWM 1, 2, 3
        // *****************************************
        for (base = 0; base < 3; base++)
        {
            // Time Base SubModule Registers
            // set Immediate load
            EPWM_setPeriodLoadMode(pwmHandle[base], EPWM_PERIOD_DIRECT_LOAD);
            EPWM_setTimeBasePeriod(pwmHandle[base], INV_PWM_TICKS / 2);
            EPWM_setPhaseShift(pwmHandle[base], 0);
            EPWM_setTimeBaseCounter(pwmHandle[base], 0);
            EPWM_setTimeBaseCounterMode(pwmHandle[base], EPWM_COUNTER_MODE_UP_DOWN);
            EPWM_setClockPrescaler(pwmHandle[base], EPWM_CLOCK_DIVIDER_1,
                                   EPWM_HSCLOCK_DIVIDER_1);
    
            EPWM_disablePhaseShiftLoad(pwmHandle[base]);
    
            // sync "down-stream"
            EPWM_enableSyncOutPulseSource(pwmHandle[base],
            EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    
            // Counter Compare Submodule Registers
            // set duty 0% initially
            EPWM_setCounterCompareValue(pwmHandle[base], EPWM_COUNTER_COMPARE_A, 0);
            EPWM_setCounterCompareShadowLoadMode(pwmHandle[base],
                                                 EPWM_COUNTER_COMPARE_A,
                                                 EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
    //        // Action Qualifier SubModule Registers
            EPWM_setActionQualifierActionComplete(
                    pwmHandle[base],
                    EPWM_AQ_OUTPUT_A,
                    (EPWM_ActionQualifierEventAction) (EPWM_AQ_OUTPUT_LOW_UP_CMPA
                            | EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA));
    
            // Active high complementary PWMs - Set up the deadband
            EPWM_setRisingEdgeDeadBandDelayInput(pwmHandle[base],
            EPWM_DB_INPUT_EPWMA);
            EPWM_setFallingEdgeDeadBandDelayInput(pwmHandle[base],
            EPWM_DB_INPUT_EPWMA);
    
            EPWM_setDeadBandDelayMode(pwmHandle[base], EPWM_DB_RED, true);
            EPWM_setDeadBandDelayMode(pwmHandle[base], EPWM_DB_FED, true);
            EPWM_setDeadBandDelayPolarity(pwmHandle[base], EPWM_DB_RED,
                                          EPWM_DB_POLARITY_ACTIVE_HIGH);
            EPWM_setDeadBandDelayPolarity(pwmHandle[base], EPWM_DB_FED,
                                          EPWM_DB_POLARITY_ACTIVE_LOW);
            EPWM_setRisingEdgeDelayCount(pwmHandle[base], INV_PWM_DB);
            EPWM_setFallingEdgeDelayCount(pwmHandle[base], INV_PWM_DB);
        }
    
        // U-phase upper leg (A output)
    //    EPWM_setActionQualifierAction(MTR_U_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    //    EPWM_setActionQualifierAction(MTR_U_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    //
    //    // V-phase upper leg (A output) — remains OFF or complementary to B
    //    EPWM_setActionQualifierAction(MTR_V_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    //    EPWM_setActionQualifierAction(MTR_V_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        // Action Qualifier SubModule Registers
    //          EPWM_setActionQualifierActionComplete(
    //                  MTR_U_PWM_BASE,
    //                  EPWM_AQ_OUTPUT_A,
    //                  (EPWM_ActionQualifierEventAction) (EPWM_AQ_OUTPUT_LOW_UP_CMPA
    //                          | EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA));
    //
    //          EPWM_setActionQualifierActionComplete(
    //                  MTR_V_PWM_BASE,
    //                  EPWM_AQ_OUTPUT_B,
    //                  (EPWM_ActionQualifierEventAction)(EPWM_AQ_OUTPUT_LOW_UP_CMPA
    //                          | EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA));
    //    // configure V and W as slaves
        EPWM_setSyncInPulseSource(MTR_V_PWM_BASE, PWM_SYNC_SOURCE);
        EPWM_enablePhaseShiftLoad(MTR_V_PWM_BASE);
        EPWM_setPhaseShift(MTR_V_PWM_BASE, 2);
        EPWM_setCountModeAfterSync(MTR_V_PWM_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);
    
        EPWM_setSyncInPulseSource(MTR_W_PWM_BASE, PWM_SYNC_SOURCE);
        EPWM_enablePhaseShiftLoad(MTR_W_PWM_BASE);
        EPWM_setPhaseShift(MTR_W_PWM_BASE, 2);
        EPWM_setCountModeAfterSync(MTR_W_PWM_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);
    
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        return;
    }

    此致

    Ashwin Bhaskar A.

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

    尊敬的 Ashwin:

    从切换后、时序不应发生变化  

    [引述 userid=“624746" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1542338/tms320f28p659dk-q1-drv8343s-f28p65x-custom-board-current-measurement-issue-via-adc/5941750 ]TM320F28P650DK9 至 TMS320F28P659DK8-Q1

    两者的工作原理应该相同。

    BR、

    Nilesh