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.

[参考译文] CCS/TMS320F28335:如何配置 ECAP 寄存器以实现以下功能:在以50%的占空比捕获50Hz PWM 时检测上升沿和下降沿?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/836922/ccs-tms320f28335-how-to-configure-the-ecap-register-to-realize-the-function-detect-the-rising-edge-and-the-falling-edge-when-capturing-a-50hz-pwm-with-a-50-duty

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好!

实际上,当电网电压通过零点时、我需要检测电网电压(如果电网电压从负到正、则输出高电平;如果电网电压从正到负、则输出低电平。)

因此、我编写一个测试程序来验证该函数。 我使用 EPwm1A 生成占空比为50%的50Hz PWM。 则 eCAP1将捕获此 PWM。 如果 ECAP 捕获上升沿、强制 EPwm1B 输出高电平;如果下降沿、强制 EPwm1B 输出低电平。 理想结果是、我将通过示波器检测引脚 GPIO1 (EPwm1B)中占空比为50%的同步50Hz PWM。

但是、在 DSP 运行后、我遇到了一些问题。 我没有看到理想的结果。  

首先、GPIO1没有输出 PWM。 它输出高电平或低电平。 然后我更改了一些配置。 GPIO1以50%的占空比输出25Hz PWM。

我将输出 EPwm1B 与输入 EPwm1A 进行了比较。 我发现 EPwm1B 的输出在 EPwm1A 的上升沿或下降沿没有变化。  它在 EPwm1A 高电平或低电平的中点发生变化。 eCAP1似乎没有捕获上升沿或下降沿。

我知道我的 eCAP1模块必须有一些错误的配置。 以下是我的配置代码:

void SetCap1模式(void)

ECap1Regs.ECEINT.ALL = 0x0000;//禁用所有中断
ECap1Regs.ECCLR.ALL  = 0xFFFF;//清除全部标志

ECap1Regs.ECCTL1.bit.CAP1POL   = EC_RISING;//上升边沿
ECap1Regs.ECCTL1.bit.CAP1POL   = EC_FALLING;//下降边沿
ECap1Regs.ECCTL1.bit.CAPLDEN  = EC_DISABLE;//禁用 CAP1-CAP4寄存器加载
ECap1Regs.ECCTL1.bit.prescale = EC_DIV1;//输入/ 1.

ECap1Regs.ECCTL2.bit.CAP_APWM      = EC_CAP_MODE;//在 CAP 模式下工作
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_OneShot;//在单次触发模式下工作
ECap1Regs.ECCTL2.bit.SYNCO_SEL     = EC_SYNCO_DIS;//禁用 SYNC OUT 信号
ECap1Regs.ECCTL2.bit.SYNCI_EN       = EC_DISABLE;//禁用同步输入
ECap1Regs.ECCTL2.bit.TSCTRSTOP     = EC_FREEZE;//在不使用时停止计数器
ECap1Regs.ECCTL2.bit.STOP_Wrap    = EC_EVENT2;//在事件2处停止
ECap1Regs.ECCTL2.bit.rearm          = EC_ARM;// ARM 单次触发

ECap1Regs.ECEINT.BIT.CEVT1 = 1;
ECap1Regs.ECEINT.BIT.CEVT2 = 1;

中断空 ISRCap1 (空)

