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.

[参考译文] TMS320F28027:使用驱动程序库的高分辨率相位控制模式

Guru**** 2614265 points
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/687950/tms320f28027-high-resolution-phase-control-mode-using-driver-libraries

器件型号:TMS320F28027
Thread 中讨论的其他器件:C2000WAREcontrolSUITE

在另一篇文章("代码实现高分辨率相位控制。">e2e.ti.com/.../677071)中、我了解了如何使用"structs"代码实现高分辨率相位控制。 在这里、我想转换为使用"驱动程序"代码来使用驱动程序库。 C2000Ware 中没有一个使用高分辨率相位控制的示例、它们都使用"PWM_HrControlMode_Duty"。

我几乎完全遵循了我的结构代码、但似乎没有用于显式更改高分辨率相位值的函数。 有一个用于粗相的函数、即 PWM_setPhase (myPwm2、0)、但我不知道如何直接更改 HR 相位值(在结构版本中、我使用 EPwm2Regs.TBPHS.half.TBPHSHR = 100 << 8)。

这是相关代码。 有人可以帮助我通过驱动程序库实现高分辨率相移吗?

CLK_disableTbClockSync (myClk);

UINT16周期= 120;

CLK_enablePwmClock (myClk、PWM_Number_1);

PWM_setPeriodLoad (myPwm1、PWM_PeriodLoad_Immediate);
PWM_setPeriod (myPwm1、period-1);//设置定时器周期
PWM_setCmpA (myPwm1、period / 2);

PWM_setPhase (myPwm1、0x0000);//初始阶段为0
PWM_setCount (myPwm1、0x0000);//清除计数器

(myPwm_setPwm1、myPwm1); //对
PWM_DisableCounterLoad 进行计数(myPwm1); // ePWM1是主
PWM_setSyncMode (myPwm1、PWM_SyncMode_CounterEqualZero);
PWM_setHighSpeedClkDiv (myPwm1、PWM_HspClkDiv_By_1);//时钟与 SYSCLKOUT 的比值
PWM_setClkDiv (myPwm1、PWM_1

、myPwm1);myPwm_setWPWM_1、
myPwm1、myPwm1、myPwm1和 myPwm1、myPwm1、myPwm1、myPwm1、myPwm1、myPwm1、myPwm1和 myPwmWM_1);myPwmWPM_Action_1


PWM_ActionQUAL_CLEAR);

PWM_setHrEdgeMode (myPwm1、PWM_HrEdgeMode_Both);
PWM_enableAutoConvert (myPwm1);
PWM_setHrControlMode (myPwm1、 PWM_HrControlMode_Phase);
PWM_setHrShadowImage 模式(myPwm1、PWM_HrShadowImage Mode_CTR_EQ_0);
PWM_enableHrPhaseSync (myPwm1);


CLK_enablePwmClock (myClk、 PWM_NUMBER_2);

PWM_setPeriodLoad (myPwm2、PWM_PeriodLoad_Immediate);
PWM_setPeriod (myPwm2、period-1); //设置定时器周期
PWM_setCmpA (myPwm2、period / 2);

PWM_setPhase (myPwm2、0);//相位初始为0
PWM_setCount (myPwm2、0x0000);//清除计数

器 PWM_setCounterMode (myPwm2、PWM_CounterMode_Up); //递增计数
PWM_enableCounterLoad (myPwm2);
PWM_setSyncMode (myPwm2、PWM_SyncMode_EPWMxSYNC);
PWM_setHighSpeedClkDiv (myPwm2、PWM_HspClkDiv_BY_1); //时钟与 SYSCLKOUT
PWM_setClkDiv (myPwm2、PWM_ClkDiv_BY_1)的比率;

PWM_setShadowImage Mode_CmpA (myPwm2、PWM_ShadowImage Mode_Shadow);//每零装载一次寄存
器 PWM_setLoadMode_cmpA (myPwm2、PWM_Action_Zero_Pwm_Pwm_Set);// myPwm_Pwm_Cmp1


(myPwm_DPM_Action_Zer_Pwm_Cwm_Cwm_Cwm_Cwm_Cwm_CmpA、myPwm_Cwm_Cwm_Zer_D PWM_ActionQUAL_CLEAR);

PWM_setHrEdgeMode (myPwm2、PWM_HrEdgeMode_Both);
PWM_setHrControlMode (myPwm2、PWM_HrControlMode_Phase);
PWM_setHrShadowImage 模式(myPwm2、PWM_HrShadowImage Mode_CTR_EQ_0);
PWM_enableHrPhaseSync (myPwm2);
PWM_enableAutoConvert (myPwm2);

PWM_setPhase (myPwm2、 1);//与 ePWM1同步并相移16.67ns 

