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/TMS320F28377D:每次捕获时 ECAP 中断

Guru**** 2601915 points
Other Parts Discussed in Thread: TMS320F28377D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676485/ccs-tms320f28377d-ecap-interupt-on-each-capture

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

您好!  

对于一个项目、我需要使用 TMS320F28377D 的 ECAP 模块来捕获霍尔传感器的脉冲。 我必须测量传感器每个边沿变化时的 ECAP 计数器值。 现在、我设法每4个变化的边沿触发一次中断(ECAP 模块的 Mod4 CTR)。

为了进行调试、我在输入中的 GPIO19上设置 PWM3A。 当中断被触发时、我切换输出中设置的 GPIO16。 代码如下:

void main (void)
{
InitSysCtrl();

InitEPwm3Gpio();
InitECap1Gpio (19);
GPIO_SetupPinOptions (19、GPIO_input、 GPIO_异 步);

GPIO_SetupPinMux (16、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (16、 GPIO_OUTPUT、GPIO_PushPull);

DINT;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable ();

EALLOW;//这是写入 EALLOW 受保护寄存器
PieVectTable.ECAP1_INT =&eCAP1_ISR;
EDIS;//这是禁用写入 EALLOW 受保护寄存器

InitEPwmTimer
()所需的;//仅初始化 IeR1_INTR1.INT.INTR1;EIECT1.INT.INTR=Inetchems



= EIeR=Inetchems;IeR=Inetr.INT.INTR1.INT.INT.INTR1.INT.INT.INTR=Inetr=Inetr=Inetchems

//为


(;;)
{启用全局_中断 INTM ERTM;//启用全局实时_中断 DBGM
asm (" NOP");
}

------------------ 配置 ECAP -------------------------------------------------------

// InitECapture -初始化 ECAP1配置
//
void InitECapture ()
{
ECap1Regs.ECEINT.ALL = 0; //禁用所有 eCAP 中断
ECap1Regs.ECCLR.ALL = 0xFFFF; //清除所有 CAP 中断标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //已禁用捕获结果的加载
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //停止计数器
ECap1Regs.TSCTR = 0; //清除计数器
ECap1Regs.CTRPHS = 0; //清除计数器相位寄存器
//
//配置外设寄存器
//
//捕捉控制寄存器1
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; // 0捕获事件1极性选择
ECap1Regs.ECCTL1.bit.CTRST1 = EC_Delta_MODE; // 1捕捉事件1上的计数器复位
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING; // 2捕获事件2极性选择
ECap1Regs.ECCTL1.bit.CTRST2 = EC_Delta_MODE; //捕获事件2上的3个计数器复位
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING; // 4捕获事件3极性选择
ECap1Regs.ECCTL1.bit.CTRST3 = EC_Delta_MODE; //捕获事件3时的5个计数器复位
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING; // 6捕获事件4极性选择
ECap1Regs.ECCTL1.bit.CTRST4 = EC_Delta_MODE; // 7捕捉事件4上的计数器复位
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE; // 8启用在发生电容事件时加载 CAP1-4寄存器
ECap1Regs.ECCTL1.bit.prescale = EC_DIV1; // 13:9事件过滤器预分频选择- 1分频
ECap1Regs.ECCTL1.bit.free_soft = 0b10; // 15:14仿真模式-自由运行

//捕捉控制寄存器2
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUCT; // 0连续或单次触发-连续
ECap1Regs.ECCTL2.bit.STOP_Wrap = 0b11; // 2:1“单次触发的停止值,连续后续处理”,捕获后后续处理事件4
ECap1Regs.ECCTL2.bit.rearm = 1; // 3次一次性重新布设
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // 4 TSCNT 计数器启动
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_ENABLE; //选择5个计数器同步输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCIN; // 7:6同步输出模式
ECap1Regs.ECCTL2.bit.SWSYNC = 1; // 8 SW 强制计数器同步
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; // 9 CAP/APWM 运行模式选择
ECap1Regs.ECCTL2.bit.APWMPOL = 0; // 10 APWM 输出极性选择

// ECAP 中断使能
ECap1Regs.ECEINT.BIT.CEVT1 = 0; // 1捕获事件1中断使能
ECap1Regs.ECEINT.BIT.CEVT2 = 0; // 2捕获事件2中断使能
ECap1Regs.ECEINT.BIT.CEVT3 = 0; // 3捕获事件3中断使能
ECap1Regs.ECEINT.BIT.CEVT4 = 1; // 4捕获事件4中断使能
ECap1Regs.ECEINT.BIT.CTROVF = 0; // 5计数器溢出中断使能
ECap1Regs.ECEINT.BIT.CTR_EQ_PRD = 0; // 6周期相等中断使能
ECap1Regs.ECEINT.BIT.CTR_EQ_CMP = 0; // 7比较等效中断使能

// ECAP 中断清除
ECap1Regs.ECCLR.bit.INT = 1; // 0全局标志
ECap1Regs.ECCLR.bit.CEVT1 = 1; // 1捕获事件1中断标志
ECap1Regs.ECCLR.bit.CEVT2 = 1; // 2捕获事件2中断标志
ECap1Regs.ECCLR.bit.CEVT3 = 1; // 3捕获事件3中断标志
ECap1Regs.ECCLR.bit.CEVT4 = 1; // 4捕获事件4中断标志
ECap1Regs.ECCLR.bit.CTROVF = 1; // 5计数器溢出中断标志
ECap1Regs.ECCLR.bit.CTR_PRD = 1; // 6周期相等中断标志


} 

-------------------- ECAP ESR----------------------

_interrupt void eCAP1_ISR (void)
{
//捕捉控制寄存器1

GpioDataRegs.GPATOGGLE.BIO16 = 1;


ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.reARM = 1;

} 

我获取此配置文件:  

PWM:在 ECAP 输入的 GPIO 19上设置信号 PWM

eCAP1:每次触发 GPIO16时都会切换

当我想中断每个边沿时、问题就会开始。  

我测试了多种组合:  

仅使用捕获1和捕获1中断

使用4个捕获、并在4个捕获上进行中断:

ECap1Regs.ECEINT.BIT.CEVT1 = 1; // 1捕获事件1中断使能
ECap1Regs.ECEINT.bit.CEVT2 = 1; // 2捕获事件2中断使能
ECap1Regs.ECEINT.bit.CEVT3 = 1; // 3捕获事件3中断使能
ECap1Regs.ECEINT.bit.CEVT4 = 1; // 4捕获事件4中断使能 

对于每次测试,我都要测量相同的反应:

我不知道为什么这种炎经常引发。 频率有时会根据寄存器的设置而变化。

首先,ECAP 上的信号设置的每个变化边沿是否都可以使用它?
如果可能的话、我想知道如何配置寄存器来解决这个问题。

感谢您的帮助、
克莱蒙特

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

    您好、Cl é ment、

    一些意见:
    1) 1)您应该注释掉指令、以便在中断内重新启用 eCAP。  我不相信这是你所需要的,我认为这可能是你所看到的。  在使用连续模式时、这也不是真正需要的。
    2) 2)我认为它不会导致任何问题、但我可能建议禁用相位同步(SYNCI_EN)

    希望这对您有所帮助!


    谢谢、
    Brett

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

    除了 Brett 的建议之外,在 InitECapture()函数中,我没有看到 EALLOW。 ECCTL1、ECCTL2和 ECEINT 是 EALLOW 受保护寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brett 和 Frank、您好!

    感谢您的回答、我尝试了您的修改、但起初不起作用、然后我看到我没有清除中断函数中 CEVT1、CEVT2和 CEVT3的标志。 现在工作正常。
    PS:它可以使用和不使用 SYNCI_EN。

    此致、
    Clement