Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Strange PWM/Motor Behavior! (http://www.chiefdelphi.com/forums/showthread.php?t=63967)

TerranCoder 13-02-2008 15:14

Strange PWM/Motor Behavior!
 
A bit of prologue background: we're working on rack-and-pinion steering for our robot. As such, I've (supposedly) changed the Default Code to the point where X-axis changes should only be sent to pwm13, the steering motor.

However, it seems that with either of the joysticks sent with the KOP, the x changes are for some reason sent to the drive motors as well as the steering motor and the Y-axis changes are sent to the steering motor as well as the drive motors.

Here's the PWM setup:

pwm16: Right drive motors
pwm15: Left drive motors
pwm13: Steering motor

Here's the steering code (so far, not sure if it works yet! :) )

Code:

  if (p1_x >= MAXI) {       
    XDelta = MAXI-Temp;
  }
  else if (p1_x <= MINI)
  {
    XDelta = MINI - Temp;
  }

  if (XDelta < 0 && XDelta < -4) {
    XDelta *= -1;
    for (i = 0; i<(XDelta/4); i++) {
                for (j = 0; j < 10; j++) {
                        pwm13 = 0;
                  }
                pwm13 = 127;
                MAXI -= 4;
                MINI -= 4;
    }
    Temp = p1_x;
  }
  else if (XDelta > 0 && XDelta > 4)
  {
        for (i = 0; i<(XDelta/4); i++) {

                for (j = 0; j<10; j++) {
                        pwm13 = 255;
                  }
                pwm13 = 127;
                MAXI += 4;
                MINI += 4;
    }
        Temp = p1_x;
  }

Temp, MAXI, and MINI are all global variables first initialized in User_Initialization(). XDelta is a local variable unused elsewhere.

Here is the drive motor code (such as it is) :

Code:

if (TempY > p1_y+15)
  {
    TempTemp = p1_y/2;
    pwm15 = Exponential_Grow(TempTemp,0);
    pwm16 = Exponential_Grow(TempTemp,0);
        TempY = p1_y/2;
  }
  else if (TempY < p1_y-15)
  {
    TempTemp = p1_y/2;
    pwm15 = Exponential_Grow(TempTemp,0);
    pwm16 = Exponential_Grow(TempTemp,0);
    TempY = p1_y/2;
  }
  else
  {
    pwm15 = Exponential_Grow(p1_y,0);
    pwm16 = Exponential_Grow(p1_y,0);
        TempY = p1_y;
  }

TempY is also a global variable initialized in User_Initialization(). TempTemp is a local variable not used anywhere else.

As far as I can tell, it's displaying behavior similar to that of the basic Default code and trying to do the two-wheeled turning using pwms 13-16.

Any help would be very, very appreciated!

Chaos in a Can 13-02-2008 15:46

Re: Strange PWM/Motor Behavior!
 
First, make sure the pwms are actually connected to the motors you think they are.

If you find the IFI dashboard application, you can connect your computer to the Dashboard port on the OI and look at the pwm outputs directly.

Next, I would suggest using "Find in Files" and searching for any other occurances of pwm13, pwm15, or pwm16.
Also I don't know what Exponential_Grow contains, but you could check there as well.


If all else fails, try temporarily replacing your drive code with something simpler and reintroducing parts of it until you find the problem. You could start with something as simple as this:
Code:

pwm13 = p1_x;
pwm15 = p1_y;
pwm16 = 255-p1_y;

It may also be a good idea to disconnect the motors and just watch the outputs using the dashboard until you find the problem.

TerranCoder 13-02-2008 16:35

Re: Strange PWM/Motor Behavior!
 
Find in Files returns only the initialization code (pwm* = 127) and any code that I personally have added, none of which affects two pwms at the same time.

Exponential_Grow takes a value and returns another value, no pwm code at all.

I'll give the Dashboard a try and see if that explains anything.

Is there any chance that the RC somehow isn't using the new code? The IFI Loader seems to work, but I'm not sure if there has been any actual change in behavior. I'm very positive that the compiled HEX file is the one I'm working on and not the Default.

The Lucas 13-02-2008 16:37

Re: Strange PWM/Motor Behavior!
 
are you still calling Default_Routine() ? It could just be overwriting anything you do.

TerranCoder 13-02-2008 16:57

Re: Strange PWM/Motor Behavior!
 
Yes, I am calling Default_Routine(), but all the code and changes I've talked about where made in there, so if it is working, there shouldn't be an issue with that.

billbo911 13-02-2008 17:40

Re: Strange PWM/Motor Behavior!
 
If you are calling Default_Routine(), look for this bit of code:

Code:

pwm13 = pwm14 = Limit_Mix(2000 + p1_y + p1_x - 127);
pwm15 = pwm16 = Limit_Mix(2000 + p1_y - p1_x + 127);

If it is still not commented out, that may be what is vexing you:yikes:

TerranCoder 13-02-2008 17:44

Re: Strange PWM/Motor Behavior!
 
Actually, those were the first two lines of code that I removed from the Default_Routine() code when I changed it. However, I did double check that to make sure and indeed, they are gone from my code.

In fact, I've removed the entire limit mix function.

billbo911 13-02-2008 17:49

Re: Strange PWM/Motor Behavior!
 
Does your system use interrupts, as in, are you using encoders to sample your wheel revolutions?
If so, PWM's 13-15 can get really squirly!
If that is the case, look into Kevin Watson's PWM replacement code. It uses the CCP hardware and no interrupts will bother it.

TerranCoder 13-02-2008 17:53

Re: Strange PWM/Motor Behavior!
 
No interrupts, but I believe I am already using Kevin's code. And that's another strange thing. One would think that the behavior of the robot would change with the change of pwm code, and yet I didn't notice any visible difference.


All times are GMT -5. The time now is 00:57.

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