CLK_enableTbClockSync (myClk);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    虽然 TBPHSHR 寄存器已经在 PWM_Obj 结构中、但我们似乎没有涵盖该功能的驱动程序。 您应该能够写入类似 myPwm2->TBPHSHR = 100 <<8的内容。

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

    Whitney、  

    我也曾想过,但是当我尝试时,我收到了以下错误:  

    我还尝试了如下操作:

    PWM_Obj * pwm3 =(PWM_Obj *) myPwm3;
    pwm3->HRMSTEP = 255;
    pwm3->TBPHSHR = 50 <<8;

    编译和上传的代码、但 PWM 根本没有相移、就好像我甚至不会添加这些代码行一样。

    我感谢您在解决此问题方面提供的任何帮助。

    谢谢、

    Jeff

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HRMSTEP 是一个受写保护的寄存器、因此您需要使用 ENABLE_PROTECTED_REGISTER_WRITE_MODE (或 EALLOW -相同的东西)对其进行写操作。

    您写入 TBPHSHR 的方式似乎可以。 您能否在 CCS 寄存器窗口中检查预期值是否正在写入该值?

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

    当我将粗略相位设置为2时、TBPHS 的前16位更改为0000000000000010

    接下来、当我将值更改为50 << 8时、我会看到0011001000000000。 这是我应该期望的结果、但我不测量示波器上的任何微小相移。

    Jeff
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您说过您有一个基于工作结构的示例工作。 在工作场景中、您能否在寄存器窗口中获取 PWM 模块的一些屏幕截图、并将其与驱动程序应用程序中的寄存器窗口进行比较? 应该可以帮助您找到您缺少的内容。

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

    Whitney、

    我认为我发现了我的问题。 我无法获取 ePWM1模块寄存器中的 HRMSTEP 值进行更改、即使在使用 ENABLE_PROTECTED_REGISTER_WRITE_MODE (我也尝试 了 EALLOW)时也是如此。  

    代码如下所示。 当我在调试模式下单步执行程序时、我观察到 HRMSTEP 寄存器不变。 但是、这种处理寄存器的方法适用于不受保护的寄存器、例如 TBPHSHR。 没有可用于改变 HRMSTEP 值的驱动程序函数。 如何更改此值?

    PWM_Obj * pwm1 =(PWM_Obj *) myPwm1;
    ENABLE_PROTECTED 寄存器_WRITE_MODE;
    pwm1->HRMSTEP = 255;
    disable_protected_register_write_mode;
    
    PWM_Obj * pwm2 =(PWM_Obj *) myPwm2;
    pwm2->TBPHSHR = 100 <<8; 

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

    在之前的 E2E 帖子中、我建议您使用 SFO 库并启用自动转换、以便校准例程计算适当的 MEP 比例因子并自动更新 HRMSTEP 寄存器。
    HRPWM 用户指南对此进行了说明。 www.ti.com/.../spruge8e.pdf
    下面是使用 SFO 的驱动程序示例:C:\ti\c2000\C2000Ware_1_00_04_00\device_support\f2802x\examples\drivers\HRPWM_Duty_SFO_v6

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

    是否无法通过手动设置 HRMSTEP 来实现此目的? 我想设置一次 HRMSTEP、然后在程序的稍后部分、根据特定条件更新 TBPHSHR。 为我的应用手动设置一次 HRMSTEP 比使用 SFO 简单。

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

    在应用程序代码中写入 HRMSTEP 是未记录的行为、因此您应该允许 SFO 库写入它。 对于温度或电压不会发生显著变化的应用、该应用可与初始化代码一起完成一次 SFO 校准。

    根据 HRPWM 用户指南:

    "高分辨率 MEP 阶跃
    当自动转换被启用(HRCNFG[AUTOCONV]= 1)时、这个8位字段包含
    硬件使用的 MEP_ScaleFactor (每个粗略步长的 MEP 步长数)
    自动将 CMPAHR、TBPHSHR 或 TBPRDHR 寄存器中的值转换为缩放值
    高分辨率 ePWM 输出上的微边沿延迟。
    该寄存器中的值在每次校准结束时由 SFO 校准软件写入
    运行。"

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

    Elizabeth、

    当给 SFO 尝试时、我得到下面的错误。 我像示例一样包含了"F2802x_common/include/SFO_v6.h"头文件、并将 SFO_TI_build_v6.lib 添加到项目中。 可以帮助我解决此错误吗?

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

    您能否在 Project Explorer 中确认、当"Includes"选项卡展开时、C:\ti\c2000Ware_1_00_04_00\libraries\calibration\HRPWM\f2802x\include 会列出? 如果不是,可以通过转到“属性”->“生成”->“包括选项”->“添加到搜索路径”来添加它。

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

    Elizabeth、  

    我的错误是使用的是 controlSUITE、而不是 C2000Ware。 我没有这样的文件目录。 我一直在尝试按如下方式设置我的项目:  

    我通过添加 SFO_TI_BUIK_V6并在代码中包含必要的文件对我的项目进行了适当的更改:

    #include "DSP28x_Project.h"

    #include "F2802x_common/include/SFO_v6.h"

    我的项目如下所示:  

    如果我无法确定、我想我可以尝试复制此示例并从此处开始、但我想了解如何使我的当前项目正确。

    谢谢、

    Jeff

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

    使用 controlSUITE 是可以的、并且看起来 SFO 头文件的路径是根据您的屏幕截图包含的。

    您能否检查您的项目的 C 文件中是否包含此代码?

    volatile struct ePWM_regs * ePWM[PWM_CH]=
    {&EPwm1Regs、&EPwm1Regs、&EPwm2Regs、&EPwm3Regs、&EPwm4Regs};

    SFO 库需要一个具有寄存器结构指针的数组、因为它使用位字段编程、而不是项目中的 Driverlib 编程。

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

    Elizabeth、

    是的、就是这样。 我在添加了示例中的所有代码后最终发现了这一点、直到我的项目被编译。 感谢您的支持!

    Jeff