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.

[参考译文] TMS320F28335:上升和放大器中的死区;使用 ECAP/APWM 的下降沿

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1197402/tms320f28335-deadband-in-rising-falling-edge-using-ecap-apwm

器件型号:TMS320F28335
主题中讨论的其他器件:TMDSCNCD28335

从函数发生器中、我在 GPIO24 (ECAP)捕获了方波(脉冲50kHz 和50%占空比)、然后使用 ECAP 模块在 GPIO25和 GPIO26 (GPIO25反相)生成了两个 APWM 信号。 信号具有可控变量:PWM_PERIOD、PWM2_PERIOD=>(针对周期)和 PWM_Duty、PWM2_Duty (针对占空比)。 我需要在 GPIO25和 GPIO26信号中生成死区。 假设我们将任何因素相乘、例如0.5与 PWM_PERIOD 相乘、0.25与 PWM_Duty 相乘。 它提供100kHz 输出和占空比( 反相时为25%和75%)。 在上图中、浅绿色是反相信号(25%)、深绿色是表面化占空比(75%)。 问题在于信号始终以相同的电平(橙色)启动、这会导致电流击穿问题。 如何为代码中的信号创建上升沿和下降沿死区? 请在代码中提供建议。

此致

Arsalan

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

    您好、Arsalan、

    我知道您希望对 ECAP 应用死区。 但是、我相信您可以使用 ePWM 模块完成您所尝试的操作。 您不使用 ePWM 的原因是什么?

    当对 ECAP 应用死区时、只能通过一些软件干预来实现。 这 是一个能够 为您提供帮助的线程、

    最棒的

    Ryan Ma

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

    您好、Ryan、

    感谢您的回复。

    我是否可以使用 ePWM 模块捕获信号(发生器)、然后生成 PWM 信号、从而捕获信号而不是使用 APWM (来自 ECAP)?  实际上、我看到了使用死区功能并从 ePWM 模块(以下代码)生成 PWM 信号的实验示例(7_6)、但它不捕获信号。 这就是我最初开始使用 ECAP 模块的原因。   

    code=>


    EPwm1Regs.TBCTL.bit.CLKDIV = 0;// CLKDIV = 1
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;// HSPCLKDIV = 2
    EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式

    EPwm1Regs.AQCTLA.ALL = 0x0060;//在 CMPA 上设置 ePWM1A
    //在 CMPA 递减时清除 ePWM1A

    EPwm1Regs.AQCTLB.all = 0x0600;//在 CMPB 上设置 ePWM1B
    //清除 CMPB 上的 ePWM1B
    EPwm1Regs.TBPRD = 37500;// 1KHz - PWM 信号

    EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;//首先占空比为50%
    EPwm1Regs.CMPB = EPwm1Regs.TBPRD/2;

    EPwm1Regs.DBRED = 750;// 10微秒延迟
    EPwm1Regs.DBFED = 750;//针对上升沿和下降沿
    EPwm1Regs.DBCTL.bit.OUT_MODE = 3;// ePWM1A =红色
    EPwm1Regs.DBCTL.bit.POLSEL = 2;// S3=1 ePWM1B 上的反相信号
    EPwm1Regs.DBCTL.bit.IN_MODE = 0;// ePWM1A =红色和 FED 源

    您能建议我如何将上述代码与我的 ECAP 代码关联? 我想我需要将周期的值传递到我 的 EPwm1Regs.TBPRD 中。 如此=>

     EPwm1Regs.TBPRD = PWM_PERIOD;(如果需要、可变系数乘以周期设置)-表示周期

    EPwm1Regs.CMPA.half.CMPA = PWM_Duty;(如果需要、可变系数乘以占空比设置)--表示占空比

    这是我为我捕获的 ECAP 信号(GPIO24)生成2个 EPWM 信号( 即 EPW1A 和 EPWM1B 反相、具有死区设置(如上所述死区设置代码)的正确方法吗??   

    注意:我应该在 GPIO 选择中为 EPWM1A 和 EPWM1B 激活多路复用器

    请查看代码并提出相应建议

    谢谢

    此致

    Arsalan

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

    您好、Arsalan、

    您位于正确的路径上、而不是为 apwm 设置周期和占空比。 您可以改为将 EPWM.TBPRD 寄存器设置为 ECAP 的捕获周期、并将 CMPA 寄存器设置为等于 ECAP 的占空比。 死区必须使用死区寄存器进行设置:

    EPwm1Regs.DBRED = 750;// 10微秒延迟
    EPwm1Regs.DBFED = 750;//针对上升沿和下降沿

    还有许多资源可用于了解 ePWM 特性:

    培训 视频

    2. C2000 Academy 页面

    应用 手册

    最棒的

    Ryan Ma

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

    您好、Ryan、

    我今天测试了代码并查看了您共享的资源。 此外、我对 TBPRD 和我最后一个代码中的比较值遵循了相同的过程 、但我没有从 GPIO0 (ePWM1A)和 GPIO01 (ePWM1B)获得结果。 其次、该寄存器对于 ePWM 中的 TBPRD 为16位、但对于 PWM_PERIODE/Duty 为32位、这可能会导致问题。   

    然后、我更改了 ePWM 之前的函数 ECAP、以保持 ECAP 捕获来自发生器的信号的顺序、然后为捕获的结果生成 ePWM、这样就完成了函数的更改=>

    void Setup_eCAP1 (void);
    void Setup_ePWM1 (void);

    .

    Setup_eCAP1 ();//初始化 eCAP1

    Setup_ePWM1 ();//初始化 ePWM1

    仍然没有输出。  

    以下是针对输出和全部四个寄存器 eCAP1、eCAP2、eCAP3和 ePWM1 (A/B)的更新:

    在从发生器向 GPIO24 (eCAP1)提供信号之前、寄存器和输出(epWM1A-GPIO0、ePWM1B-GPIO1)的值显示在这里=>

    在从发生器向 GPIO24 (eCAP1)提供信号后、输出(epWM1A-GPIO0、ePWM1B-GPIO1)和寄存器值如下所示:  

    经过一段延迟后、输出端(epWM1A-GPIO0、ePWM1B-GPIO1)没有信号、寄存器值为=>

    请相应地查看代码

    期待您的反馈

    谢谢

    此致

    Arsalan

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

    您好、Arsalan、

    在您发送的最后一个屏幕截图中、TBPRD 小于 CMPA 值。 我假设永远不会达到动作限定符事件、您的动作限定符不会对输出产生影响。 尝试将 CMPA 值设置为小于周期。  

    我还会确保为 GPA 启用 PUD

        GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Enable pull-up on GPIO0 (EPWM1A)
        GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Enable pull-up on GPIO1 (EPWM1B)   
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B

    正确、TBPRD 为16位。 您是否需要周期需要等于2^32的信号? 这意味着最大周期为28.6s。

    另请注意、TBCLK 有两个分频器、默认情况下将 SYSCLKOUT 除以/2。 (HSPCLKDIV)。  

    ECAPCLK 由 SYSCLK 计时、因此您必须将周期/计数器值除以2、使它们处于同一个 SYSCLK。  

    此外、ECAP APWM 在技术上是 PWM 信号、处于向上计数模式、其中 CAP1是周期、CAP2是占空比(CMPA)。  

    最棒的

    Ryan Ma

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

    您好、Ryan、

    感谢您的回复。  

    在您发送的最后一个屏幕截图中、TBPRD 小于 CMPA 值。 我假设永远不会达到动作限定符事件、您的动作限定符不会对输出产生影响。 尝试将 CMPA 值设置为小于周期。  

    对于这个部分、在之前的帖子图片中、当我写入 PWM_Duty 时、CMPA/CMPB 都大于 TBPRD (EPwm1Regs.CMPA.half.CMPA = PWM_Duty;)。 因此、我不是写入 PWM_Duty、而是在 EPwm1Regs.TBPRD/2 Form 中写入类似这样的代码

    EPwm1Regs.TBPRD = PWM_PERIOD;// 1KHz - PWM 信号

    EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD)/ 2;//首先占空比为50%
    EPwm1Regs.CMPB =(EPwm1Regs.TBPRD)/ 2

    通过这种方法、请参阅寄存器。 CMPA 和 CMPB 变为一半...占空比为50%。 (现在它成为 TBPRD 的一半)。

    其次、无论您是应用1KHz 还是120kHz、TBPRD 都不会改变、请参阅寄存器。 即使在从发生器施加信号之前、在施加信号后等待延迟后、也不会改变。 TBPRD 不会显示任何值变化。  

    此外、ECAP APWM 在技术上是 PWM 信号、处于向上计数模式、其中 CAP1是周期、CAP2是占空比(CMPA)。

    我还尝试了这种方法、针对该器件进行了写操作(针对行: EPwm1Regs.TBPRD = PWM_PERIOD;// 1KHz - PWM 信号)、就像这样=>

    EPwm1Regs.TBPRD =  Ecap2Regs.CAP3;(或 Ecap2Regs.CAP1)…… 但无论您应用的频率是多少、该 TBPRD 都不会改变。 请参阅寄存器。

    我还会确保为 GPA 启用 PUD

    该部件、但也没有产生任何影响。

    另请注意、TBCLK 有两个分频器、默认情况下将 SYSCLKOUT 除以/2。 (HSPCLKDIV)。  

    ECAPCLK 由 SYSCLK 计时、因此您必须将周期/计数器值除以2、使它们处于同一个 SYSCLK

    对于这个部件、当我使用预分频器除以2 (通过 ECap1Regs.ECCTL.prescaler (00001))时、这会将我的发生器施加信号的频率减半、正如我不希望的那样(120kHz 时为60kHz)。 因此我保持在预分频器(00000)。 为了使 SYSCLK 设置相同、我在 ePWM 代码中使用了 HSPCLKDIV = 0 (无除法)和 CLKDIV = 0来使 SYSCLK 与 Ecapclk 保持相同。  仍然没有反应。  

    正确、TBPRD 为16位。 您是否需要周期需要等于2^32的信号? 这意味着最大周期为28.6s。

    我想我将32位(PWM_PERIOD)的值复制到不更新 TBPRD 值的 TBPRD (16位)中。   简而言之、TBPRD 必须随着 PWM_PERIOD (取决于发生器信号频率)而相应地改变、而 PWM_PERIOD 似乎不起作用。 请在代码中提供建议:

    信号之前=>

    从发生器施加120kHz 信号后=>

    期待您的回复

    谢谢  

    Arsalan

     

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

    您好、Arsalan、

     您能在计算 PWM_PERIOD 值时向我展示一下吗? 您将需要使用该数字并将其转换为 TBPRD 值。

    TBPRD 值可使用 TRM 中的此公式计算得出

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

    您好、Ryan、

    它显示在我上一篇文章中的寄存器值图片中。 PWM_PERIOD 和 PWM2_周期相同1250、占空比为625 (PWM_Duty / PWM2_Duty)。

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

    您好、Arsalan、

    我认为您的外设未启用、因此不会出现输出。

    验证这是否在 InitSysCtl()内启用了 ePWM 外设。

        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
        EDIS;
        Setup_ePWM1();     // init  ePWM1A
        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
        EDIS;

    此外、请确保在代码主体内的 while 循环之前编写此代码。

    我还会将周期设置为初始化 ePWM 的开始处的某些默认值、以查看 PWM 是否输出某些内容。

    最棒的

    Ryan Ma

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

    您是否还在使用 controlCARD TMDSCNCD28335?

    EPWM1A 将位于该板上的 GPIO-00 ->引脚23上

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

    您好、Ryan、

    感谢您的回复。

    我认为您的外设未启用、因此不会出现输出。

    验证这是否在 InitSysCtl()内启用了 ePWM 外设。

    此外、请确保在代码主体内的 while 循环之前编写此代码。

    我还会将周期设置为初始化 ePWM 的开始处的某些默认值、以查看 PWM 是否输出某些内容。

    您是否还在使用 controlCARD TMDSCNCD28335?

    EPWM1A 将位于该板上的 GPIO-00 ->引脚23上

    答案:

    对于该器件、外设已启用、因为当您提供37500 (对于2kHz…… EPwm1Regs.TBPRD = 37500; )无论您关闭 ECAP 模块功能还是代码中没有写入 PWM_PERIOD (32位),您都将在示波器上获得占空比为50%的 PWM 信号(请参阅 Picture1、Picture2)。 因此、这意味着外设启用没有问题。

    此外,InitSysstrl()函数没有问题,因为我使用的是 DSP2833x_sysctrl.c,它已经显示 ePWM 外设处于打开状态:=>(请参阅代码 Picture3中的内容):代码也是在代码主函数(CODE_attached)的 while 循环之前编写的。

    此外、它是外设板集线站处的 GPIO00、它将控制卡置于 J1接头中(引脚23用于控制卡引脚、而不是用于外设板引脚) 因为我之前已经使用这个 GPIO00端口通过改变 TBPRD、死区时间和占空比等测试过 TI 实验室示例中的简单 PWM 程序实验室 为了满足这一要求、我检查了一次在外设电路板上没有提供任何东西的 GPIO23 (pin23)。 因此、在 GPIO00和 GPIO01中、您可以准确地获取 EPWM1A 和 EPWM1B 信号。  

    Picture3 (用于 DSP2833x_SYSCTRL.c)

     

    图片1.

    图片2.

    问题1.

    我看到当您给出75000 (对于1kHz 值  EPwm1Regs.TBPRD = 75000;)时、您会在寄存 器中看到类似如下的警告:"70-D 整数转换导致截断"。 (请参阅图4)。  TBPRD 寄存器显示的值不正确、这是由于这种截断错误所致(请参阅图4)。

    注意:较小的值,如37500 (2kHz)或18750 (4kHz)或1250 (120kHz)。 TBPRD 寄存器显示正确的值、结果以 ePWM 信号的形式出现在示波器上(没有截断错误的警告标志)。  

    图4 (TBPRD = 75000时的截断警告)和 TBPRD 寄存器值不正确)。

    问题2.

    当您更换 TBPRD 编号(75000、37500、18750..1250 (120kHz)... etc)使用 ECAP 信号模块的可变 PWM_PERIOD (32位)、则 TBRD 值不会自行更新。 这意味着 当您在图5中看到寄存器值时、它不会检测变量。

    图5.

    请建议并检查代码、使变量 PWM_PERIOD (32位)/PWM_Duty (32位)可以工作。

    期待您的回复。

    谢谢  

    Arsalan

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

    您好、Arsalan、

    当没有写入 TBPRD 时、您的 epwm1似乎没有将影子加载到活动寄存器中。

    在 ECAP 中断内、尝试将 TBPRD 设置为更新的周期值。

    此致、

    Ryan Ma  

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

    您好、Ryan、

    感谢您的回复。

    在 ECAP 中断内、尝试将 TBPRD 设置为更新的周期值。

    这意味着、

    我应该在中断块中分配 TBPRD 值吗??? 比如这个=>

    中断空 eCAP1_ISR (空)

    ECap1Regs.ECCLR.bit.INT = 1;//清除 ECAP1中断标志
    -  
    -

    -

    ECap1Regs.ECCTL2.bit.rearm = 1;

    EPwm1Regs.TBPRD = PWM_PERIOD;//数字- 75000、37500、18750..etc.

    PieCtrlRegs.PIEACK.all = PIEACK_group4;//必须确认 PIE 组4

    然后是 ePWM1函数- - void Setup_ePWM1 (void){--CLK、动作限定符(此函数中没有 TBRD)、CMP、死区、 ---}

    我可以尝试这种方法吗?

    谢谢

    此致

    Arsalan

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

    您好、Arsalan、

    是的、请尝试一下。 但请保留在 Setup_ePWM1函数中的内容、在该函数中初始化启动 TBPRD。

    最棒的

    Ryan Ma

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

    您好、Ryan、

    最后、解带功能(上升沿和下降沿)现在被解析。 谢谢。 我将布置另一个线程、用于 EPWM1A 和 EPWM1B 之间的180度相移。

    谢谢 Ryan

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

    您好、Arsalan、

    很高兴听到这些功能正常工作:)  

    祝您工作顺利!