if (((ECap1Regs.ECFlG.bit.CEVT1 =1)&&(EPwm1Regs.AQCSFRC.bit.CSFB =1))

capcount1++;
LED1 =~LED1;
EPwm1Regs.AQCSFRC.bit.CSFB = 2;

ECap1Regs.ECCLR.bit.CEVT1 = 1;//清除事件1的标志
ECap1Regs.ECCLR.bit.CEVT2 = 1;
ECap1Regs.ECEINT.BIT.CEVT1 = 0;
ECap1Regs.ECEINT.BIT.CEVT2 = 1;

if (((ECap1Regs.ECFlG.bit.CEVT2 == 1)&&(EPwm1Regs.AQCSFRC.bit.CSFB == 2))

capcount2++;
LED2 =~LED2;
EPwm1Regs.AQCSFRC.bit.CSFB = 1;

ECap1Regs.ECCLR.bit.CEVT1 = 1;
ECap1Regs.ECCLR.bit.CEVT2 = 1;//清除事件2的标志
ECap1Regs.ECEINT.BIT.CEVT1 = 1;
ECap1Regs.ECEINT.BIT.CEVT2 = 0;

ECap1Regs.ECCLR.bit.INT = 1;//清除全局中断标志;
ECap1Regs.ECCTL2.bit.rearm = EC_ARM;//确认下一个中断
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;

我查找寄存器、它表示每次进入中断时 、ECap1Regs.ECFlG.bit.CEVT1和 ECap1Regs.ECFlG.bit.CEVT2都将通道为1、我猜是配置

ECap1Regs.ECCTL2.bit.STOP_Wrap    = EC_EVENT2;//在事件2处停止

可能是原因。 但是、如果在 EC_EVENT1上设置该位、它无法检测到下降沿、对吧?

因此、我想知道是否有任何解决方案可以解决这个问题、最好不要使用中断。

谢谢你。

此致、

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

    抱歉、代码

    ECap1Regs.ECCTL1.bit.CAP1POL   = EC_RISING;//上升边沿
    ECap1Regs.ECCTL1.bit.CAP1POL   = EC_FALLING;//下降边沿

    是的  

    ECap1Regs.ECCTL1.bit.CAP1POL   = EC_RISING;//上升边沿
    ECap1Regs.ECCTL1.bit.CAP2POL   = EC_FALLING;//下降边沿

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

    Sercy_PJB、

    eCAP 本来不打算以这种方式使用、但我认为您可以让它在合理的软件延迟下工作。 您似乎已经配置了单次触发模式、为此、我建议使用连续模式。 单次触发模式确实可以让您捕获快速信号并在几个周期后处理结果。 听起来、您希望每个周期都能可靠地跳闸。

    如果您想继续使用 eCAP 中断、我建议在 eCAP 中断中添加一个 GPIO 切换、并在示波器上观察此输出。 这应该指出它是否在您预期的时间内正确跳闸。 除非另一个中断具有优先级、否则不应延迟该中断。

    您是否已将跳闸区域子模块(TZ)用于其他用途? TZ 似乎可以更好地用于此目的。 请注意、您仍需要同步 PWM 的周期、因为跳闸将是逐周期或单次触发。 TZ 将能够强制为高电平或强制为低电平、而不是两者兼而有之。 您可以使用动作限定符在 PWM 周期的开始强制信号为高电平、然后在接收过零信号时使用 TZ 强制信号为低电平。

    遗憾的是、PWM 并未如上所述设置为信号跟随器。  

    此致、
    Cody  

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

    感谢您的回复、Cody、

    [引用用户="Cody Watkins"]

    eCAP 不是以这种方式使用的

    [/报价]

    但我发现其他人使用 ECAP 锁定电网相位。 您说过

    [引用用户="Cody Watkins"]

    单次触发模式确实可以让您捕获快速信号并在几个周期后处理结果。

    [/报价]

    您的意思 是、在单次触发模式下工作时、ECAP 捕获边沿信号、然后 DSP 需要几个周期来处理某项操作。 这个周期是系统的周期吗? 如果是这样、即使是10个周期、也只需要10/150000000s 的成本。 但边沿信号每0.01s 传输一次。

    我没有使用 TZ 模块、因为动作限定器具有控制位来强制为高电平或低电平。

    昨天、我尝试了另一个想法(我想可以用这种方式使用一次性模式)。

    首先、我配置了 CAP1POL =上升沿。 触发中断时、将 CAP1POL 配置为下降沿。 下一次触发中断时、切换回上升沿、这将被循环。

    void SetCap1模式(void)

       ECap1Regs.ECEINT.ALL = 0x0000;             //禁用所有中断
       ECap1Regs.ECCLR.ALL = 0xFFFF;              //清除所有标志

       ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;     //上升边沿
       ECap1Regs.ECCTL1.bit.CAPLDEN = EC_DISABLE; //禁用 CAP1-CAP4寄存器加载
       ECap1Regs.ECCTL1.bit.prescale = EC_DIV1;       //输入/1

       ECap1Regs.ECCTL2.bit.CAP_APWM   = EC_CAP_MODE;    //在 CAP 模式下工作
       ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_OneShot;   //在单次触发模式下工作
       ECap1Regs.ECCTL2.bit.SYNCO_SEL  = EC_SYNCO_DIS;    //禁用 SYNC OUT 信号
       ECap1Regs.ECCTL2.bit.SYNCI_EN   = EC_DISABLE;            //禁用同步输入
       ECap1Regs.ECCTL2.bit.TSCTRSTOP  = EC_FREEZE;        //不使用时停止计数器
       ECap1Regs.ECCTL2.bit.STOP_Wrap  = EC_EVENT1;       //在事件1停止
       ECap1Regs.ECCTL2.bit.rearm      = EC_ARM;               // ARM 单次触发

       ECap1Regs.ECEINT.BIT.CEVT1 = 1;




    中断空 ISRCap1 (空)

       if (((ECap1Regs.ECFlG.bit.CEVT1 ==1)&(ECap1Regs.ECCTL1.bit.CAP1POL =EC_Rising)))
       {
          capcount1++;
          LED1 =~LED1;
          EPwm1Regs.AQCSFRC.bit.CSFB = 2;

          ECap1Regs.ECCLR.bit.CEVT1 = 1;         //清除事件1的标志
          ECap1Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
       }

       if (((ECap1Regs.ECFlG.bit.CEVT1 ==1)&(ECap1Regs.ECCTL1.bit.CAP1POL =EC_FALLING))
       {
          capcount2++;
          LED2 =~LED2;

          EPwm1Regs.AQCSFRC.bit.CSFB = 1;

          ECap1Regs.ECCLR.bit.CEVT1 = 1;         //清除事件1的标志
          ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
       }

       ECap1Regs.ECCLR.bit.INT   = 1;         //清除全局中断标志;
       ECap1Regs.ECCTL2.bit.rearm = EC_ARM;   //确认下一个边沿检测
       PieCtrlRegs.PIEACX.ALL    = PIEACK_group4;

    我在调试模式下使用中断函数第一行的断点对其进行了测试。 然后、我逐步运行、同时观察相应的寄存器位。 逻辑是正确的。 但是、当 DSP 在没有断点的情况下运行时、EPwm1B 保持输出高电平。

    此致、

    宁静的地方

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

    宁静

    我确实认为这是可行的、但我们没有计划有人以这种方式使用器件、因此您不会找到许多使这变得更容易的硬件实现。 您将需要像您那样使用软件干预。

    [引用 user="Serenity_pjb"]

    Cody Watkins

    eCAP 不是以这种方式使用的

    但我发现其他人使用 ECAP 锁定电网相位。

    [/报价]

    我不认为该系统需要单次触发模式。 但使用起来很好、我看不到这方面的任何潜在问题。

    是否设置了任何其他 PWM 子模块? 它们可能会影响输出。


    此致、
    Cody  

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

    您好、Cody、

    最后、我解决了这个问题。 我想您猜、PWM 子模块会影响输出是正确的。

    因为在之前的代码中、我使用了 PWM 寄存器 AQCSFRC 来强制输出高电平或低电平(EPwm1B)。

    昨天、我将 EPwm1B 的引脚配置为 GPIO。 然后在发生边沿事件时切换输出电平。

    DSP 运行后、GPIO1输出一个几乎与输入同步的50Hz PWM。

    但我不知道为什么 AQCSFRC 寄存器无法实现该函数

    我刚才更改了代码

    EPwm1Regs.AQCSFRC.bit.CSFB = 2;

    EPwm1Regs.AQCSFRC.bit.CSFB = 1;

    更改为

    GpioDataRegs.GPASET.bit.GPIO1=1;

    GpioDataRegs.GPACLEAR.bit.GPIO1=1;

    当然、我将相应的引脚配置为 GPIO。

    也许我需要在数据表中了解有关 PWM 模块的更多配置。

    不管怎样,感谢你的答复。

    此致、

    宁静的地方

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

    Sercy_PJB、

    GPIO 多路复用器选择不同的功能、如果配置了 PWM、则 GPIO 的输出将被阻止。 如果 GPIO 被配置、那么 PWM 的输出被阻断。

    很高兴您已解决问题。 此外、由于这需要大量软件干预、因此实现这一目标的最佳方法可能是 GPIO、正如您所做的那样。

    此致、
    Cody