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: C2000WARE, CONTROLSUITE

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

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

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

您好!

我是第一次尝试使用 CLB 工具来生成自定义的 ePWM 信号、它使用已经产生的另外两个 ePWM 信号:PWM1和 PWM2。

我要生成的第三个信号(PWM3)应基于以下逻辑:

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

我尝试通过 CLB 访问 EPWM1、2、3、并且使用(EPWM1A、EPWM2A、EPWM1B、EPWM2B) 作为 CLB 逻辑块的输入(使用 CLB3)、然后我在 CLB 模块的 LUT 中实现了逻辑、 然后  、通过 CLB 输出相交(覆盖)将信号输出到 EPWM3A 和 EPWM3B。

那么、请告诉我以下步骤是否正确?

此致、

穆罕默德  


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

    ePWM 模块中没有 EPWM3。 您需要添加它、并确保为 EPWM3选择 GPIO。 在输出相交后、CLB 将显示在这些引脚/ GPIO 上。

    同时在所有 CLB 输入上启用同步器。

    其他方面都做得很好,继续保持良好的工作!

    NIMA

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

    谢谢 Nima 的无限帮助、非常感谢!

    我按照您的步骤操作、但仍然无法从 GPIO4 (ePWM3A)和 GPIO (ePWM3B)获取任何信号。 我不确定如何为 LUT 块选择正确的输入、从而 选择 CLB 中分配的全局多路复用器输入作为 LUT 块的输入? 我是否必须首先将它们包含在边界块中?

    此外、我已经进行了一些搜索、并找到了如何确定我应该选择哪个特定的 CLB 输出信号来触发 PWM3A 和 PWM3B。 使用 《技术参考手册》、我选择了图片中所附的输出0和输出2。

    那么、如果我丢失了任何东西、请告诉我吗?

    此致、  

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

    我现在看到的一切看起来都是正确的。  

    对于 CLB 逻辑块、BOUNDARY0 = CLB INPUT0等。 您已正确获得该值。 您还使用了正确的 CLB 逻辑块输出。 CLB3 OUT0将覆盖 EPWM3A、OUT2将覆盖 EPWM3B。

    在 main 中的 C 代码中、该代码应该非常短、您调用的函数是什么?

    NIMA

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

    你好、Nima、

    正如我之前所说的、C 代码是使用 MATLAB Simulink 生成的。 我可以看到信号 ePWM1和 ePWM2、这没有问题。

    这是我的主要 C cdoe:

    #include "TwoPhaseForStuck.h"
    #include "rtwtypes.h"
    
    volatile int Isroverfos= 0;
    静态布尔值_T OverrunFlag = 0;
    void RT_OneStep (void)
    {
    /*检查溢出。 防止溢出标志被抢占*/
    if (OverrunFlag++){
    IsrOverf溢= 1;
    OverrunFlag--;
    return;
    }
    
    enableTimer0Interrupt();
    TwoPhaseForStuck_step ();
    
    //在此处获取模型输出*/
    disableTimer0Interrupt();
    OverrunFlag--;
    }
    
    volatile init_T stopored = false;
    int main (void)
    {
    volatile float_T runModel = true;
    modelBaseRate = 1.25E-tome_timerf
    
    
    ;#systemprofilenfrom_timer_200;#timer_tole_timerfrom_timer= tole_timerfrom_enf;#timer_tobole_timerfrom_timer= 200;#systemfrom_
    
    
    
    
    
    
    
    
    rtmSetErrorStatus (TwoPhaseForStuck_M、0);
    TwoPhaseForStuck_initialize ();
    configureTimer0 (modelBaseRate、systemClock);
    runModel =
    rtmGetErrorStatus (TwoPhaseForStuck_M)=(NULL);
    enableTimer0Interrupt ();
    globalInterruptEnable();
    while (runModel){
    已停止请求=!(
    rtmGetErrorStatus (TwoPhaseForStuck_M)=(NULL));
    runModel =!(stopRequestored);
    }/*
    
    在此禁用 RT_OneStep ()*//
    
    *终止模型*/
    TwoPhaseForStuck_Terminate();
    globalInterruptDisable ();
    return 0;
    }/*
    
    
    生成代码的文件尾部。
    *
    *[EOF]
    */
    

    另一个 c-fil 如下:

    #include "TwoPhaseForStuck .h"
    #include "TwoPhaseForStuck_private.h"
    
    /*块信号(默认存储)*/
    B_TwoPhaseForStuck T TwoPhaseForStuck;
    
    //*实数模型*/*
    ** StuPhaseForSt_T
    
    
    
    
    
    
    
    
    = t_StuPhase_StuPhoState_StuPhoT;**= t_StuPhase_StuPhase_StuPhase_StuPhoStuPhoStuPhoStuPhd&t =* 16 *** Phase_StuPhase_StuPhase_StuPhase_StuPhase_StuPhoStuPht_T = t_StuPhase_StuPhase_StuPht_T = t_StuPhase_StuPhase_StuPht_T = t_StuPhase_StuPhase_StuPhoPhd&t
    
    /* S-function (c2802xadc):' /adc '*/
    {
    /*内部基准电压:0至3.3V 的固定刻度范围。 *
    /*外部基准电压:VREFHI (ADCINA0)= 3.3和 VREFLO (接地)= 0 */的允许范围
    TwoPhaseForStuck_B.ADC =(AdcbResultRegs.ADCRESULT1);
    }
    
    // S 函数(c2802xadc):' /adc_1'*/
    {
    /*内部基准电压:0至3.3V 的固定刻度范围。 *
    /*外部基准电压:VREFHI (ADCINA0)= 3.3和 VREFLO (接地)= 0 */的允许范围
    TwoPhaseForStuck_B.ADC_1 =(AdcaResultRegs.ADCRESULT0);
    }
    
    // S 函数(c2802xadc):' /adc_2'*/
    {
    /*内部基准电压:0至3.3V 的固定刻度范围。 *
    /*外部基准电压:VREFHI (ADCINA0)= 3.3和 VREFLO (接地)= 0 */的允许范围
    TwoPhaseForStuck_B.ADC_2 =(AdcbResultRegs.ADCRESULT0);
    }
    
    /*增益:' /TMPRD'包含:
    *常量:' /DuryCycle *
    /
    RTB_TMPRRD = TwoPhaseForStuck_P.TMPRRD_GAIN *
    TwoPhaseForStuck_P.DuryCycle 值;
    
    // S 函数(c2802xpwm):' /ePWM4'*/
    
    *--更新 ePWM1的 CMPA 值--*/
    {
    EPwm1Regs.CMPA.bit.CMPA =(uint16_T)(RTB_TMPRRD);
    }
    
    // S 函数(c2802xpwm):' /ePWM5'包含:
    *常量:' /Phase_2'
    */
    EPwm2Regs.TBPHS.bit.TBPHS = TwoPhaseForStuck_P.Phase_2_value;
    
    /*-更新 ePWM2的 CMPA 值-*/
    {
    EPwm2Regs.CMPA.bit.CMPA =(uint16_T)(RTB_TMPRRD);
    }
    
    
    //模型函数*
    / void TwoPhaseForStuck_initialize (void)
    {
    //注册码*//
    
    */*
    错误状态*/ rtmSetMemStatus (TwoPhaseForStuck_M)(
    
    
    void *)、*(void)*//初始化错误状态*(void)、//(void)*/stuPhaseStu_M (void)、*(void)、//(void)、//(void)
    sizeof (B_TwoPhaseForStuck_T);
    
    /* S 函数(c2802xadc)的开始:' /adc'*/
    if (adcBInitFlag = 0){
    InitAdcB();
    adcBInitFlag = 1;
    }
    
    CONFIG_ADCB_SOC1 ();
    
    /* S 函数(c2802xadc)的开始:' /adc_1'*/
    if (adcAInitFlag = 0){
    InitAdcA();
    adcAInitFlag = 1;
    }
    
    CONFIG_ADCA_SOC0 ();
    
    // S 函数的开始(c2802xadc):' /adc_2'*/
    if (adcBInitFlag = 0){
    InitAdcB();
    adcBInitFlag = 1;
    }
    
    CONFIG_ADCB_SOC0 ();
    
    // S 函数的开始(c2802xpwm):' /ePWM4'*/
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    /***初始化 ePWM1模块***/
    {
    /*//时基控制寄存器
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; //计数器模式
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 1; //同步输出选择
    EPwm1Regs.TBCTL.bit.PRDLD = 0; //阴影选择
    EPwm1Regs.TBCTL.bit.PHSEN = 0; //相位负载使能
    EPwm1Regs.TBCTL.bit.PHSDIR = 0; //相位方向位
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //高速 TBCLK 预分频器
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; //时基时钟预分频器
    EPwm1Regs.TBCTL.bit.SWFSYNC = 0; //软件强制同步脉冲
    *
    EPwm1Regs.TBCTL.ALL =(EPwm1Regs.TBCTL.ALL &~0x3FFF)| 0x10;
    
    /*--设置时基(TB)子模块-*/
    EPwm1Regs.TBPRD = 999; //时基周期寄存器
    
    /*//时基相位寄存器
    EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位偏移寄存器
    *
    EPwm1Regs.TBPHS.ALL =(EPwm1Regs.TBPHS.ALL &~0xFFFFFF0000)| 0x0;
    
    //时基计数器寄存器
    EPwm1Regs.TBCTR = 0x0000; /*清除计数器*/
    
    /*--设置计数器比较(CC)子模块-*/
    /*//计数器比较控制寄存器
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;//比较 A 寄存器块运行模式
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;//比较 B 寄存器块运行模式
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; //活动比较 A 加载
    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; //活动比较 B 加载
    *
    EPwm1Regs.CMPCTL.ALL =(EPwm1Regs.CMPCTL.ALL &~0x5F)| 0x0;
    
    /* EPwm1Regs.CMPCTL2.bit.SHDWCMODE = 0;//比较 C 寄存器块运行模式
    
    EPwm1Regs.CMPCTL2.bit.SHDWDMODE = 0;//比较 D 寄存器块运行模式
    *
    EPwm1Regs.CMPCTL2.ALL =(EPwm1Regs.CMPCTL2.ALL &~0x50)| 0x0;
    EPwm1Regs.CMPA.bit.CMPA = 0; //计数器比较 A 寄存器
    EPwm1Regs.CMPB.bit.CMPB = 0; //计数器比较 B 寄存器
    EPwm1Regs.CMPC = 0; //计数器比较 C 寄存器
    EPwm1Regs.CMPD = 0; //计数器比较 D 寄存器
    
    /*--设置动作限定符(AQ)子模块-*/
    EPwm1Regs.AQCTLA.ALL = 33; //输出 A 的操作限定器控制寄存器
    EPwm1Regs.AQCTLB.all = 96; //输出 B 的操作限定器控制寄存器
    
    /*//操作限定符软件强制寄存器
    EPwm1Regs.AQSFRC.bit.RLDSF = 0; //从阴影选项重新加载
    *
    EPwm1Regs.AQSFRC.ALL =(EPwm1Regs.AQSFRC.ALL &~0xC0)| 0x0;
    
    /*//操作限定符连续软件强制寄存器
    EPwm1Regs.AQCSFRC.bit.CSFA = 0; //输出 A 上的 Continuous Software Force
    EPwm1Regs.AQCSFRC.bit.CSFB = 0; //输出 B 上的持续软件力
    *
    EPwm1Regs.AQCSFRC.ALL =(EPwm1Regs.AQCSFRC.ALL &~0xF)| 0x0;
    
    /*--设置死区发生器(DB)子模块-*/
    /*//死区发生器控制寄存器
    EPwm1Regs.DBCTL.bit.OUT_MODE = 3; //死区输出模式控制
    EPwm1Regs.DBCTL.bit.IN_MODE = 0; //死区输入选择模式控制
    EPwm1Regs.DBCTL.bit.POLSEL = 2; //极性选择控制
    EPwm1Regs.DBCTL.bit.HALFCYCLE = 0; //半周期计时启用
    *
    EPwm1Regs.DBCTL.ALL =(EPwm1Regs.DBCTL.ALL &~0x803F)| 0xB;
    EPwm1Regs.DBRED.bit.DBRED = 20;//死区发生器上升沿延迟计数寄存器
    EPwm1Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存器
    
    /*--设置事件触发器(ET)子模块-*/
    /*//事件触发器选择和预分频寄存器
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; //转换开始 A 使能
    EPwm1Regs.ETSEL.bit.SOCASELCMP = 0;
    EPwm1Regs.ETSEL.bit.SOCASEL = 4; //转换开始选择
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // EPWM1SOCA 周期选择
    
    EPwm1Regs.ETSEL.bit.SOCBEN = 0; //转换 B 开始使能
    
    EPwm1Regs.ETSEL.bit.SOCBSELCMP = 0;
    EPwm1Regs.ETSEL.bit.SOCBSEL = 1; //转换开始选择
    EPwm1Regs.ETPS.bit.SOCBPRD = 1; // EPWM1SOCB 周期选择
    EPwm1Regs.ETSEL.bit.INTEN = 0; // EPWM1INTn 使能
    EPwm1Regs.ETSEL.bit.INTSELCMP = 0;
    EPwm1Regs.ETSEL.bit.INTSEL = 4; //转换开始选择
    
    EPwm1Regs.ETPS.bit.INTPRD = 1; // EPWM1INTn 周期选择
    *
    EPwm1Regs.ETSEL.ALL =(EPwm1Regs.ETSEL.ALL &~0xFF7F)| 0x1C04;
    EPwm1Regs.ETPS.ALL =(EPwm1Regs.ETPS.ALL &~0x3303)| 0x1101;
    
    /*-设置 PWM-Chopper (PC)子模块-*/
    /*// PWM 斩波器控制寄存器
    EPwm1Regs.PCCTL.bit.CHPEN = 0; // PWM 斩波使能
    EPwm1Regs.PCCTL.bit.CHPFREQ = 0; //斩波时钟频率
    EPwm1Regs.PCCTL.bit.OSHTWTH = 0; //单次脉冲宽度
    EPwm1Regs.PCCTL.bit.CHPDUTY = 0; //斩波时钟占空比
    *
    EPwm1Regs.PCCTL.ALL =(EPwm1Regs.PCCTL.ALL &~0x7FF)| 0x0;
    
    /*--设置跳闸区域(TZ)子模块-*/
    EALLOW;
    EPwm1Regs.TZSEL.ALL = 0; //跳匣区域选择寄存器
    
    /*//跳匣区域控制寄存器
    EPwm1Regs.TZCTL.bit.TZA = 3; // EPWM1A 上的 TZ1至 TZ6跳闸动作
    EPwm1Regs.TZCTL.bit.TSB = 3; // EPWM1B 上的 TZ1至 TZ6跳闸动作
    EPwm1Regs.TZCTL.bit.DCAEVT1 = 3; // DCAEVT1上的 EPWM1A 动作
    EPwm1Regs.TZCTL.bit.DCAEVT2 = 3; // DCAEVT2上的 EPWM1A 动作
    EPwm1Regs.TZCTL.bit.DCBEVT1 = 3; //对 DCBEVT1执行 EPWM1B 操作
    EPwm1Regs.TZCTL.bit.DCBEVT2 = 3; //对 DCBEVT2执行 EPWM1B 操作
    *
    EPwm1Regs.TZCTL.ALL =(EPwm1Regs.TZCTL.ALL &~0xFFF)| 0xFFF;
    
    /*//跳匣区域启用中断寄存器
    EPwm1Regs.TZEINT.bit.OST = 0; //跳匣区域一次性内部启用
    EPwm1Regs.TZEINT.bit.CBC = 0; //跳匣区域逐周期内部启用
    EPwm1Regs.TZEINT.BIT.DCAEVT1 = 0; //数字比较 A 事件1内部启用
    EPwm1Regs.TZEINT.BIT.DCAEVT2 = 0; //数字比较 A 事件2内部启用
    EPwm1Regs.TZEINT.BIT.DCBEVT1 = 0; //数字比较 B 事件1内部启用
    EPwm1Regs.TZEINT.BIT.DCBEVT2 = 0; //数字比较 B 事件2内部启用
    *
    EPwm1Regs.TZEINT.ALL =(EPwm1Regs.TZEINT.ALL &~0x7E)| 0x0;
    
    /*//数字比较 A 控制寄存器
    EPwm1Regs.DCACTL.bit.EVT1SYNCE = 0; // DCAEVT1同步使能
    EPwm1Regs.DCACTL.bit.EVT1SOCE = 1; // DCAEVT1 SOC 启用
    EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0; // DCAEVT1强制同步信号
    EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 0; // DCAEVT1源信号
    EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 0; // DCAEVT2强制同步信号
    EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 0; // DCAEVT2源信号
    *
    EPwm1Regs.DCACTL.ALL =(EPwm1Regs.DCACTL.ALL &~0x30F)| 0x4;
    
    /*//数字比较 B 控制寄存器
    EPwm1Regs.DCBCTL.bit.EVT1SYNCE = 0; // DCBEVT1同步使能
    EPwm1Regs.DCBCTL.bit.EVT1SOCE = 0; // DCBEVT1 SOC 启用
    EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 0; // DCBEVT1强制同步信号
    EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = 0; // DCBEVT1源信号
    EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 0; // DCBEVT2强制同步信号
    EPwm1Regs.DCBCTL.bit.EVT2SRCSEL = 0; // DCBEVT2源信号
    *
    EPwm1Regs.DCBCTL.ALL =(EPwm1Regs.DCBCTL.ALL &~0x30F)| 0x0;
    
    /*//数字比较跳闸选择寄存器
    EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0; //数字比较 A 高 COMP 输入选择
    
    EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = 1; //数字比较 A 低 COMP 输入选择
    EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0; //数字比较 B 高 COMP 输入选择
    EPwm1Regs.DCTRIPSEL.bit.DCBLCOMPSEL = 1; //数字比较 B 低 COMP 输入选择
    
    
    
    
    
    *
    EPwm1Regs.DCTRIPSEL.ALL =(EPwm1Regs.DCTRIPSEL.ALL &~ 0xFFFF)| 0x1010;
    
    /*//跳匣区域数字比较器选择寄存器
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0; //数字比较输出 A 事件1
    EPwm1Regs.TZDCSEL.bit.DCAEVT2 = 0; //数字比较输出 A 事件2
    EPwm1Regs.TZDCSEL.bit.DCBEVT1 = 0; //数字比较输出 B 事件1
    EPwm1Regs.TZDCSEL.bit.DCBEVT2 = 0; //数字比较输出 B 事件2
    *
    EPwm1Regs.TZDCSEL.ALL =(EPwm1Regs.TZDCSEL.ALL &~0xFFF)| 0x0;
    
    /*//数字比较滤波器控制寄存器
    EPwm1Regs.DCFCTL.bit.Blanke = 0; //消隐启用/禁用
    EPwm1Regs.DCFCTL.bit.PULSESEL = 1; //针对消隐和捕捉对齐的脉冲选择
    EPwm1Regs.DCFCTL.bit.BLANKINV = 0; //消隐窗口反转
    EPwm1Regs.DCFCTL.bit.SRCEL = 0; //过滤器块信号源选择
    *
    EPwm1Regs.DCFCTL.ALL =(EPwm1Regs.DCFCTL.ALL &~0x3F)| 0x10;
    EPwm1Regs.DCFOFFSET = 0; //数字比较滤波器偏移寄存器
    EPwm1Regs.DCFWINDOW=0; //数字比较滤波器窗口寄存器
    
    /*//数字比较捕捉控制寄存器
    EPwm1Regs.DCCAPCTL.bit.Cape = 0; //计数器捕获启用
    *
    EPwm1Regs.DCCAPCTL.ALL =(EPwm1Regs.DCCAPCTL.ALL &~0x1)| 0x0;
    
    /*// HRPWM 配置寄存器
    EPwm1Regs.HRCNFG.bit.SWAPAB = 0; //交换 EPWMA 和 EPWMB 输出位
    EPwm1Regs.HRCNFG.bit.SELOUTB = 0; // EPWMB 输出选择位
    *
    EPwm1Regs.HRCNFG.ALL =(EPwm1Regs.HRCNFG.ALL &~0xA0)| 0x0;
    
    /*使用所有比较值和 TBPRD 的链接值更新链接寄存器*/
    /*如果 ePWM 寄存器存在于模型中或不存在于*/中,则不会抛出错误
    EPwm1Regs.EPWMXLINK 位 TBPRDLINK = 0;
    EPwm1Regs.EPWMXLINK.BIT.CMPALINK = 0;
    EPwm1Regs.EPWMXLINK 位 CMPBLINK = 0;
    EPwm1Regs.EPWMXLINK.BIT.CMPCLINK = 0;
    EPwm1Regs.EPWMXLINK.BIT.CMPDLINK = 0;
    EDIS;
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    }
    
    /* S 函数(c2802xpwm)开始:' /ePWM5'包含:
    *常量:' /Phase_2'
    */
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    /***初始化 ePWM2模块***/
    {
    /*//时基控制寄存器
    EPwm2Regs.TBCTL.bit.CTRMODE = 0; //计数器模式
    EPwm2Regs.TBCTL.bit.SYNCOSEL = 0; //同步输出选择
    EPwm2Regs.TBCTL.bit.PRDLD = 0; //阴影选择
    EPwm2Regs.TBCTL.bit.PHSEN = 1; //相位负载使能
    EPwm2Regs.TBCTL.bit.PHSDIR = 0; //相位方向位
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0; //高速 TBCLK 预分频器
    EPwm2Regs.TBCTL.bit.CLKDIV = 0; //时基时钟预分频器
    EPwm2Regs.TBCTL.bit.SWFSYNC = 0; //软件强制同步脉冲
    *
    EPwm2Regs.TBCTL.ALL =(EPwm2Regs.TBCTL.ALL &~0x3FFF)| 0x4;
    
    /*--设置时基(TB)子模块-*/
    EPwm2Regs.TBPRD = 999; //时基周期寄存器
    
    /*//时基相位寄存器
    EPwm2Regs.TBPHS.bit.TBPHS = 0; //相位偏移寄存器
    *
    EPwm2Regs.TBPHS.ALL =(EPwm2Regs.TBPHS.ALL &~0xFFFFFF0000)| 0x0;
    
    //时基计数器寄存器
    EPwm2Regs.TBCTR = 0x0000; /*清除计数器*/
    
    /*--设置计数器比较(CC)子模块-*/
    /*//计数器比较控制寄存器
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = 0;//比较 A 寄存器块运行模式
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0;//比较 B 寄存器块运行模式
    EPwm2Regs.CMPCTL.bit.LOADAMODE = 0; //活动比较 A 加载
    EPwm2Regs.CMPCTL.bit.LOADBMODE = 0; //活动比较 B 加载
    *
    EPwm2Regs.CMPCTL.ALL =(EPwm2Regs.CMPCTL.ALL &~0x5F)| 0x0;
    
    /* EPwm2Regs.CMPCTL2.bit.SHDWCMODE = 0;//比较 C 寄存器块运行模式
    
    EPwm2Regs.CMPCTL2.bit.SHDWDMODE = 0;//比较 D 寄存器块运行模式
    *
    EPwm2Regs.CMPCTL2.ALL =(EPwm2Regs.CMPCTL2.ALL &~0x50)| 0x0;
    EPwm2Regs.CMPA.bit.CMPA = 0; //计数器比较 A 寄存器
    EPwm2Regs.CMPB.bit.CMPB = 0; //计数器比较 B 寄存器
    EPwm2Regs.CMPC = 0; //计数器比较 C 寄存器
    EPwm2Regs.CMPD = 0; //计数器比较 D 寄存器
    
    /*--设置动作限定符(AQ)子模块-*/
    EPwm2Regs.AQCTLA.ALL = 97; //输出 A 的操作限定器控制寄存器
    EPwm2Regs.AQCTLB.all = 96; //输出 B 的操作限定器控制寄存器
    
    /*//操作限定符软件强制寄存器
    EPwm2Regs.AQSFRC.bit.RLDSF = 0; //从阴影选项重新加载
    *
    EPwm2Regs.AQSFRC.ALL =(EPwm2Regs.AQSFRC.ALL &~0xC0)| 0x0;
    
    /*//操作限定符连续软件强制寄存器
    EPwm2Regs.AQCSFRC.bit.CSFA = 0; //输出 A 上的 Continuous Software Force
    EPwm2Regs.AQCSFRC.bit.CSFB = 0; //输出 B 上的持续软件力
    *
    EPwm2Regs.AQCSFRC.ALL =(EPwm2Regs.AQCSFRC.ALL &~0xF)| 0x0;
    
    /*--设置死区发生器(DB)子模块-*/
    /*//死区发生器控制寄存器
    EPwm2Regs.DBCTL.bit.OUT_MODE = 3; //死区输出模式控制
    EPwm2Regs.DBCTL.bit.IN_MODE = 0; //死区输入选择模式控制
    EPwm2Regs.DBCTL.bit.POLSEL = 2; //极性选择控制
    EPwm2Regs.DBCTL.bit.HALFCYCLE = 0; //半周期计时启用
    *
    EPwm2Regs.DBCTL.ALL =(EPwm2Regs.DBCTL.ALL &~0x803F)| 0xB;
    EPwm2Regs.DBRED.bit.DBRED = 20;//死区发生器上升沿延迟计数寄存器
    EPwm2Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存器
    
    /*--设置事件触发器(ET)子模块-*/
    /*//事件触发器选择和预分频寄存器
    EPwm2Regs.ETSEL.bit.SOCAEN = 1; //转换开始 A 使能
    EPwm2Regs.ETSEL.bit.SOCASELCMP = 0;
    EPwm2Regs.ETSEL.bit.SOCASEL = 4; //转换开始选择
    EPwm2Regs.ETPS.bit.SOCAPRD = 1; // EPWM2SOCA 周期选择
    
    EPwm2Regs.ETSEL.bit.SOCBEN = 0; //转换 B 开始使能
    
    EPwm2Regs.ETSEL.bit.SOCBSELCMP = 0;
    EPwm2Regs.ETSEL.bit.SOCBSEL = 1; //转换开始选择
    EPwm2Regs.ETPS.bit.SOCBPRD = 1; // EPWM2SOCB 周期选择
    EPwm2Regs.ETSEL.bit.INTEN = 0; // EPWM2INTn 使能
    EPwm2Regs.ETSEL.bit.INTSELCMP = 0;
    EPwm2Regs.ETSEL.bit.INTSEL = 4; //转换开始选择
    
    EPwm2Regs.ETPS.bit.INTPRD = 1; // EPWM2INTn 周期选择
    *
    EPwm2Regs.ETSEL.ALL =(EPwm2Regs.ETSEL.ALL &~0xFF7F)| 0x1C04;
    EPwm2Regs.ETPS.ALL =(EPwm2Regs.ETPS.ALL &~0x3303)| 0x1101;
    
    /*-设置 PWM-Chopper (PC)子模块-*/
    /*// PWM 斩波器控制寄存器
    EPwm2Regs.PCCTL.bit.CHPEN = 0; // PWM 斩波使能
    EPwm2Regs.PCCTL.bit.CHPFREQ = 0; //斩波时钟频率
    EPwm2Regs.PCCTL.bit.OSHTWTH = 0; //单次脉冲宽度
    EPwm2Regs.PCCTL.bit.CHPDUTY = 0; //斩波时钟占空比
    *
    EPwm2Regs.PCCTL.ALL =(EPwm2Regs.PCCTL.ALL &~0x7FF)| 0x0;
    
    /*--设置跳闸区域(TZ)子模块-*/
    EALLOW;
    EPwm2Regs.TZSEL.ALL = 0; //跳匣区域选择寄存器
    
    /*//跳匣区域控制寄存器
    EPwm2Regs.TZCTL.bit.TZA = 3; // EPWM2A 上的 TZ1至 TZ6跳闸动作
    EPwm2Regs.TZCTL.bit.TSB = 3; // EPWM2B 上的 TZ1至 TZ6跳闸动作
    EPwm2Regs.TZCTL.bit.DCAEVT1 = 3; // DCAEVT1上的 EPWM2A 动作
    EPwm2Regs.TZCTL.bit.DCAEVT2 = 3; // DCAEVT2上的 EPWM2A 动作
    EPwm2Regs.TZCTL.bit.DCBEVT1 = 3; //对 DCBEVT1执行 EPWM2B 操作
    EPwm2Regs.TZCTL.bit.DCBEVT2 = 3; //对 DCBEVT2执行 EPWM2B 操作
    *
    EPwm2Regs.TZCTL.ALL =(EPwm2Regs.TZCTL.ALL &~0xFFF)| 0xFFF;
    
    /*//跳匣区域启用中断寄存器
    EPwm2Regs.TZEINT.bit.OST = 0; //跳匣区域一次性内部启用
    EPwm2Regs.TZEINT.bit.CBC = 0; //跳匣区域逐周期内部启用
    EPwm2Regs.TZEINT.BIT.DCAEVT1 = 0; //数字比较 A 事件1内部启用
    EPwm2Regs.TZEINT.BIT.DCAEVT2 = 0; //数字比较 A 事件2内部启用
    EPwm2Regs.TZEINT.BIT.DCBEVT1 = 0; //数字比较 B 事件1内部启用
    EPwm2Regs.TZEINT.BIT.DCBEVT2 = 0; //数字比较 B 事件2内部启用
    *
    EPwm2Regs.TZEINT.ALL =(EPwm2Regs.TZEINT.ALL &~0x7E)| 0x0;
    
    /*//数字比较 A 控制寄存器
    EPwm2Regs.DCACTL.bit.EVT1SYNCE = 0; // DCAEVT1同步使能
    EPwm2Regs.DCACTL.bit.EVT1SOCE = 1; // DCAEVT1 SOC 启用
    EPwm2Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0; // DCAEVT1强制同步信号
    EPwm2Regs.DCACTL.bit.EVT1SRCSEL = 0; // DCAEVT1源信号
    EPwm2Regs.DCACTL.bit.EVT2FRCSYNCSEL = 0; // DCAEVT2强制同步信号
    EPwm2Regs.DCACTL.bit.EVT2SRCSEL = 0; // DCAEVT2源信号
    *
    EPwm2Regs.DCACTL.ALL =(EPwm2Regs.DCACTL.ALL &~0x30F)| 0x4;
    
    /*//数字比较 B 控制寄存器
    EPwm2Regs.DCBCTL.bit.EVT1SYNCE = 0; // DCBEVT1同步使能
    EPwm2Regs.DCBCTL.bit.EVT1SOCE = 0; // DCBEVT1 SOC 启用
    EPwm2Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 0; // DCBEVT1强制同步信号
    EPwm2Regs.DCBCTL.bit.EVT1SRCSEL = 0; // DCBEVT1源信号
    EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 0; // DCBEVT2强制同步信号
    EPwm2Regs.DCBCTL.bit.EVT2SRCSEL = 0; // DCBEVT2源信号
    *
    EPwm2Regs.DCBCTL.ALL =(EPwm2Regs.DCBCTL.ALL &~0x30F)| 0x0;
    
    /*//数字比较跳闸选择寄存器
    EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0; //数字比较 A 高 COMP 输入选择
    
    EPwm2Regs.DCTRIPSEL.bit.DCALCOMPSEL = 1; //数字比较 A 低 COMP 输入选择
    EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0; //数字比较 B 高 COMP 输入选择
    EPwm2Regs.DCTRIPSEL.bit.DCBLCOMPSEL = 1; //数字比较 B 低 COMP 输入选择
    
    
    
    
    
    *
    EPwm2Regs.DCTRIPSEL.ALL =(EPwm2Regs.DCTRIPSEL.ALL &~ 0xFFFF)| 0x1010;
    
    /*//跳匣区域数字比较器选择寄存器
    EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 0; //数字比较输出 A 事件1
    EPwm2Regs.TZDCSEL.bit.DCAEVT2 = 0; //数字比较输出 A 事件2
    EPwm2Regs.TZDCSEL.bit.DCBEVT1 = 0; //数字比较输出 B 事件1
    EPwm2Regs.TZDCSEL.bit.DCBEVT2 = 0; //数字比较输出 B 事件2
    *
    EPwm2Regs.TZDCSEL.ALL =(EPwm2Regs.TZDCSEL.ALL &~0xFFF)| 0x0;
    
    /*//数字比较滤波器控制寄存器
    EPwm2Regs.DCFCTL.bit.Blanke = 0; //消隐启用/禁用
    EPwm2Regs.DCFCTL.bit.PULSESEL = 1; //针对消隐和捕捉对齐的脉冲选择
    EPwm2Regs.DCFCTL.bit.BLANKINV = 0; //消隐窗口反转
    EPwm2Regs.DCFCTL.bit.SRCEL = 0; //过滤器块信号源选择
    *
    EPwm2Regs.DCFCTL.ALL =(EPwm2Regs.DCFCTL.ALL &~0x3F)| 0x10;
    EPwm2Regs.DCFOFFSET = 0; //数字比较滤波器偏移寄存器
    EPwm2Regs.DCFWINDOW=0; //数字比较滤波器窗口寄存器
    
    /*//数字比较捕捉控制寄存器
    EPwm2Regs.DCCAPCTL.bit.Cape = 0; //计数器捕获启用
    *
    EPwm2Regs.DCCAPCTL.ALL =(EPwm2Regs.DCCAPCTL.ALL &~0x1)| 0x0;
    
    /*// HRPWM 配置寄存器
    EPwm2Regs.HRCNFG.bit.SWAPAB = 0; //交换 EPWMA 和 EPWMB 输出位
    EPwm2Regs.HRCNFG.bit.SELOUTB = 0; // EPWMB 输出选择位
    *
    EPwm2Regs.HRCNFG.ALL =(EPwm2Regs.HRCNFG.ALL &~0xA0)| 0x0;
    
    /*使用所有比较值和 TBPRD 的链接值更新链接寄存器*/
    /*如果 ePWM 寄存器存在于模型中或不存在于*/中,则不会抛出错误
    EPwm2Regs.EPWMXLINK 位 TBPRDLINK = 1;
    EPwm2Regs.EPWMXLINK.BIT.CMPALINK = 1;
    EPwm2Regs.EPWMXLINK 位 CMPBLINK = 1;
    EPwm2Regs.EPWMXLINK.BIT.CMPCLINK = 1;
    EPwm2Regs.EPWMXLINK.BIT.CMPDLINK = 1;
    EDIS;
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    }
    }/*
    
    模型终止函数*/
    void TwoPhaseForStuck_Terminate (void)
    {
    /*(无需终止代码)*/
    }
    
    /*
    生成代码的文件尾部。
    *
    *[EOF]
    */
    

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

    你好、Nima、

    我可以看到使用我使用 MATLAB 嵌入式支持包生成的 C 代码生成的信号(ePWM1 &ePWM2)、因此我不会对此产生任何问题。

    main 中的 C 代码为:

    #include "TwoPhaseForStuck.h"
    #include "rtwtypes.h"
    
    volatile int Isroverfos= 0;
    静态布尔值_T OverrunFlag = 0;
    void RT_OneStep (void)
    {
    /*检查溢出。 防止溢出标志被抢占*/
    if (OverrunFlag++){
    IsrOverf溢= 1;
    OverrunFlag--;
    return;
    }
    
    enableTimer0Interrupt();
    TwoPhaseForStuck_step ();
    
    //在此处获取模型输出*/
    disableTimer0Interrupt();
    OverrunFlag--;
    }
    
    volatile init_T stopored = false;
    int main (void)
    {
    volatile float_T runModel = true;
    modelBaseRate = 1.25E-tome_timerf
    
    
    ;#systemprofilenfrom_timer_200;#timer_tole_timerfrom_timer= tole_timerfrom_enf;#timer_tobole_timerfrom_timer= 200;#systemfrom_
    
    
    
    
    
    
    
    
    rtmSetErrorStatus (TwoPhaseForStuck_M、0);
    TwoPhaseForStuck_initialize ();
    configureTimer0 (modelBaseRate、systemClock);
    runModel =
    rtmGetErrorStatus (TwoPhaseForStuck_M)=(NULL);
    enableTimer0Interrupt ();
    globalInterruptEnable();
    while (runModel){
    已停止请求=!(
    rtmGetErrorStatus (TwoPhaseForStuck_M)=(NULL));
    runModel =!(stopRequestored);
    }/*
    
    在此禁用 RT_OneStep ()*//
    
    *终止模型*/
    TwoPhaseForStuck_Terminate();
    globalInterruptDisable ();
    return 0;
    }/*
    
    
    生成代码的文件尾部。
    *
    *[EOF]
    */
    

    另一个 c 文件:

    #include "TwoPhaseForStuck .h"
    #include "TwoPhaseForStuck_private.h"
    
    /*块信号(默认存储)*/
    B_TwoPhaseForStuck T TwoPhaseForStuck;
    
    //*实数模型*/*
    ** StuPhaseForSt_T
    
    
    
    
    
    
    
    
    = t_StuPhase_StuPhoState_StuPhoT;**= t_StuPhase_StuPhase_StuPhase_StuPhoStuPhoStuPhoStuPhd&t =* 16 *** Phase_StuPhase_StuPhase_StuPhase_StuPhase_StuPhoStuPht_T = t_StuPhase_StuPhase_StuPht_T = t_StuPhase_StuPhase_StuPht_T = t_StuPhase_StuPhase_StuPhoPhd&t
    
    /* S-function (c2802xadc):' /adc '*/
    {
    /*内部基准电压:0至3.3V 的固定刻度范围。 *
    /*外部基准电压:VREFHI (ADCINA0)= 3.3和 VREFLO (接地)= 0 */的允许范围
    TwoPhaseForStuck_B.ADC =(AdcbResultRegs.ADCRESULT1);
    }
    
    // S 函数(c2802xadc):' /adc_1'*/
    {
    /*内部基准电压:0至3.3V 的固定刻度范围。 *
    /*外部基准电压:VREFHI (ADCINA0)= 3.3和 VREFLO (接地)= 0 */的允许范围
    TwoPhaseForStuck_B.ADC_1 =(AdcaResultRegs.ADCRESULT0);
    }
    
    // S 函数(c2802xadc):' /adc_2'*/
    {
    /*内部基准电压:0至3.3V 的固定刻度范围。 *
    /*外部基准电压:VREFHI (ADCINA0)= 3.3和 VREFLO (接地)= 0 */的允许范围
    TwoPhaseForStuck_B.ADC_2 =(AdcbResultRegs.ADCRESULT0);
    }
    
    /*增益:' /TMPRD'包含:
    *常量:' /DuryCycle *
    /
    RTB_TMPRRD = TwoPhaseForStuck_P.TMPRRD_GAIN *
    TwoPhaseForStuck_P.DuryCycle 值;
    
    // S 函数(c2802xpwm):' /ePWM4'*/
    
    *--更新 ePWM1的 CMPA 值--*/
    {
    EPwm1Regs.CMPA.bit.CMPA =(uint16_T)(RTB_TMPRRD);
    }
    
    // S 函数(c2802xpwm):' /ePWM5'包含:
    *常量:' /Phase_2'
    */
    EPwm2Regs.TBPHS.bit.TBPHS = TwoPhaseForStuck_P.Phase_2_value;
    
    /*-更新 ePWM2的 CMPA 值-*/
    {
    EPwm2Regs.CMPA.bit.CMPA =(uint16_T)(RTB_TMPRRD);
    }
    
    
    //模型函数*
    / void TwoPhaseForStuck_initialize (void)
    {
    //注册码*//
    
    */*
    错误状态*/ rtmSetMemStatus (TwoPhaseForStuck_M)(
    
    
    void *)、*(void)*//初始化错误状态*(void)、//(void)*/stuPhaseStu_M (void)、*(void)、//(void)、//(void)
    sizeof (B_TwoPhaseForStuck_T);
    
    /* S 函数(c2802xadc)的开始:' /adc'*/
    if (adcBInitFlag = 0){
    InitAdcB();
    adcBInitFlag = 1;
    }
    
    CONFIG_ADCB_SOC1 ();
    
    /* S 函数(c2802xadc)的开始:' /adc_1'*/
    if (adcAInitFlag = 0){
    InitAdcA();
    adcAInitFlag = 1;
    }
    
    CONFIG_ADCA_SOC0 ();
    
    // S 函数的开始(c2802xadc):' /adc_2'*/
    if (adcBInitFlag = 0){
    InitAdcB();
    adcBInitFlag = 1;
    }
    
    CONFIG_ADCB_SOC0 ();
    
    // S 函数的开始(c2802xpwm):' /ePWM4'*/
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    /***初始化 ePWM1模块***/
    {
    /*//时基控制寄存器
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; //计数器模式
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 1; //同步输出选择
    EPwm1Regs.TBCTL.bit.PRDLD = 0; //阴影选择
    EPwm1Regs.TBCTL.bit.PHSEN = 0; //相位负载使能
    EPwm1Regs.TBCTL.bit.PHSDIR = 0; //相位方向位
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //高速 TBCLK 预分频器
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; //时基时钟预分频器
    EPwm1Regs.TBCTL.bit.SWFSYNC = 0; //软件强制同步脉冲
    *
    EPwm1Regs.TBCTL.ALL =(EPwm1Regs.TBCTL.ALL &~0x3FFF)| 0x10;
    
    /*--设置时基(TB)子模块-*/
    EPwm1Regs.TBPRD = 999; //时基周期寄存器
    
    /*//时基相位寄存器
    EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位偏移寄存器
    *
    EPwm1Regs.TBPHS.ALL =(EPwm1Regs.TBPHS.ALL &~0xFFFFFF0000)| 0x0;
    
    //时基计数器寄存器
    EPwm1Regs.TBCTR = 0x0000; /*清除计数器*/
    
    /*--设置计数器比较(CC)子模块-*/
    /*//计数器比较控制寄存器
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;//比较 A 寄存器块运行模式
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;//比较 B 寄存器块运行模式
    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; //活动比较 A 加载
    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; //活动比较 B 加载
    *
    EPwm1Regs.CMPCTL.ALL =(EPwm1Regs.CMPCTL.ALL &~0x5F)| 0x0;
    
    /* EPwm1Regs.CMPCTL2.bit.SHDWCMODE = 0;//比较 C 寄存器块运行模式
    
    EPwm1Regs.CMPCTL2.bit.SHDWDMODE = 0;//比较 D 寄存器块运行模式
    *
    EPwm1Regs.CMPCTL2.ALL =(EPwm1Regs.CMPCTL2.ALL &~0x50)| 0x0;
    EPwm1Regs.CMPA.bit.CMPA = 0; //计数器比较 A 寄存器
    EPwm1Regs.CMPB.bit.CMPB = 0; //计数器比较 B 寄存器
    EPwm1Regs.CMPC = 0; //计数器比较 C 寄存器
    EPwm1Regs.CMPD = 0; //计数器比较 D 寄存器
    
    /*--设置动作限定符(AQ)子模块-*/
    EPwm1Regs.AQCTLA.ALL = 33; //输出 A 的操作限定器控制寄存器
    EPwm1Regs.AQCTLB.all = 96; //输出 B 的操作限定器控制寄存器
    
    /*//操作限定符软件强制寄存器
    EPwm1Regs.AQSFRC.bit.RLDSF = 0; //从阴影选项重新加载
    *
    EPwm1Regs.AQSFRC.ALL =(EPwm1Regs.AQSFRC.ALL &~0xC0)| 0x0;
    
    /*//操作限定符连续软件强制寄存器
    EPwm1Regs.AQCSFRC.bit.CSFA = 0; //输出 A 上的 Continuous Software Force
    EPwm1Regs.AQCSFRC.bit.CSFB = 0; //输出 B 上的持续软件力
    *
    EPwm1Regs.AQCSFRC.ALL =(EPwm1Regs.AQCSFRC.ALL &~0xF)| 0x0;
    
    /*--设置死区发生器(DB)子模块-*/
    /*//死区发生器控制寄存器
    EPwm1Regs.DBCTL.bit.OUT_MODE = 3; //死区输出模式控制
    EPwm1Regs.DBCTL.bit.IN_MODE = 0; //死区输入选择模式控制
    EPwm1Regs.DBCTL.bit.POLSEL = 2; //极性选择控制
    EPwm1Regs.DBCTL.bit.HALFCYCLE = 0; //半周期计时启用
    *
    EPwm1Regs.DBCTL.ALL =(EPwm1Regs.DBCTL.ALL &~0x803F)| 0xB;
    EPwm1Regs.DBRED.bit.DBRED = 20;//死区发生器上升沿延迟计数寄存器
    EPwm1Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存器
    
    /*--设置事件触发器(ET)子模块-*/
    /*//事件触发器选择和预分频寄存器
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; //转换开始 A 使能
    EPwm1Regs.ETSEL.bit.SOCASELCMP = 0;
    EPwm1Regs.ETSEL.bit.SOCASEL = 4; //转换开始选择
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // EPWM1SOCA 周期选择
    
    EPwm1Regs.ETSEL.bit.SOCBEN = 0; //转换 B 开始使能
    
    EPwm1Regs.ETSEL.bit.SOCBSELCMP = 0;
    EPwm1Regs.ETSEL.bit.SOCBSEL = 1; //转换开始选择
    EPwm1Regs.ETPS.bit.SOCBPRD = 1; // EPWM1SOCB 周期选择
    EPwm1Regs.ETSEL.bit.INTEN = 0; // EPWM1INTn 使能
    EPwm1Regs.ETSEL.bit.INTSELCMP = 0;
    EPwm1Regs.ETSEL.bit.INTSEL = 4; //转换开始选择
    
    EPwm1Regs.ETPS.bit.INTPRD = 1; // EPWM1INTn 周期选择
    *
    EPwm1Regs.ETSEL.ALL =(EPwm1Regs.ETSEL.ALL &~0xFF7F)| 0x1C04;
    EPwm1Regs.ETPS.ALL =(EPwm1Regs.ETPS.ALL &~0x3303)| 0x1101;
    
    /*-设置 PWM-Chopper (PC)子模块-*/
    /*// PWM 斩波器控制寄存器
    EPwm1Regs.PCCTL.bit.CHPEN = 0; // PWM 斩波使能
    EPwm1Regs.PCCTL.bit.CHPFREQ = 0; //斩波时钟频率
    EPwm1Regs.PCCTL.bit.OSHTWTH = 0; //单次脉冲宽度
    EPwm1Regs.PCCTL.bit.CHPDUTY = 0; //斩波时钟占空比
    *
    EPwm1Regs.PCCTL.ALL =(EPwm1Regs.PCCTL.ALL &~0x7FF)| 0x0;
    
    /*--设置跳闸区域(TZ)子模块-*/
    EALLOW;
    EPwm1Regs.TZSEL.ALL = 0; //跳匣区域选择寄存器
    
    /*//跳匣区域控制寄存器
    EPwm1Regs.TZCTL.bit.TZA = 3; // EPWM1A 上的 TZ1至 TZ6跳闸动作
    EPwm1Regs.TZCTL.bit.TSB = 3; // EPWM1B 上的 TZ1至 TZ6跳闸动作
    EPwm1Regs.TZCTL.bit.DCAEVT1 = 3; // DCAEVT1上的 EPWM1A 动作
    EPwm1Regs.TZCTL.bit.DCAEVT2 = 3; // DCAEVT2上的 EPWM1A 动作
    EPwm1Regs.TZCTL.bit.DCBEVT1 = 3; //对 DCBEVT1执行 EPWM1B 操作
    EPwm1Regs.TZCTL.bit.DCBEVT2 = 3; //对 DCBEVT2执行 EPWM1B 操作
    *
    EPwm1Regs.TZCTL.ALL =(EPwm1Regs.TZCTL.ALL &~0xFFF)| 0xFFF;
    
    /*//跳匣区域启用中断寄存器
    EPwm1Regs.TZEINT.bit.OST = 0; //跳匣区域一次性内部启用
    EPwm1Regs.TZEINT.bit.CBC = 0; //跳匣区域逐周期内部启用
    EPwm1Regs.TZEINT.BIT.DCAEVT1 = 0; //数字比较 A 事件1内部启用
    EPwm1Regs.TZEINT.BIT.DCAEVT2 = 0; //数字比较 A 事件2内部启用
    EPwm1Regs.TZEINT.BIT.DCBEVT1 = 0; //数字比较 B 事件1内部启用
    EPwm1Regs.TZEINT.BIT.DCBEVT2 = 0; //数字比较 B 事件2内部启用
    *
    EPwm1Regs.TZEINT.ALL =(EPwm1Regs.TZEINT.ALL &~0x7E)| 0x0;
    
    /*//数字比较 A 控制寄存器
    EPwm1Regs.DCACTL.bit.EVT1SYNCE = 0; // DCAEVT1同步使能
    EPwm1Regs.DCACTL.bit.EVT1SOCE = 1; // DCAEVT1 SOC 启用
    EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0; // DCAEVT1强制同步信号
    EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 0; // DCAEVT1源信号
    EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 0; // DCAEVT2强制同步信号
    EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 0; // DCAEVT2源信号
    *
    EPwm1Regs.DCACTL.ALL =(EPwm1Regs.DCACTL.ALL &~0x30F)| 0x4;
    
    /*//数字比较 B 控制寄存器
    EPwm1Regs.DCBCTL.bit.EVT1SYNCE = 0; // DCBEVT1同步使能
    EPwm1Regs.DCBCTL.bit.EVT1SOCE = 0; // DCBEVT1 SOC 启用
    EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 0; // DCBEVT1强制同步信号
    EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = 0; // DCBEVT1源信号
    EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 0; // DCBEVT2强制同步信号
    EPwm1Regs.DCBCTL.bit.EVT2SRCSEL = 0; // DCBEVT2源信号
    *
    EPwm1Regs.DCBCTL.ALL =(EPwm1Regs.DCBCTL.ALL &~0x30F)| 0x0;
    
    /*//数字比较跳闸选择寄存器
    EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0; //数字比较 A 高 COMP 输入选择
    
    EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = 1; //数字比较 A 低 COMP 输入选择
    EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0; //数字比较 B 高 COMP 输入选择
    EPwm1Regs.DCTRIPSEL.bit.DCBLCOMPSEL = 1; //数字比较 B 低 COMP 输入选择
    
    
    
    
    
    *
    EPwm1Regs.DCTRIPSEL.ALL =(EPwm1Regs.DCTRIPSEL.ALL &~ 0xFFFF)| 0x1010;
    
    /*//跳匣区域数字比较器选择寄存器
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0; //数字比较输出 A 事件1
    EPwm1Regs.TZDCSEL.bit.DCAEVT2 = 0; //数字比较输出 A 事件2
    EPwm1Regs.TZDCSEL.bit.DCBEVT1 = 0; //数字比较输出 B 事件1
    EPwm1Regs.TZDCSEL.bit.DCBEVT2 = 0; //数字比较输出 B 事件2
    *
    EPwm1Regs.TZDCSEL.ALL =(EPwm1Regs.TZDCSEL.ALL &~0xFFF)| 0x0;
    
    /*//数字比较滤波器控制寄存器
    EPwm1Regs.DCFCTL.bit.Blanke = 0; //消隐启用/禁用
    EPwm1Regs.DCFCTL.bit.PULSESEL = 1; //针对消隐和捕捉对齐的脉冲选择
    EPwm1Regs.DCFCTL.bit.BLANKINV = 0; //消隐窗口反转
    EPwm1Regs.DCFCTL.bit.SRCEL = 0; //过滤器块信号源选择
    *
    EPwm1Regs.DCFCTL.ALL =(EPwm1Regs.DCFCTL.ALL &~0x3F)| 0x10;
    EPwm1Regs.DCFOFFSET = 0; //数字比较滤波器偏移寄存器
    EPwm1Regs.DCFWINDOW=0; //数字比较滤波器窗口寄存器
    
    /*//数字比较捕捉控制寄存器
    EPwm1Regs.DCCAPCTL.bit.Cape = 0; //计数器捕获启用
    *
    EPwm1Regs.DCCAPCTL.ALL =(EPwm1Regs.DCCAPCTL.ALL &~0x1)| 0x0;
    
    /*// HRPWM 配置寄存器
    EPwm1Regs.HRCNFG.bit.SWAPAB = 0; //交换 EPWMA 和 EPWMB 输出位
    EPwm1Regs.HRCNFG.bit.SELOUTB = 0; // EPWMB 输出选择位
    *
    EPwm1Regs.HRCNFG.ALL =(EPwm1Regs.HRCNFG.ALL &~0xA0)| 0x0;
    
    /*使用所有比较值和 TBPRD 的链接值更新链接寄存器*/
    /*如果 ePWM 寄存器存在于模型中或不存在于*/中,则不会抛出错误
    EPwm1Regs.EPWMXLINK 位 TBPRDLINK = 0;
    EPwm1Regs.EPWMXLINK.BIT.CMPALINK = 0;
    EPwm1Regs.EPWMXLINK 位 CMPBLINK = 0;
    EPwm1Regs.EPWMXLINK.BIT.CMPCLINK = 0;
    EPwm1Regs.EPWMXLINK.BIT.CMPDLINK = 0;
    EDIS;
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    }
    
    /* S 函数(c2802xpwm)开始:' /ePWM5'包含:
    *常量:' /Phase_2'
    */
    EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
    
    /***初始化 ePWM2模块***/
    {
    /*//时基控制寄存器
    EPwm2Regs.TBCTL.bit.CTRMODE = 0; //计数器模式
    EPwm2Regs.TBCTL.bit.SYNCOSEL = 0; //同步输出选择
    EPwm2Regs.TBCTL.bit.PRDLD = 0; //阴影选择
    EPwm2Regs.TBCTL.bit.PHSEN = 1; //相位负载使能
    EPwm2Regs.TBCTL.bit.PHSDIR = 0; //相位方向位
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0; //高速 TBCLK 预分频器
    EPwm2Regs.TBCTL.bit.CLKDIV = 0; //时基时钟预分频器
    EPwm2Regs.TBCTL.bit.SWFSYNC = 0; //软件强制同步脉冲
    *
    EPwm2Regs.TBCTL.ALL =(EPwm2Regs.TBCTL.ALL &~0x3FFF)| 0x4;
    
    /*--设置时基(TB)子模块-*/
    EPwm2Regs.TBPRD = 999; //时基周期寄存器
    
    /*//时基相位寄存器
    EPwm2Regs.TBPHS.bit.TBPHS = 0; //相位偏移寄存器
    *
    EPwm2Regs.TBPHS.ALL =(EPwm2Regs.TBPHS.ALL &~0xFFFFFF0000)| 0x0;
    
    //时基计数器寄存器
    EPwm2Regs.TBCTR = 0x0000; /*清除计数器*/
    
    /*--设置计数器比较(CC)子模块-*/
    /*//计数器比较控制寄存器
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = 0;//比较 A 寄存器块运行模式
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0;//比较 B 寄存器块运行模式
    EPwm2Regs.CMPCTL.bit.LOADAMODE = 0; //活动比较 A 加载
    EPwm2Regs.CMPCTL.bit.LOADBMODE = 0; //活动比较 B 加载
    *
    EPwm2Regs.CMPCTL.ALL =(EPwm2Regs.CMPCTL.ALL &~0x5F)| 0x0;
    
    /* EPwm2Regs.CMPCTL2.bit.SHDWCMODE = 0;//比较 C 寄存器块运行模式
    
    EPwm2Regs.CMPCTL2.bit.SHDWDMODE = 0;//比较 D 寄存器块运行模式
    *
    EPwm2Regs.CMPCTL2.ALL =(EPwm2Regs.CMPCTL2.ALL &~0x50)| 0x0;
    EPwm2Regs.CMPA.bit.CMPA = 0; //计数器比较 A 寄存器
    EPwm2Regs.CMPB.bit.CMPB = 0; //计数器比较 B 寄存器
    EPwm2Regs.CMPC = 0; //计数器比较 C 寄存器
    EPwm2Regs.CMPD = 0; //计数器比较 D 寄存器
    
    /*--设置动作限定符(AQ)子模块-*/
    EPwm2Regs.AQCTLA.ALL = 97; //输出 A 的操作限定器控制寄存器
    EPwm2Regs.AQCTLB.all = 96; //输出 B 的操作限定器控制寄存器
    
    /*//操作限定符软件强制寄存器
    EPwm2Regs.AQSFRC.bit.RLDSF = 0; //从阴影选项重新加载
    *
    EPwm2Regs.AQSFRC.ALL =(EPwm2Regs.AQSFRC.ALL &~0xC0)| 0x0;
    
    /*//操作限定符连续软件强制寄存器
    EPwm2Regs.AQCSFRC.bit.CSFA = 0; //输出 A 上的 Continuous Software Force
    EPwm2Regs.AQCSFRC.bit.CSFB = 0; //输出 B 上的持续软件力
    *
    EPwm2Regs.AQCSFRC.ALL =(EPwm2Regs.AQCSFRC.ALL &~0xF)| 0x0;
    
    /*--设置死区发生器(DB)子模块-*/
    /*//死区发生器控制寄存器
    EPwm2Regs.DBCTL.bit.OUT_MODE = 3; //死区输出模式控制
    EPwm2Regs.DBCTL.bit.IN_MODE = 0; //死区输入选择模式控制
    EPwm2Regs.DBCTL.bit.POLSEL = 2; //极性选择控制
    EPwm2Regs.DBCTL.bit.HALFCYCLE = 0; //半周期计时启用
    *
    EPwm2Regs.DBCTL.ALL =(EPwm2Regs.DBCTL.ALL &~0x803F)| 0xB;
    EPwm2Regs.DBRED.bit.DBRED = 20;//死区发生器上升沿延迟计数寄存器
    EPwm2Regs.DBFED.bit.DBFED = 20;//死区发生器下降沿延迟计数寄存器
    
    /*--设置事件触发器(ET)子模块-*/
    /*//事件触发器选择和预分频寄存器
    EPwm2Regs.ETSEL.bit.SOCAEN = 1; //转换开始 A 使能
    EPwm2Regs.ETSEL.bit.SOCASELCMP = 0;
    EPwm2Regs.ETSEL.bit.SOCASEL = 4; //转换开始选择
    EPwm2Regs.ETPS.bit.SOCAPRD = 1; // EPWM2SOCA 周期选择
    
    EPwm2Regs.ETSEL.bit.SOCBEN = 0; //转换 B 开始使能
    
    EPwm2Regs.ETSEL.bit.SOCBSELCMP = 0;
    EPwm2Regs.ETSEL.bit.SOCBSEL = 1; //转换开始选择
    EPwm2Regs.ETPS.bit.SOCBPRD = 1; // EPWM2SOCB 周期选择
    EPwm2Regs.ETSEL.bit.INTEN = 0; // EPWM2INTn 使能
    EPwm2Regs.ETSEL.bit.INTSELCMP = 0;
    EPwm2Regs.ETSEL.bit.INTSEL = 4; //转换开始选择
    
    EPwm2Regs.ETPS.bit.INTPRD = 1; // EPWM2INTn 周期选择
    *
    EPwm2Regs.ETSEL.ALL =(EPwm2Regs.ETSEL.ALL &~0xFF7F)| 0x1C04;
    EPwm2Regs.ETPS.ALL =(EPwm2Regs.ETPS.ALL &~0x3303)| 0x1101;
    
    /*-设置 PWM-Chopper (PC)子模块-*/
    /*// PWM 斩波器控制寄存器
    EPwm2Regs.PCCTL.bit.CHPEN = 0; // PWM 斩波使能
    EPwm2Regs.PCCTL.bit.CHPFREQ = 0; //斩波时钟频率
    EPwm2Regs.PCCTL.bit.OSHTWTH = 0; //单次脉冲宽度
    EPwm2Regs.PCCTL.bit.CHPDUTY = 0; //斩波时钟占空比
    *
    EPwm2Regs.PCCTL.ALL =(EPwm2Regs.PCCTL.ALL &~0x7FF)| 0x0;
    
    /*--设置跳闸区域(TZ)子模块-*/
    EALLOW;
    EPwm2Regs.TZSEL.ALL = 0; //跳匣区域选择寄存器
    
    /*//跳匣区域控制寄存器
    EPwm2Regs.TZCTL.bit.TZA = 3; // EPWM2A 上的 TZ1至 TZ6跳闸动作
    EPwm2Regs.TZCTL.bit.TSB = 3; // EPWM2B 上的 TZ1至 TZ6跳闸动作
    EPwm2Regs.TZCTL.bit.DCAEVT1 = 3; // DCAEVT1上的 EPWM2A 动作
    EPwm2Regs.TZCTL.bit.DCAEVT2 = 3; // DCAEVT2上的 EPWM2A 动作
    EPwm2Regs.TZCTL.bit.DCBEVT1 = 3; //对 DCBEVT1执行 EPWM2B 操作
    EPwm2Regs.TZCTL.bit.DCBEVT2 = 3; //对 DCBEVT2执行 EPWM2B 操作
    *
    EPwm2Regs.TZCTL.ALL =(EPwm2Regs.TZCTL.ALL &~0xFFF)| 0xFFF;
    
    /*//跳匣区域启用中断寄存器
    EPwm2Regs.TZEINT.bit.OST = 0; //跳匣区域一次性内部启用
    EPwm2Regs.TZEINT.bit.CBC = 0; //跳匣区域逐周期内部启用
    EPwm2Regs.TZEINT.BIT.DCAEVT1 = 0; //数字比较 A 事件1内部启用
    EPwm2Regs.TZEINT.BIT.DCAEVT2 = 0; //数字比较 A 事件2内部启用
    EPwm2Regs.TZEINT.BIT.DCBEVT1 = 0; //数字比较 B 事件1内部启用
    EPwm2Regs.TZEINT.BIT.DCBEVT2 = 0; //数字比较 B 事件2内部启用
    *
    EPwm2Regs.TZEINT.ALL =(EPwm2Regs.TZEINT.ALL &~0x7E)| 0x0;
    
    /*//数字比较 A 控制寄存器
    EPwm2Regs.DCACTL.bit.EVT1SYNCE = 0; // DCAEVT1同步使能
    EPwm2Regs.DCACTL.bit.EVT1SOCE = 1; // DCAEVT1 SOC 启用
    EPwm2Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0; // DCAEVT1强制同步信号
    EPwm2Regs.DCACTL.bit.EVT1SRCSEL = 0; // DCAEVT1源信号
    EPwm2Regs.DCACTL.bit.EVT2FRCSYNCSEL = 0; // DCAEVT2强制同步信号
    EPwm2Regs.DCACTL.bit.EVT2SRCSEL = 0; // DCAEVT2源信号
    *
    EPwm2Regs.DCACTL.ALL =(EPwm2Regs.DCACTL.ALL &~0x30F)| 0x4;
    
    /*//数字比较 B 控制寄存器
    EPwm2Regs.DCBCTL.bit.EVT1SYNCE = 0; // DCBEVT1同步使能
    EPwm2Regs.DCBCTL.bit.EVT1SOCE = 0; // DCBEVT1 SOC 启用
    EPwm2Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 0; // DCBEVT1强制同步信号
    EPwm2Regs.DCBCTL.bit.EVT1SRCSEL = 0; // DCBEVT1源信号
    EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 0; // DCBEVT2强制同步信号
    EPwm2Regs.DCBCTL.bit.EVT2SRCSEL = 0; // DCBEVT2源信号
    *
    EPwm2Regs.DCBCTL.ALL =(EPwm2Regs.DCBCTL.ALL &~0x30F)| 0x0;
    
    /*//数字比较跳闸选择寄存器
    EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0; //数字比较 A 高 COMP 输入选择
    
    EPwm2Regs.DCTRIPSEL.bit.DCALCOMPSEL = 1; //数字比较 A 低 COMP 输入选择
    EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0; //数字比较 B 高 COMP 输入选择
    EPwm2Regs.DCTRIPSEL.bit.DCBLCOMPSEL = 1; //数字比较 B 低 COMP 输入选择
    
    
    
    
    
    *
    EPwm2Regs.DCTRIPSEL.ALL =(EPwm2Regs.DCTRIPSEL.ALL &~ 0xFFFF)| 0x1010;
    
    /*//跳匣区域数字比较器选择寄存器
    EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 0; //数字比较输出 A 事件1
    EPwm2Regs.TZDCSEL.bit.DCAEVT2 = 0; //数字比较输出 A 事件2
    EPwm2Regs.TZDCSEL.bit.DCBEVT1 = 0; //数字比较输出 B 事件1
    EPwm2Regs.TZDCSEL.bit.DCBEVT2 = 0; //数字比较输出 B 事件2
    *
    EPwm2Regs.TZDCSEL.ALL =(EPwm2Regs.TZDCSEL.ALL &~0xFFF)| 0x0;
    
    /*//数字比较滤波器控制寄存器
    EPwm2Regs.DCFCTL.bit.Blanke = 0; //消隐启用/禁用
    EPwm2Regs.DCFCTL.bit.PULSESEL = 1; //针对消隐和捕捉对齐的脉冲选择
    EPwm2Regs.DCFCTL.bit.BLANKINV = 0; //消隐窗口反转
    EPwm2Regs.DCFCTL.bit.SRCEL = 0; //过滤器块信号源选择
    *
    EPwm2Regs.DCFCTL.ALL =(EPwm2Regs.DCFCTL.ALL &~0x3F)| 0x10;
    EPwm2Regs.DCFOFFSET = 0; //数字比较滤波器偏移寄存器
    EPwm2Regs.DCFWINDOW=0; //数字比较滤波器窗口寄存器
    
    /*//数字比较捕捉控制寄存器
    EPwm2Regs.DCCAPCTL.bit.Cape = 0; //计数器捕获启用
    *
    EPwm2Regs.DCCAPCTL.ALL =(EPwm2Regs.DCCAPCTL.ALL &~0x1)| 0x0;
    
    /*// HRPWM 配置寄存器
    EPwm2Regs.HRCNFG.bit.SWAPAB = 0; //交换 EPWMA 和 EPWMB 输出位
    EPwm2Regs.HRCNFG.bit.SELOUTB = 0; // EPWMB 输出选择位
    *
    EPwm2Regs.HRCNFG.ALL =(EPwm2Regs.HRCNFG.ALL &~0xA0)| 0x0;
    
    /*使用所有比较值和 TBPRD 的链接值更新链接寄存器*/
    /*如果 ePWM 寄存器存在于模型中或不存在于*/中,则不会抛出错误
    EPwm2Regs.EPWMXLINK 位 TBPRDLINK = 1;
    EPwm2Regs.EPWMXLINK.BIT.CMPALINK = 1;
    EPwm2Regs.EPWMXLINK 位 CMPBLINK = 1;
    EPwm2Regs.EPWMXLINK.BIT.CMPCLINK = 1;
    EPwm2Regs.EPWMXLINK.BIT.CMPDLINK = 1;
    EDIS;
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    }
    }/*
    
    模型终止函数*/
    void TwoPhaseForStuck_Terminate (void)
    {
    /*(无需终止代码)*/
    }
    
    /*
    生成代码的文件尾部。
    *
    *[EOF]
    */
    

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

    您在哪里调用 Board_init 或 tile_init?

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

    你好、Nima、  

    如果我对您说得对、 我在 mw_c28xx_board.c 文件中有 init_board


    在生成的 CLB_config.c 文件中调用 init_tile。  

    我发现我从  文件夹中删除了 F2837xD_CodeStartBranch.asm 文件、我不确定原因是不是这样! 我将在星期一再次进行测试。

    #include "c2000BoardSupport.h"
    #include "F2837xD_DEVICE.h"
    #include "F2837xD_examples.h"
    #include "F2837xD_GlobalPrototypes.h"
    #include "rtwtypes.h"
    #include "tuoPhaseForStuck.h"
    #include "TwoSysPhaseForcostype.h"
    
    
    (#include "controlCALD_E280.h
    
    
    
    );#include "tobtctradu.eUS_init.h (#ce.h);#include "tu.alu.intradu.pru.u.u.u.u.u.u.u.eUS_c_du.u.u.eu.u.e0_cr =#include "#
    
    
    
    
    
    
    //尽快在未绑定的 IO 上启用上拉电阻以降低功耗。
    GPIO_EnableUnbondedIOPullups ();
    CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
    CpuSysRegs.PCLKCR13.bit.ADC_B = 1;
    CpuSysRegs.PCLKCR13.bit.ADC_C = 1;
    CpuSysRegs.PCLKCR13.bit.ADC_D = 1;CpuSysRegs.PCLKCR13.bit
    
    //检查器件是否已修整
    (*(((UINT16 *) 0x5D1B6)= 0x0000){
    //器件未修整、应用静态校准值
    AnalogSubsysRegs.ANAREFTRIMA.ALL = 31709;
    AnalogSubsysRegs.ANAREFTRIMB.all = 31709;
    AnalogSubsysRegs.ANAREFTRIMC.ALL = 31709;
    AnalogSubsysRegs.ANAREFTRIMD.ALL = 31709;
    }
    
    CpuSysRegs.PCLKCR13.bit.ADC_A = 0;
    CpuSysRegs.PCLKCR13.bit.ADC_B = 0;
    CpuSysRegs.PCLKCR13.bit.ADC_C = 0;CpuSysRegs.PCLKCR13.TCMS.ADC_D
    = 0;CpuSysRegs.PADC_SysRegs.PADC.D=0
    ;C=0.bit.PCKSysRegs.PICKCR13.TL.D=0
    InitSysPll (XTAL_OSC、20、0、1);
    
    //打开所有外设
    //InitPeripheralClocks ();
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.CPUTIME0 = 1;
    CpuSysRegs.PCLKCR0.bit.CPUTIMER = 1;CpuSysRegs.PCLKCR0.bit.CPUTIMER = 1;
    CpuSysCR0.CCPKCR0=1;CpitSysRegs.CCPKCR0.CCPKCR0.CCPIMCTCR0=1;
    CpuSysRegs.PCLKCR0.bit.HRPWM = 1;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;CpuSysRegs.PCLKCR1.bit.EMIF2
    = 1;
    
    //将所有外设分配给 CPU2 *;
    / DevCfgRegs.CPUSEL11.0=0x00000=0XCPUSDEL.0=0X0000.USCLUSCLK = 0x0000.USCLK;
    
    
    所有外设0x0000.CP0=0x0000.CP0=0x0000.USCLK
    = 0x0000.USCLK 0=0=0X0000.USCLUSCLK
    DevCfgRegs.CPUSEL6.ALL = 0x00000007;
    DevCfgRegs.CPUSEL8.ALL = 0x00000003;
    DevCfgRegs.CPUSEL14.ALL = 0x00070000;DevCfgRegs.CPUSEL7.ALL
    = 0x00000003;
    
    //将已使用的 ADC 模块指定为#dcpu_dac #fgel1.dac
    =#dac #degb.dac
    
    
    =#dac #degf_dac #f_dac #dac =#degf_dege.dac #dac #f_dac #f_degb.dac #f_dac #f_dac #f_dac #fb = degb.dac #f_dac #f_degb.dac #f_dac #f_degb.dac #f_dac #f_mf_mf_dac #f_dac #f_mf_dac #f_mf_dac #fb = dac #f_degb.dac
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    #endif
    
    //将使用过的 PWM 模块分配给 CPU1 */
    DevCfgRegs.CPUSEL0.bit.EPWM1 = 0;
    DevCfgRegs.CPUSEL0.bit.EPWM2 = 0;
    
    //将使用过的 SPI 模块分配给 CPU1 */
    #ifdef MW_SPI_A DevCfgRegs.CPUSEL6 = 0_Spi_dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.f_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_spi.dif_
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    /*配置低速外设时钟*/
    ClkCfgRegs.LOSPP.bit.LSPCLKDIV = 0U;
    EDIS;
    
    /*禁用并清除所有 CPU 中断*/
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();
    initSetGPIOIPC();
    InitCpuTimer();
    
    //初始 ePWM GPIO 分配... */
    CONFIG_EPWM_GPIO();
    
    #ifdef CPU1/*
    
    初始 GPIO 鉴定设置.... */
    EALLOW;
    GpioCtrlRegs.GPAQSEL1.ALL = 0x0;
    GpioCtrlRegs.GPAQSEL2.ALL = 0x0;
    GpioCtrlRegs.GPBQSEL1.ALL = 0x0;
    GpioCtrlRegs.GPBQSEL2.ALL = 0x0;
    GpioCtrlRegs.GPCQSEL1.all = 0x0;
    GpioCtrlRegs.GPCQSEL2.all = 0x0;
    GpioCtrlRegs.GPDQSEL1.all = 0x0;
    GpioCtrlRegs.GPDQSEL2.all = 0x0;GpioCtrlRegs.GpoclSEL1.all = 0x0
    ;GpioCTRL1.GpullRegs.GpullRegs.GpullRegs.GPDR1=0x0
    GpioCtrlRegs.GPEQSEL2.all = 0x0;
    GpioCtrlRegs.GPFQSEL1.all = 0x0;
    EDIS;
    
    #endif
    
    }
    

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

    你好、Nima、

    我能够获得仿真文件夹和.VCD 文件以及包含方框图的.HTML 文件。 但是、当我运行.vcd 文件以查看预期结果时、我看不到任何结果、所以我想知道为什么至少没有显示现有的内部外设 PWM1和 PWM2 (输入)?

    另外,我还想说别的事情,因为我实际上没有 PWM3信号存在于主内部外设中,因为唯一的 EPWM 内部外设是 PWM1和 PWM2,我当时用它来生成 PWM3。 因此、我没有选择覆盖选项、而是使用 CLB 输出 X-BAR 在引脚 GPIO4和 GPIO5处创建了全新的外设(PWM3)、但在 .VCD 文件中仍然没有得到任何结果。

    那么、您认为问题是什么、我应该坚持哪一个选项?

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

    否 不幸的是、您错过了我要讨论的内容。 CCS 中的 GUI 工具正在生成 board.c 和 board.h、在 board.c 中、您有一个名为 Board_init ()的函数、您需要在 tile_init 之前在 main 中调用该函数。

    NIMA

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

    你好、Nima、

    感谢您的支持、我非常感谢您的支持!

    正如您告诉我的那样,我已经将 Board_init()包含在主文件中。 在示例代码中,我还发现必须在 Board_init()之后包含以下内容:

    initTILE0 (myCLB0_BASE);
    clb_enableCLB (myCLB0_BASE);

    但是、当我这么做时、我遇到了以下错误:

    链接期间遇到错误;"TwoPhaseForStuck.Out"未生成 TwoPhaseForStuck C/C++问题
    Gmake:***[TwoPhaseForStuck.Out]错误1 TwoPhaseForStuck C/C++问题
    gmake:目标"全部"不会由于错误而重新生成。 TwoPhaseForStuck C/C++问题
    未解析的符号__error__、首先在 C:\ti\c2000Ware_3_03_00_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_coff .lib 中引用 TwoPhaseForStuck C/C++问题
    未解析的符号仍然是 TwoPhaseForStuck C/C++问题
    宏"Device_cal"的重新定义不兼容(在"C:/ti/controlSUITE/device_support/F2837xD/v190/F2837xD_common/include/F2837xD_Examples.h "的第304行声明).ccsproject /TwoPhaseForStuck 第151行、外部位置:C:\ti\c2000Ware_3_03_00_00\driverlib\f2837xd\driverlib\sysctl.h C/C++问题

    如果我删除以下几个代码并保持 Board_init(),则会删除上述错误,但在.vcd 文件中仍然看不到任何仿真结果。  

    initTILE0 (myCLB0_BASE);
    clb_enableCLB (myCLB0_BASE);



     

    #include "TwoPhaseForStuck.h"
    #include "rtwtypes.h"
    #include "driverlib.h"
    #include "clb_config.h"
    
    #include "clb.h"
    #include "board.h"
    
    volatile int Isroverfos= 0;
    static overoverout_T OverrunFlag = 0;
    void *
    
    (void *)/OneStep。 防止溢出标志被抢占*/
    if (OverrunFlag++){
    IsrOverf溢= 1;
    OverrunFlag--;
    return;
    }
    
    enableTimer0Interrupt ();
    TwoPhaseForStuck_step ();
    
    //在此处获取模型输出*
    / disableTimer0Interrupt ();
    OverrunFlag--;
    }
    
    volatile init_T stopored = false;
    int main (void)
    {
    
    volatile float_T runModel = true;
    modelBaseRate = 1.25E-tome-6;c2000_timer_timer_board=convertole_timer_200;#systemid_timer_tole_time_timere= tole=
    200;
    
    c2000
    
    
    
    
    
    
    
    
    
    #endif
    
    ;
    rtmSetErrorStatus (TwoPhaseForStuck_M、0);
    TwoPhaseForStuck_initialize ();
    configureTimer0 (modelBaseRate、 SystemClock);
    runModel =
    rtmGetErrorStatus (TwoPhaseForStuck_M)=(NULL);
    enableTimer0Interrupt ();
    globalInterruptEnable();
    while (runModel){
    已停止请求=!(
    rtmGetErrorStatus (TwoPhaseForStuck_M)=(NULL));
    runModel =!(stopRequestored);
    }/*
    
    在此禁用 RT_OneStep ()*//
    
    
    
    *终止模型*/
    TwoPhaseForStuck_Terminate();
    globalInterruptDisable ();
    return 0;
    }/*
    
    
    生成代码的文件尾部。
    *
    *[EOF]
    */
    

    说明链接过程中遇到资源路径位置类型错误;"TwoPhaseForStuck.out"未构建 TwoPhaseForStuck C/C++ Problemgmake:***[TwoPhaseForStuck.out]错误1 TwoPhaseForStuck C/C++ Problemgmake:目标'all'不会由于错误而重做。 TwoPhaseForStuck C/C++ Problemunresolved symbol ____error__、首先在 C:\ti\c2000Ware_3_03_00_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_coff .lib 中引用 TwoPhaseForStuck C/C++ Problemunresolved 符号仍然是 TwoPhaseForStuck C/C++ Problemincompatible 重新定义宏"Device_cal"(在"C:/ti/controlSUITE/device_support/F2837xD/v190/F2837xD_common/include/F2837xD_Examples.h "的第304行声明)。ccsproject /drivePhaseForck Stuck 第151行、外部位置:C:\ti\c2000\C2000Ware_3_driverlib\sysctl.h

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

    [引用 user="Mohammed Alharbi">链接期间遇到错误;"TwoPhaseForStuck.out"未生成 TwoPhaseForStuck C/C++问题
    Gmake:***[TwoPhaseForStuck.Out]错误1 TwoPhaseForStuck C/C++问题
    gmake:目标"全部"不会由于错误而重新生成。 TwoPhaseForStuck C/C++问题
    未解析的符号__error__、首先在 C:\ti\c2000Ware_3_03_00_00\driverlib\f2837xd\driverlib\ccs\Debug\driverlib_coff .lib 中引用 TwoPhaseForStuck C/C++问题
    未解析的符号仍然是 TwoPhaseForStuck C/C++问题
    宏"Device_cal"的重新定义不兼容(在"C:/ti/controlSUITE/device_support/F2837xD/v190/F2837xD_common/include/F2837xD_Examples.h "的第304行声明).ccsproject /TwoPhaseForStuck 第151行、外部位置:C:\ti\c2000Ware_3_03_00_00\driverlib\f2837xd\driverlib\sysctl.h C/C++ problem

    这些错误需要得到解决、代码必须留在主函数中。

    这些是您使用调试 driverlib 库但未定义_error__的原因、因为没有所需的宏。

    NIMA

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

    你好、Nima、  

    为了解决这个问题、我修改 了 CLB_EX8_EXTERNAL_SIGNAL_AND_GATE CLB 示例、但仍然没有得到我想要的结果。  

    我创建了一个新论坛、请查看: