工具/软件: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 上的信号设置的每个变化边沿是否都可以使用它?
如果可能的话、我想知道如何配置寄存器来解决这个问题。
感谢您的帮助、
克莱蒙特
