工具/软件:
您好、
我有自行车踏频传感器、它每转一圈产生 48 个中断(圆盘上有 48 个磁体)、我想每 转触发 48 个中断、请参阅下面的我修改了 eCAP_ex2_capture_pwm 示例、我可以计算脉冲宽度和周期、但每转仅触发 24 个中断、因为中断仅发生在事件 4 上
eCAP_clearInterrupt (ECAP1_BASE、eCAP_ISR_SOURCE_CAPTURE_EVENT_4);
如何在每个上升沿(每转 48 次触发)触发中断 、同时捕获 4 个事件以进行占空比和脉冲宽度计算
void initeCAP(void)
{
XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT7, 17);
// Disable ,clear all capture flags and interrupts
ECAP_disableInterrupt(ECAP1_BASE,
(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
ECAP_ISR_SOURCE_COUNTER_COMPARE));
ECAP_clearInterrupt(ECAP1_BASE,
(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
ECAP_ISR_SOURCE_COUNTER_COMPARE));
// Disables time stamp capture.
ECAP_disableTimeStampCapture(ECAP1_BASE);
// Stops Time stamp counter.
ECAP_stopCounter(ECAP1_BASE);
// Sets eCAP in Capture mode.
ECAP_enableCaptureMode(ECAP1_BASE);
// Sets the capture mode.
ECAP_setCaptureMode(ECAP1_BASE,ECAP_ONE_SHOT_CAPTURE_MODE,ECAP_EVENT_4);
// Sets the Capture event prescaler.
ECAP_setEventPrescaler(ECAP1_BASE, 0U);
ECAP_setEventPolarity(ECAP1_BASE,ECAP_EVENT_1,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(ECAP1_BASE,ECAP_EVENT_2,ECAP_EVNT_FALLING_EDGE);
ECAP_setEventPolarity(ECAP1_BASE,ECAP_EVENT_3,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(ECAP1_BASE,ECAP_EVENT_4,ECAP_EVNT_FALLING_EDGE);
// Configure counter reset on events
ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_1);
ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_2);
ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_3);
ECAP_enableCounterResetOnEvent(ECAP1_BASE,ECAP_EVENT_4);
// Select eCAP input.
ECAP_selectECAPInput(ECAP1_BASE, ECAP_INPUT_INPUTXBAR7);
// Sets a phase shift value count.
ECAP_setPhaseShiftCount(ECAP1_BASE, 0U);
// Enable counter loading with phase shift value.
ECAP_enableLoadCounter(ECAP1_BASE);
// Configures Sync out signal mode.
ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_SYNCI);
// Configures emulation mode.
ECAP_setEmulationMode(ECAP1_BASE,ECAP_EMULATION_STOP);
// Set up the source for sync-in pulse..
ECAP_setSyncInPulseSource(ECAP1_BASE,ECAP_SYNC_IN_PULSE_SRC_DISABLE);
// Starts Time stamp counter for myECAP0.
ECAP_startCounter(ECAP1_BASE);
// Enables time stamp capture for myECAP0.
ECAP_enableTimeStampCapture(ECAP1_BASE);
// Re-arms the eCAP module for myECAP0.
ECAP_reArm(ECAP1_BASE);
// Enables interrupt source for myECAP0.
//
ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
Interrupt_register(INT_ECAP1, &CadenceISR);
Interrupt_enable(INT_ECAP1);
return;
}
__interrupt void CadenceISR(void)
{
MOTOR_Vars_t *obj = (MOTOR_Vars_t *)motorHandle_M1;
obj->cmdPot.cap1Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);
obj->cmdPot.cap2Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
obj->cmdPot.cap3Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
obj->cmdPot.cap4Count = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);
// Calculate pulse width (time high)
if (obj->cmdPot.cap3Count > obj->cmdPot.cap2Count)
{
obj->cmdPot.pulseWidth = obj->cmdPot.cap3Count - obj->cmdPot.cap2Count;
obj->cmdPot.pulseWidthBigger++;
}
else if (obj->cmdPot.cap3Count < obj->cmdPot.cap2Count)
{
obj->cmdPot.pulseWidth = obj->cmdPot.cap2Count - obj->cmdPot.cap3Count;
obj->cmdPot.pulseWidthSmaller++;
}
if (obj->cmdPot.cap4Count > obj->cmdPot.cap2Count)
{
obj->cmdPot.periodCycles = obj->cmdPot.cap4Count - obj->cmdPot.cap2Count;
obj->cmdPot.periodBigger++;
}
else if (obj->cmdPot.cap4Count < obj->cmdPot.cap2Count)
{
obj->cmdPot.periodCycles = obj->cmdPot.cap2Count - obj->cmdPot.cap4Count;
obj->cmdPot.periodSmaller++;
}
if (obj->cmdPot.periodCycles > 0)
{
obj->cmdPot.plusecounter++;
obj->cmdPot.periodSec = (float)obj->cmdPot.periodCycles / 20000000.0f; // Convert to seconds
obj->cmdPot.revTimeSec = obj->cmdPot.periodSec * 48.0f; // Time for one revolution (48 pulses)
if (obj->cmdPot.revTimeSec > 0.0f)
{
obj->cmdPot.cadenceRPM = 60.0f / obj->cmdPot.revTimeSec; // RPM = 60 / time per revolution (seconds)
}
}
ECAP_clearInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
ECAP_clearGlobalInterrupt(ECAP1_BASE);
ECAP_reArm(ECAP1_BASE);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);
return;
}
Danny