AnsweredAssumed Answered

# Measurement Glitches for Minimum measurements

Question asked by Guest on Jun 30, 2010
Latest reply on Jul 1, 2010 by Daniel Lundin

Hello there,

I am using Softec's SK-S12XDP512A EVB for my programming in Codewarrior.

There is this problem of glitch in the real-time values for the wheelspeed and engine rpm measurement.

I have

• enabled ECT for 2 input capture channels on rising edges,; prescalr factor=2
• Timer channel period is 0.1 microseconds(PLL CLK = 20 MHz)
• Timer overflow is 6.5536ms

channel one has been set for the wheel_speed calculation and channel two for Rpm calculation

The overflow ISR has a time out count for minimum wheel_s[peed and Rpm. The signal input is fed from a function generator .I have compiled and ran the code but there is a glitch in the values of RPM and Wheel_speed for their respective minimum measurements.. This peice of code is shown below...

//in main function//

Gear_Ratio = (inputs.N*10)/inputs.D;
Circum     = (3141*(long)inputs.dia)/1000;
ECT_COUNT1 = (Circum*3600*Gear_Ratio)/(inputs.min_whlspd*inputs.Whlspd_ppr*65535);
ECT_COUNT2 = (10000000*60)/(inputs.min_rpm*inputs.E_ppr*65536);

WRPM       = (frequency1*Gear_Ratio*6)/inputs.Whlspd_ppr;
Whl_Spd    = (WRPM*Circum*6)/10000;
ERPM       = (frequency2*60)/inputs.E_ppr;

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 9 void ISR_TIMCH1(void)
{
if((TFLG2_TOF)&&(TC1<TCNT))              /*checks Timer overflow ISR pending */
{
count1++;
Corr1=1;
}
else
{
Corr1=0;
}

new_count1 = TC1;
over_flow1 = count1;
period1    = (new_count1+((long)over_flow1*0xFFFF)-old_count1);
old_count1 = new_count1;
count1     = 0;
frequency1 = 1000000000/period1;
TFLG1      = 0x02;

}
#pragma CODE_SEG DEFAULT

//////////////////////////////
Timer Channel 2 ISR

//////////////////////////////

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 10 void ISR_TIMCH2(void)
{
if((TFLG2_TOF)&&(TC2<TCNT))
{
count2++;
Corr2=1;
}
else
{
Corr2=0;
}
new_count2 = TC2;
over_flow2 = count2;
period2    = (new_count2+((long)over_flow2*0xFFFF)-old_count2);
old_count2 = new_count2;
count2     = 0;
frequency2 = 100000000/period2;
TFLG1      = 0x04;

}
#pragma CODE_SEG DEFAULT

/////////////////////////////////
Timer Overflow ISR

////////////////////////////////

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 16 void ISR_TIMOVF(void)
{

TFLG2_TOF = 1;
count1+=1-Corr1;
Corr1 =0;
if(count1>ECT_COUNT1)
{
count1=0;
frequency1=0;
}

count2+= 1-Corr2;
Corr2 =0;
if(count2>ECT_COUNT2)
{
count2=0;
frequency2=0;
ERPM      =0;
}
}

#pragma CODE_SEG DEFAULT

would appreciate for a solution...