I’m trying to make an approximate lap counter by dividing the accumulated gyro angle by 360 (or 3600, since I’m working in decidegrees).
It works up to 5 laps, then the gyro value seems to wrap around to the positive side and start decreasing. I’m using long ints for the calculations. Here is a simplified version of the code…
long int gyroAngle;
unsigned int numLaps = 0;
gyroAngle = Get_Gyro_Angle();
if ( gyroAngle < 0L ) gyroAngle = -gyroAngle; //absolute value.
numLaps = (unsigned int) ( (gyroAngle) / (long int)3600);
printf( "gyro: %5ld LAPS = %2d
", (gyroAngle), (int)numLaps );
// etc.....
I looked at the gyro.c code briefly. Get_Gyro_Angle() (below) returns a long int, but there’s a bunch of #defined constants, not all of which sport the decorative “L” at the end. (BTW, does “L” make a literal into a short int (16) or a long int (32)? I checked the compiler manual and didn’t see it defined.)
long Get_Gyro_Angle(void)
{
// Return the calculated gyro angle to the caller.
return(((gyro_angle * GYRO_SENSITIVITY * 5L) / (ADC_RANGE * ADC_UPDATE_RATE)) * GYRO_CAL_FACTOR);
}
Why can’t I get big values out of Get_Gyro_Angle()? e.g. 6 laps = 6 * -3600 = -21600.
gyro_angle * GYRO_SENSITIVITY * 5L is overflowing a long. Kevin’s latest gyro code gives a little more headroom by rearranging the order operations are done to not overflow as early.
I’ve seen the gyro.c,h code in the new 3.0 compatible code. I am using 2.4. Can I just drop the gyro.c,h files into my code and expect everything to be fine? Or are there 3.0/2.4 issues?