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.

[参考译文] TMS320F28377D:使用 CLB 工具的 ePWM

Guru**** 2465890 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/977708/tms320f28377d-epwm-using-clb-tool

器件型号:TMS320F28377D
Thread 中讨论的其他器件:SysConfig

您好!

我想使用 CLB 工具、使用 PWM1和 PWM2的 ePWM 内部外设生成定制的 ePWM 信号、并在 TITL 中应用以下逻辑、 通过使用 CLB 覆盖选项在 GPIO4和 GPIO5引脚上生成 PWM3A 和 PWM3B。   

(PWM3A= PWM1A  XOR PWM2A)和(PWM3B =PWM1B   NXOR  PWM2B)

我修改 了 CLB_EX8_EXTERNAL_SIGNAL_AND_GATE CLB 示例、并插入了一些额外的代码、以将 PWM1和 PWM2信号作为全局信号生成。

但是、我没有得到我要查找的信号。 所以请告诉我吗?

#include "driverlib.h"
#include "device.h"
#include "clb_config.h"
#include "clb.h"
#include "board.h"
#include "F28x_Project.h"


void InitEPwm1 (void); //初始化 ePWM 模块1.
空 InitEPwm2 (空);



void main (void)
{

device_init();
DEVICE_initGPIO();

interrupt_initModule();
interrupt_initVectorTable();


InitEPwm1();//
InitEPwm2();//


SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM3);




Board_init();

initTILE1 (myCLB0_BASE);
clb_enableCLB (myCLB0_BASE);


while (1)
{

asm (" NOP");
}
}
空 InitEPwm1 (空)
{
EPwm1Regs.TBPRD = 450;//周期= 900 TBCLK 计数
EPwm1Regs.TBPHS.bit.TBPHS = 0;//将相位寄存器设置为零
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//主机模块
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步下流模块
EPwm1Regs.CMPA.bit.CMPA= 285;//调整输出 EPWM1A 的占空比
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
EPwm1Regs.DBRED.bit.DBRED = 20;//死区发生器上升沿延迟计数寄存器
EPwm1Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存
器}

