Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Only one side moves!?!? (http://www.chiefdelphi.com/forums/showthread.php?t=49835)

kiettyyyy 06-11-2006 01:15

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!

Code:

        if (currentX == 127)
        {
                // printf("CurrentX: %d Gyro Angle: %d\r\n", currentX, cur_heading);
                temp_currentY = (currentY - 127 + error);
                printf("temp_currentY 1: %d\r\n", temp_currentY);
                temp_currentY = ((temp_currentY * 0.59) );
                printf("temp_currentY 2: %d\r\n", temp_currentY);
                temp_currentY = (127L + temp_currentY);
                printf("temp_currentY 3: %d\r\n\r\n", temp_currentY);
                temp_currentY =        Limit_Mix(2000 + temp_currentY);
       
                temp_currentX = (currentX - 127 - error);
                printf("temp_currentY 1: %d\r\n", temp_currentX);
                temp_currentX = ((temp_currentX * 0.59) );
                printf("temp_currentY 2: %d\r\n", temp_currentX);
                temp_currentX = (127 + temp_currentX);
                printf("temp_currentX 3: %d\r\n\r\n", 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! :]

Matt Krass 06-11-2006 11:15

Re: Only one side moves!?!?
 
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.

kiettyyyy 07-11-2006 02:07

Re: Only one side moves!?!?
 
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!

psquared89 07-11-2006 12:32

Re: Only one side moves!?!?
 
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.

Matt Krass 07-11-2006 13:25

Re: Only one side moves!?!?
 
Quote:

Originally Posted by kiettyyyy
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!


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.

kiettyyyy 11-11-2006 14:51

Re: Only one side moves!?!?
 
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!


All times are GMT -5. The time now is 01:29.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi