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.
尊敬的社区成员:
我想问一下 ECAP 模块中的连续/一次性模式。 我用于捕获脉冲的代码以某种方式工作、但当我从函数发生器或任何其他生成 PWM 脉冲的系统接通脉冲信号时、有时会导致捕获信号的问题。 看起来它在捕获期间错过了几次迭代中的上升/下降沿、并且输出会变为 常量低电平或高电平。 因此、系统无法识别脉冲信号边沿的闭合/断开状态。 请记住、传入/输入信号是一个被馈入 eCapture 模式的连续脉冲。 将一次性模式更改为连续模式、反之亦然、可能会产生什么影响???
我正在工作的系统在方框图中分享:
代码附在此处:
请提出相应建议。
谢谢
此致
阿尔萨兰
尊敬的 Arsalan:
eCAP 的一次性和连续模式是两种不同的模式。 利用一次性模式、您可以根据重新启用捕捉的时间来一次捕获信号。 "Continuous"允许您捕获信号、而无需重新启用 eCAP 模块。
启用后、eCAP 模块等待1-4 (由 stop-value 定义)捕获事件、然后冻结 Mod4计数器和 CAP1-4寄存器的内容(时间戳)。 Re 布防为另一个捕获序列准备 eCAP 模块。 此外、如果 CAPLDEN 位被置位、重新布防将 MOD4计数器清零(至零)并允许再次加载 CAP1-4寄存器。
在连续模式下,MOD4计数器继续运行(0->1->2->3->0,忽略单次触发操作,
并且捕捉值继续以循环缓冲器序列被写入 CAP1-4。
此致!
mA
您好、Ryan、
感谢您的答复。
这意味着在第279行的代码中、我使用的是连续模式、无需重新启动过程。 因此、我应该删去第373行的 Re 臂程序、正确吗? 然后将在测试期间再次检查它是否在几次迭代中错过了上升/下降沿。
此外、通过此假设、 我可以认为两种模式(连续/单次触发)都能捕获传入的脉冲信号(滤波或未滤波) 、无论如何都不应错过沿。 此外、我的系统在打开或关闭时不应停止或停止。
代码附在此处:
谢谢
此致
阿尔萨兰
这意味着在第279行的代码中,我使用的是连续模式,不需要重新 ARM 程序。 因此、我应该删去第373行的 Re 臂程序、正确吗? 然后将在测试期间再次检查它是否在几次迭代中错过了上升/下降沿。 [/报价]是的、您不必在连续模式下重新布防。 没有上升/下降沿、当您更改信号发生器的输出频率和占空比时是否始终会发生这种情况? eCAP 最终是否输出正确的信号?
此致!
mA
您好、Ryan、
感谢您的答复。
缺少上升沿/下降沿时,当您更改信号发生器的输出频率和占空比时是否总是发生这种情况?
并非总是如此。 但很少发生。
缺失的边沿意味着如果您在 GPIO24 (eCAP1)处执行了多次连接导线和断开导线等过程 、然后在某个时刻 不采用任何值或不更新变量(PWM_PERIOD 和 PWM_DUTY)、则它不会开始获取值或加载。 如图1所示、它会在一个点发生残桩(PWM_PERIOD = 3375511、PWM_DUTY = 3375467)。 在发生卡点后不会再进行捕捉。 无论您是在 GPIO24连接还是断开导线。
我想计数器会变满。 无论您 在 GPIO24连接还是断开线路、都无需再捕获信号或更新值(PWM_PERIOD 和 PWM_DUTY)。 请相应地建议解决此问题。
请仔细查看 ECAP 函数的代码(Setup_eCAP1 (void)->第258-325行和 eCAP1_ISR (void)->第347-373行)
图1:
请相应地建议解决此问题。
谢谢
此致
阿尔萨兰
尊敬的 Arsalan:
计数器溢出事件(FFFFFFFF->00000000)也作为中断源(CTROVF)提供。 您可以启用此中断、清除溢出标志、然后重新启用 eCAP 模块以继续监控信号。 我假设在捕获时输入信号丢失或断开、则可能会发生溢出事件、导致无效的捕获值。
此致!
mA
您好、Ryan、
感谢您的答复。
因此我需要在 void Setup_eCAP1 (void)函数中执行此操作--- >
ECap1Regs.ECEINT.CTRVF = 1;
ECap1Regs.ECCLR.bit.CTRVF = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;
对吧?
我想 在计算 PWM_PERIOD/PWM 占空比事件后、无需在中断失效 eCAP1_ISR (void)函数中重新布防。
请检查相应的代码
谢谢
此致
阿尔萨兰
尊敬的 Arsalan:
是的、启用 CTROVF 中断、您还将需要一个与您的 eCAP1_ISR 类似的服务例程、或者您只需检查 CTROVF 状态标志是否处于激活状态、如果它处于激活状态、您可以在您的 eCAP1_ISR 中重新 ARM eCAP 模块。 由于它一直运行、因此进行重新布防的唯一原因是复位捕获值和 TSCTR。
此致!
mA
您好、Ryan、
似乎出了一些问题。 因为 ECFLG 值0。 CTROVF 状态标志= 0。 如果我在 eCap1.it 提供电压、它不需要输入值、这意味着没有捕获。 我认为(ECFLG .CTRVF)状态标志 表示没有发生事件。 这意味着计数器已溢出(我猜)、但我已经在第292行执行了重新调整。 它应该捕获值???
您能相应地建议吗?
代码附在此处:
谢谢
此致
阿尔萨兰
尊敬的 Arsalan:
在代码中、似乎您尚未初始化在 CTROVF 状态被设置或启用此中断时发生的中断。 启用后、这将为您提供一种有用的方法来了解 CTROVF 状态是否已发生、您可以在此新的 ISR 中设置软件或硬件断点。 在该 ISR 内、您可以重新布防 eCAP 模块以复位计数器并继续捕捉。
此致!
mA
您好、Ryan、
感谢您的答复。
在您的代码中似乎您尚未初始化中断以在设置或启用 CTRVF 状态时发生。 启用后、这将为您提供一种有用的方法来了解 CTROVF 状态是否已发生、您可以在此新的 ISR 中设置软件或硬件断点。 在该 ISR 内、您可以重新布防 eCAP 模块以复位计数器并继续捕捉。
抱歉、我正在尝试查看中断工作流程并尝试理解。 我现在有一些困惑。 我是否需要 初始化中断以 按照主函数(PIE 矢量表(PieVectTable.ECAP1_INT=&eCAP1_ISR;)、PIECTRL 寄存器(PieCtrlRegs.PIEIER4.bit.INTx1 = 1;)中的相同方式检查 CTROVF、然后是函数中断(中断 eCAP1_ISR (void)? 这就是 ECAP 的全部功能。 我是否需要对 CTROVF 执行同样的操作?
第二、我在这里针对断点做了一些观察。 请参阅下面的
如果您正确理解了代码、我已经启用了 CTROVF 的中断(ECap1Regs.ECEINT.all = 0x028;)。 下面您可以看到以下观察结果:
我使用断点进行了检查。 当我设定断点时、没有电源(eCAP1信号关闭)被提供、然后播放绿色按钮(调试)。 计数器(TSCTR)连续运行。 见图1
图1
几秒钟后、TSCTR 计数器突然在一个点停止(0x00017、某个时间为0x00018)、程序保持在图2:其中 ECFLG =0x0021 (见图2)
图2
然后、我逐步转到断点、直到执行 ream - ( ECap1Regs.ECCTL2.bit.rearm = 1; )、ECFLG 变为= 0x001、然后在重新 ARM 断点执行后、它返回到第一个断点以上( ECap1Regs.ECCLR.bit.INT = 1; )且 ECFLG 剧增等于0x001。 (第一个循环完成)。 请参阅图3
图3
然后第二个循环开始(断点在进一步按下 DEBUG 时再次开始)。
现在、在 CEVT3断点执行之后( ECap1Regs.ECCLR.bit.CEVT3 = 1; )、 ECFLG 变为0x000。 见图4
图4
然后、重新布防断点后、相同的图片1计数器会再次自动启动、并在 ECFLG = 0x0021相同的图片2处停止。 请记住、 电源仍处于关闭状态(无 eCAP1信号)
加电:当我为按钮加电时、ECFLG 变为= 0x001F、并且 在加电期间进一步逐步执行断点计数器 在每次阶跃(不是连续)断点执行时改变、 但 ECFLF 始终保持在= 0x001F。 (请参阅图5)
图5
代码附在此处:
请根据相关建议
此致
阿尔萨兰
我是否需要进行初始化以按主函数(PIE 矢量表(PieVectTable.ECAP1_INT=&eCAP1_ISR;)、PIECTRL 寄存器(PieCtrlRegs.PIEIER4.bit.INTx1 = eCAP1_ISR))中相同的方式检查 CTRF? 这就是 ECAP 的全部功能。 是否需要对 CTROVF 执行同样的操作?
没错。 您需要一个 ISR 用于 CTROVF 中断处理程序。
您所显示的标志可以很好地了解捕获期间所发生的事情。 前两张图片表示发生了捕获溢出状态、这意味着没有捕获信号。 在图3-4中、您已清除 OVF 标志、它将把 ECCFLG.CTROVF 中的位设置为0。 当您打开信号时、不再有溢出标志状态位、因为有一个信号被捕捉、而0x1F 表示已配置的边沿事件发生。 (即上升/下降沿捕捉)
此致!
马瑞安
您好、Ryan、
感谢您的回复。
请检查如何根据代码对您的建议进行处理。 我将在代码中添加这些行。 请检查下面的代码、并建议缺少用于 CTROVF 中断初始化的红色部件。
代码:>
#include "DSP2833x_Device.h"
*……
中断失效 CPU_timer0_ISR (void);
中断失效 eCAP1_ISR (void);
interrupt void CTROVF_ISR (void); //此文件中找到的函数的 prototype 语句
空 main (void)
{……
EALLOW;
PieVectTable.tINT0 = &CPU_timer0_ISR;
PieVectTable.ECAP1_INT =&eCAP1_ISR ;
PieVectTable……---------------- ... = &CTROVF_ISR;//请建议将哪个 PieVectTable 用于 CTROVF?????
EDIS;
...
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//启用 CPU 计时器0 INT
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;//在 PIE 组4中启用 ECAP1_INT
PieCtrlRegs.PIEIER…… ..bit.INTx..--- = 1;//在 PIE 组中启用 ECAP1_INT 4 //请用破折号填充此处的值
IER |=...... ---------------- .;//请在此处添加值
EINT;
ERTM;
...} //主端
void Setup_eCAP1 (void)
{.........
ECap1Regs.ECEINT.ALL = 0x028;//溢出中断被启用
.......}
中断失效 CTROVF_ISR (void);
//在该中断函数中添加两行 CTROVF_ISR
{
ECap1Regs.ECCLR.bit.CTRVF = 1;
ECap1Regs.ECCTL2.bit.rearm = 1;
}// CTRVF 中断结束
请进行相应更正。
谢谢
此致
阿尔萨兰
尊敬的 Arsalan:
抱歉、可能我误解了您要尝试实施的内容。 我认为您只想将 CTROVF 用作当前 ISR 的中断源。
相反、让我们保留该 ISR 中原始设置、该 ISR 在 CEVT3上触发、并启用 CTROVF。 所有您需要做的事情、因为我们已经将以下位更改为1。
// bit 15-8 0's: reserved // bit 7 0: CTR=CMP, 0 = compare interrupt disabled // bit 6 0: CTR=PRD, 0 = period interrupt disabled // bit 5 1: CTROVF, 0 = overflow interrupt disabled // bit 4 0: CEVT4, 0 = event 4 interrupt disabled // bit 3 1: CEVT3, 1 = event 3 interrupt enabled // bit 2 0: CEVT2, 0 = event 2 interrupt disabled // bit 1 0: CEVT1, 0 = event 1 interrupt disabled // bit 0 0: reserved
然后、在 ISR 中、如果 ISR 被 CTROVF 事件触发、我们可以检查 if 语句中的标志、如下所示、并重新启用捕获:
interrupt void eCAP1_isr(void) { ECap1Regs.ECCLR.bit.INT = 1; // Clear the ECAP1 interrupt flag ECap1Regs.ECCLR.bit.CEVT3 = 1; // Clear the CEVT3 flag if(ECap1Regs.ECFLG.bit.CTROVF == 1) // Inserted code here { // This will clear the over flow flag, then rearm for another capture ECap1Regs.ECCLR.bit.CTROVF = 1; ECap1Regs.ECCTL2.bit.REARM = 1; }else { // Calculate the PWM duty period (rising edge to falling edge) PWM_Duty = (int32)ECap1Regs.CAP2 - (int32)ECap1Regs.CAP1; // Calculate the PWM period (rising edge to rising edge) PWM_Period = (int32)ECap1Regs.CAP3 - (int32)ECap1Regs.CAP1; // ECap1Regs.ECCLR.bit.CTROVF = 1; ECap1Regs.ECCTL2.bit.REARM = 1; EPwm1Regs.TBPRD = TPWM; EPwm2Regs.TBPRD = TPWM; EPwm1Regs.CMPA.half.CMPA = ((int32)NEW_Duty); // 50% duty cycle first EPwm1Regs.CMPB = ((int32)NEW_Duty); EPwm2Regs.CMPA.half.CMPA = ((int32)NEW_Duty); // 50% duty cycle first EPwm2Regs.CMPB = ((int32)NEW_Duty); EPwm1Regs.TBCTL.bit.SYNCOSEL = 1; // generate a syncout if CTR = 0 EPwm2Regs.TBCTL.bit.PHSEN = 1; // enable phase shift for ePWM2 EPwm2Regs.TBCTL.bit.SYNCOSEL = 0; // syncin = syncout EPwm2Regs.TBPHS.half.TBPHS = TPWM; // 1/3 phase shift } PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // Must acknowledge the PIE group 4 }
仅当没有 CTRVF 状态时才执行 ELSE 语句。
此致!
mA
您好、Ryan、
感谢您的答复。 它现在似乎在工作。 我的测试期间没有发生溢出。
谢谢
此致
阿尔萨兰