///----------------------------------------------
空 InitEPwm2 (空)
{
EPwm2Regs.TBPRD = 450;//周期= 900 TBCLK 计数
EPwm2Regs.TBPHS.bit.TBPHS = 300;//相位= 300/900 * 360 = 120度
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//从机模块
EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;//同步时倒计数(=120度)
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步直通
EPwm2Regs.CMPA.bit.CMPA = 285;//调整输出 EPWM2A 的占空比
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM2A 的操作
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
EPwm2Regs.DBRED.bit.DBRED = 20;//死区发生器上升沿延迟计数寄存器
EPwm2Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存
器}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在此处向我发送您的 SYSCFG 文件和 main.c 文件。

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

    你好、Nima、  

    感谢您的回复。 请查找附件。 系统不允许我连接 syscfg。 文件、因此我要附加完整的文件夹。

    我还包含了完整的项目、因为我已将头文件添加到原始示例项目中。  

    供参考、 我在大学开发的定制控制板上使用 F28377D 微控制器、但 GPIO 引脚是相同的。  我随函附上相关文件。  

    e2e.ti.com/.../F28377D-controller-software-description-v1_5F00_01.pdf

    e2e.ti.com/.../CLBTool.zip 

    e2e.ti.com/.../0753.clb_5F00_ex8_5F00_external_5F00_signal_5F00_AND_5F00_gate1.c

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

    您的硬件中有问题、您的代码看起来是正确的。 这是我的最新一个结果。

    //########################################################################################################################
    //
    ////文件:clb_EX8_external_signal_and_gate.c
    //
    //标题:CLB 外部信号和门。
    //
    //! \addtogroup driver_example_list
    //! 

    CLB 外部信号与门

    //! //! 有关此示例的详细说明、请参阅: //! C2000Ware_path\utilities\clb_tool\clb_syscfg\doc\clbTool 用户 Guide.pdf //! // // //////////############################################################################################################################ //$TI 发布:F2837xD 支持库 v3.12.00.00 $// $发布 日期:星期五2月5日23:22:05 IST 2021 $// 版权所有: //版权所有(C) 2013-2021 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## include "driverlib.h" #include "device.h" #include "clb_config.h" #include "clb.h" #include "board.h" void initEPWM (uint32_t base); void main (void) { device_init(); DEVICE_initGPIO(); interrupt_initModule(); interrupt_initVectorTable(); Board_init(); SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM3); initTILE1 (myCLB3_base); clb_enableCLB (myCLB3_base); // //初始化没有相移的 PWM1作为主器件 // initEPWM (myEPWM1_base); // //使用300 TBCLK 的相移初始化 PWM2 // initEPWM (myEPWM2_base); ePWM_selectPeriodLoadEvent (myEPWM2_base、ePWM_SHAD_LOAD_MODE_SYNC); ePWM_setPhaseShift (myEPWM2_base、300); ePWM_setTimeBaseCounter (myEPWM2_base、300); while (1) { asm (" NOP"); } } void initEPWM (uint32_t base) { // //设置 TBCLK // ePWM_setTimeBasePeriod (base、450); ePWM_setPhaseShift (base、0U); ePWM_setTimeBaseCounter (base、0U); // //设置比较值 // ePWM_setCounterCompareValue (基本值、 ePWM_COUNTER_COMPARE_A、 450/2); ePWM_setCounterCompareValue (基本值、 ePWM_COUNTER_COMPARE_B、 450/4); // //设置计数器模式 // ePWM_setTimeBaseCounterMode (base、ePWM_COUNTER_MODE_UP); ePWM_DisablePhaseShiftLoad (base); ePWM_setClockPrescaler (base、 ePWM_CLOCK 分频器_8、 ePWM_HSCLOCK_DEVIDER_1); // //设置隐藏 // EPWM_setCounterCompareShadowImage LoadMode (基本、 ePWM_COUNTER_COMPARE_A、 ePWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowImage LoadMode (基本、 ePWM_COUNTER_COMPARE_B、 ePWM_COMP_LOAD_ON_CNTR_ZERO); // //设置操作 // ePWM_setActionQualifierAction (base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_zero); ePWM_setActionQualifierAction (base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 高电平、 ePWM_AQ_output_on_timebase_zero); ePWM_setActionQualifierAction (base、 ePWM_AQ_OUTPUT A、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_up_CMPA); ePWM_setActionQualifierAction (base、 ePWM_AQ_OUTPUT _B、 ePWM_AQ_OUTPUT 低电平、 ePWM_AQ_output_on_timebase_up_CMPB); // //中断,我们将在其中更改比较值 //选择 INT on 时基计数器零事件, //启用 INT,在发生第1个事件时生成 INT // ePWM_setInterruptSource (base、ePWM_INT_TBCTR_ZERO); ePWM_DisableInterrupt (base); ePWM_setInterruptEventCount (base、1U); }

    SysConfig 文件:

    /**
    *导入此配置中使用的模块。
    *
    / const CLB = scripting.AddModule ("/driverlib/clb.js、{}、false);
    const clb1 = clb.addInstance();
    const ePWM = scripting.AddModule ("/driverlib/epwm.js、{}、false);
    const epwm1 = ePWM.addInstance();
    const epwm2 = ePWM.addInstance();
    const epwm3 = ePWM.addInstance();
    const 逻辑块 = Scripting.AddModule ("/utilities/clb_tool/clb_syscfg/source/TILE);
    const TILE1 = tile.addInstance();
    const clb_run_dynamic 模板_clb_c = scripting.AddModule ("/utilities/clb_tool/clb_syscfg/source/clb_run_dynamic_template_clb_c.js);
    const clb_run_dynamic 模板_clb_dot = scripting.AddModule ("/utilities/clb_tool/clb_syscfg/source/clb_run_dynamic_template_clb_dot.js);
    const clb_run_model_clb_h = CLb.AddModule_template**
    
    
    
    ("rature_scription_/utilities/clb_tool/clb_syscfg/source/clb_run_dynamic_template_clb_h.js);const CLB_modules ("rulation_sim_scription_modules")*已导入自定义 CLB_scription_modules ("/utilities/clb_tool/clb_syscfg/source/clb_run_dynamic_template_clb_sim.js);
    */
    clb1.clbBase ="CLB3_base";
    clb1.outputsToOverridePeripheral =["CLB_OUT0"、"CLB_OUT2"];
    clb1.inputsUsed =["CLB_IN0"、"CLB_IN1"、"CLB_IN2"、"CLB_IN3";
    clb1.inputTypeCLB_IN0 ="global";
    clb1.synchronizeCLB_IN0 = true;
    clb1.inputTypeCLB_IN1 ="global";
    clb1.globalConfigCLB_IN1 ="clb_global_in_MUX_EPWM1B";
    clb1.synizeCLB_IN1 = true;
    clb1.inputTypeCLB_IN2 ="global";
    clb1.globalConfigCLB_IN2 ="clb_global_in_MUX_EPWM2A";
    clb1.synchronizeCLB_IN2 = true;
    clb1.inputTypeCLB_IN3 ="global";
    clb1.globalConfigCLB_in3 ="clb_global_in_MUX_EPWM2B";
    clb1.synizeCLB_in3. = true;
    clb1.$name ="myCLB3";
    clb1.enableCLB = true;
    
    epwm1.$name ="myEPWM1";
    epwm1.ePWM.$assign ="EPWM1";
    epwm1.ePWM.epwmaPin。$assign ="GPIO0";
    epwm1.ePWM.epwmbPin。$assign ="GPIO1";
    
    epwm2.$name ="myEPWM2";
    epwm2.ePWM.$assign ="EPWM2";
    epwm2.ePWM.epwmaPin。$assign ="GPIO2";
    epwm2.ePWM.epwmbPin。$assign ="GPIO3";
    
    epwm3.$name ="myEPWM3";
    epwm3.ePWM.$assign ="EPWM3";
    epwm3.ePWM.epwmaPin。$assign ="GPIO4";
    epwm3.ePWM.epwmbPin。$assign ="GPIO5";
    
    TILE1.$name ="TILE1";
    TILE1.bound.$name ="BOUNDARY0";
    TILE1.LUT_0.$name ="LUT_0";
    TILE1.LUT_0.i0 ="BOUNDARY.in0";
    TILE1.LUT_0.i1. ="BOUNDARY.in2";
    TILE1.LUT_0.eqn ="i0^i1";
    TILE1.LUT_1.$name ="LUT_1";
    TILE1.LUT_1.i0 ="BOUNDARY.in1";
    TILE1.LUT_1.i1. ="BOUNDARY.in3";
    TILE1.LUT_1.eqn ="!(i0^i1)";
    TILE1.LUT_2.$name ="LUT_2";
    TILE1.FSM_0..$name ="FSM_0";
    TILE1.FSM_1.$name ="FSM_1";
    TILE1.FSM_2.$name ="FSM_2";
    TILE1.COUNTER_0.$name ="counter_0";
    TILE1.counter_1.$name ="counter_1";
    TILE1.counter_2.$name ="counter_2";
    TILE1.OUTLUT_0.$name ="OUTLUT_0";
    TILE1.OUTLUT_0.eqn ="i0";
    TILE1.OUTLUT_0.i0 ="LUT_0.out";
    TILE1.OUTLUT_1.$name ="OUTLUT_1";
    TILE1.OUTLUT_2.$name ="OUTLUT_2";
    TILE1.OUTLUT_2.i0 ="LUT_1.out";
    TILE1.OUTLUT_2.eqn ="i0";
    TILE1.OUTLUT_3.$name ="OUTLUT_3";
    TILE1.OUTLUT_4.$name ="outlut_4";
    TILE1.outlut_5.$name ="OUTLUT_5";
    TILE1.OUTLUT_6.$name ="OUTLUT_6";
    TILE1.OUTLUT_7.$name ="outlut_7";
    TILE1.hlc.$name ="HLC_0";
    TILE1.HLC.program0.$name ="HLCP_0";
    TILE1.HLC.program1.$name ="HLCP_1";
    TILE1.HLC.program2.$name ="HLCP_2";
    TILE1.HLC.program3.$name ="HLCP_3";
    

    结果为异或。

    在编写专业代码时、请务必在小段中执行。 一个好的调试器应该将他们的代码分频、并在继续下一步前查看哪个代码片段独立工作。

    上面的代码正常工作、现在我已经在我的硬件上对其进行了测试。

    下次请确保以最少的编辑测试示例、并在示例基础上逐步构建。  

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nima、 我非常感谢您对此的支持以及您花的时间来解决问题。 正如您所说,我的硬件中有问题,这是正确的。 是否可以在修改后向我发送完整的项目文件? 我只想确保我具有与您相同的项目属性。 希望我不会再麻烦你了。 此致, Mohammed
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../clb_5F00_ex8_5F00_external_5F00_signal_5F00_AND_5F00_gate.zip

    感谢您、请确保单击代码上的验证答案以及随附的 zip +我之前的评论。

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

    你是极好的 Niam。 非常感谢。

    我真的很感激!

    此致、

    穆罕默德

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

    您好、Niam、

    我觉得我不希望让 CLB 发挥作用  

    我使用了您发送给我的.c 和.syscfg 文件并构建了代码、没有错误。 然而、当我对其进行调试时、我会使 PWM3信号像以前一样持续地处于高电平有效状态、它不会切换到正确的信号。 尽管我可以在引脚 GOPI4和 GPIO5上生成 PWM3信号、但没有 CLB 工具的情况下没有问题。 因此、我的控制板没有任何问题。

    我建立了一个寻求帮助的新论坛,这将是最后的尝试。

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/978055

    万分感谢!

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

    它必须是您的硬件...