Other Parts Discussed in Thread: C2000WARE, SYSCONFIG
Thread 中讨论的其他器件:C2000WARE、 SysConfig
我需要使用 F2800157 测量来自 ABZ+PWM 编码器的外部 PWM 信号的占空比。 系统时钟频率为 120MHz。 我使用 GPIO22 作为 eCAP 模块的输入、并确认外部 PWM 信号正确到达该引脚。
我按如下所示配置了 eCAP 模块。 但是、问题在于 ISR 仅触发一次、并且onTimeCount该变量在该单次触发期间保持意外的大值。 您能帮助我解决此问题吗?
无效 initECAP1 (void)
{
//将 GPIO5 配置为 ECAP1 输入
eCAP_SELECTECAPInput (ECAP1_BASE、eCAP_INPUT_GPIO22);
//禁用时间戳计数器
eCAP_disableTimeStampCapture (ECAP1_BASE);
//将 eCAP 配置为捕获模式
ECAP_STOPCounter (ECAP1_BASE);
ECAP_enableCaptureMode (ECAP1_BASE);
//首先在上升沿捕捉、然后在下降沿捕捉
eCAP_setEventPolarity (ECAP1_BASE、eCAP_EVENT_1、eCAP_Evnt_rising edge);
eCAP_setEventPolarity (ECAP1_BASE、eCAP_EVENT_2、eCAP_Evnt_falling_edge);
//事件 2 重置计数器(以便我们可以测量高脉冲宽度)
eCAP_enableCounterResetOnEvent (ECAP1_BASE、eCA_EVENT_2);
//除以 1(无预分频器)
ECAP_setEventPrescaler (ECAP1_BASE、0);
//捕获事件后停止 2.
eCAP_setCaptureMode (ECAP1_BASE、eCAP_CONTINUAL_CAPTURE_MODE、eCAP_EVENT_2);
//如果需要启用同步输入(可选)
eCAP_disableLoadCounter (ECAP1_BASE);
//清除挂起的中断
eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_ALL);
eCAP_clearGlobalInterrupt (ECAP1_BASE);
//为事件 2 启用中断
eCAP_enableInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_2);
//启用计数器和时间戳捕获
eCAP_enableTimeStampCapture (ECAP1_BASE);
eCAP_startCounter (ECAP1_BASE);
//第一个捕获
ECAP_REARM (ECAP1_BASE);
}
// eCAP ISR
__中断 void ecap1ISR (void)
{
uint32_t cap1、CAP2;
//清除中断标志
eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_2);
eCAP_clearGlobalInterrupt (ECAP1_BASE);
//读取捕获的值
CAP1 = eCAP_getEventTimeStamp (ECAP1_BASE、eCAP_EVENT_1);
CAP2 = eCAP_getEventTimeStamp (ECAP1_BASE、eCAP_EVENT_2);
//准时计算(假设 Event1 =上升、Event2 =下降)
onTimeCount = CAP2 - cap1;
captureDone = true;
// Re - ARM 进行下一次捕获
ECAP_REARM (ECAP1_BASE);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group4);
}