Only one side moves!?!?

Hey all,

I’ve been having trouble with this PID code. I made some change to the code in the past but I haven’t noticed that only one side does the correction since a few days ago.

I’ve tried to debug and all of that good stuff, but I haven’t been able to get my finger on the cause of the problem. Here’s the code!


	if (currentX == 127)
	{
		// printf("CurrentX: %d Gyro Angle: %d
", currentX, cur_heading);
		temp_currentY = (currentY - 127 + error);
		printf("temp_currentY 1: %d
", temp_currentY);
		temp_currentY = ((temp_currentY * 0.59) );
		printf("temp_currentY 2: %d
", temp_currentY);
		temp_currentY = (127L + temp_currentY);
		printf("temp_currentY 3: %d

", temp_currentY);
		temp_currentY =	Limit_Mix(2000 + temp_currentY);
	
		temp_currentX = (currentX - 127 - error);
		printf("temp_currentY 1: %d
", temp_currentX);
		temp_currentX = ((temp_currentX * 0.59) );
		printf("temp_currentY 2: %d
", temp_currentX);
		temp_currentX = (127 + temp_currentX);
		printf("temp_currentX 3: %d

", temp_currentX);
		temp_currentX = (254L - temp_currentX);
		temp_currentX =	Limit_Mix(2000 + temp_currentX);
	
			pwm_rightDrive_cim = pwm_rightDrive_fp = Limit_Mix(2000 + temp_currentX + temp_currentY - 127);
			pwm_leftDrive_cim = pwm_leftDrive_fp = Limit_Mix(2000 + temp_currentX - temp_currentY + 127);
	
		if(currentY == 127)
		{
			pwm_rightDrive_cim = pwm_rightDrive_fp = Limit_Mix(2000 + currentX + currentY - 127);
			pwm_leftDrive_cim = pwm_leftDrive_fp = Limit_Mix(2000 + currentX - currentY + 127);
			Reset_Gyro_Angle();
		}
		else
		{

			pwm_rightDrive_cim = pwm_rightDrive_fp = Limit_Mix(2000 + temp_currentX + temp_currentY - 127);
			pwm_leftDrive_cim = pwm_leftDrive_fp = Limit_Mix(2000 + temp_currentX - temp_currentY + 127);

		}
	}
	else if((ratechange < 10 && ratechange > -10) && (currentX == 127))
	{	 
	
	
		 pwm_rightDrive_cim = pwm_rightDrive_fp = Limit_Mix(2000 + currentX + currentY - 127);
		 pwm_leftDrive_cim = pwm_leftDrive_fp = Limit_Mix(2000 + currentX - currentY + 127);
	
		Reset_Gyro_Angle();
	}
	else
	{	 
		 pwm_rightDrive_cim = pwm_rightDrive_fp = Limit_Mix(2000 + currentX + currentY - 127);
		 pwm_leftDrive_cim = pwm_leftDrive_fp = Limit_Mix(2000 + currentX - currentY + 127);
	
		Reset_Gyro_Angle();
	}

Any suggestions? Thanks! :]

What kind of variables are temp_currentX and temp_currentY? If they’re char or int, that multiply by 0.59 is going to round down to 0, which can cause unexpected results.

They are just normal int’s. I tried sticking 0.59 as a floating point value by putting an F at the end, but that still didn’t work. I’ll give it a try tomorrow afternoon. Thanks Matt!

Floating point calculations on the MCC18 are always a little sketchy. Also, true PID calculations take more processing power than it has. If you really want to implement PID I’d suggest looking at a co-processor. If you’re interested, our team used one last year, and we’re in the process of writing a guide for how other teams can create their own.

Check out the beginnings of our guide on our website. We’re in the process of writing the guide right now, by the end of the month it should be complete so check back often.

Even so, integers could still make for flaky numbers. My recommendation is multiply it by 59, then divide by 100, fundamentally it’s still the same, but that operation is much faster, and more supported by the processor, with minimal (and predictable) data loss in the form of rounding error.

Ahh… So that was the problem! Since the temp_currentX and temp_currentY were defined as “int”, the system only had temp_currentX with the correction going on one side. That seemed to fix it. Thanks everyone!