View Single Post
  #1   Spotlight this post!  
Unread 19-01-2008, 13:48
Nathans Nathans is offline
Registered User
AKA: Nathan
FRC #0004 (Element)
Team Role: Programmer
 
Join Date: Jan 2007
Rookie Year: 2006
Location: Los Angeles
Posts: 17
Nathans is an unknown quantity at this point
Send a message via AIM to Nathans
My error derivative is going crazy

I'm trying to get PID control for the gyro working, and so far P is working fine. The D, however, is going to unreasonable values because my angle_err_last variable doesn't work at all. Here's my teleop.c function, sans gyro bias calc and printfs. I'm using the new code with C18 3.10.

Code:
void Teleop(void)
{
	#define KP 20/100;
	#define KD 0/10

	static unsigned int i = 0;
	static unsigned int j = 0;
	int temp_gyro_rate;
	long temp_gyro_angle;
	int temp_gyro_bias;
	long angle_err;
	long angle_err_last;
	long angle_err_d;
	long heading = 1800;
	long turn;

	i++;
	j++; // this will rollover every ~1000 seconds

             ...

		temp_gyro_bias = Get_Gyro_Bias();
		temp_gyro_rate = Get_Gyro_Rate();
		temp_gyro_angle = Get_Gyro_Angle();

	if(j >= 120)
	{
		temp_gyro_angle = gyro_cycle(temp_gyro_angle);
		angle_err = (heading - abs(temp_gyro_angle));

		angle_err_d = (angle_err - angle_err_last);

		

		turn = angle_err * KP + angle_err_d * KD;

		motor_left = limit(127 + turn);
		motor_right = limit(127 + turn);

	}


             ...


	angle_err_last = angle_err;

	Update_OI_LEDs();	// located in ifi_code.c
}
The P correction doesn't know left from right at the moment, but I'm not worried about that at the moment.

I set all of the variables as long to avoid type mismatches. The angle_err_last variable jumps all over the place, never coinciding with what angle_err actually was. Anyone know why?

edit: I commented out everything touching angle_err_last except for the declaration, and it still went all over the place.

Last edited by Nathans : 19-01-2008 at 13:54.