View Single Post
  #2   Spotlight this post!  
Unread 29-02-2008, 20:18
Joe Ross's Avatar Unsung FIRST Hero
Joe Ross Joe Ross is offline
Registered User
FRC #0330 (Beachbots)
Team Role: Engineer
 
Join Date: Jun 2001
Rookie Year: 1997
Location: Los Angeles, CA
Posts: 8,586
Joe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond reputeJoe Ross has a reputation beyond repute
Re: Get_Gyro_Angle() overflows beyond about -20000 deci-decgrees?

Quote:
Originally Posted by gnormhurst View Post
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....

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\r\n", (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.)

Code:
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.

Last edited by Joe Ross : 29-02-2008 at 20:21.