View Single Post
  #2   Spotlight this post!  
Unread 05-01-2014, 15:08
FTC4211's Avatar
FTC4211 FTC4211 is offline
Registered User
AKA: John Stegeman
FTC #4211 (The Bombers)
Team Role: Programmer
 
Join Date: Jan 2014
Rookie Year: 2010
Location: Missouri
Posts: 11
FTC4211 is an unknown quantity at this point
Re: [FTC]: One Encoder Works; The Other Ones Does Not

Hello,

Here is the code that we use for moving motors to a position. We have had problems non-stop with the built in RobotC nMotorEncoderTarget function so we wrote our own.

Here it is written to do what your code was supposed to do:
Code:
#pragma config(Hubs,  S1, HTMotor,  none,     none,     none)
#pragma config(Sensor, S1,     ,               sensorI2CMuxController)
#pragma config(Motor,  mtr_S1_C1_1,     motorD,        tmotorTetrix, PIDControl, encoder)
#pragma config(Motor,  mtr_S1_C1_2,     motorE,        tmotorTetrix, PIDControl, reversed, encoder)
//*!!Code automatically generated by 'ROBOTC' configuration wizard  

typedef enum
{
Quintic = 5, // good for very light loads with no backlash/gears: very fast Cubic = 3, // good for light loads with minimal backlash in the gears: faster near its target but can overshoot the target Linear = 1, // good for most loads on motors: good average, try starting with this one CubeRoot = (1/3), // good for heavy loads with backlash in the gears: slow near its target QuinticRoot = (1/5) // good for very heavy loads with lots of backlash in the gears: slow near its target
}tMotorPowerCurve; // motor power curve applications: test to find the best for your application int trim(int num, int min, int max) // clips @param 'num' to be within within min/max values { return (num>max) ? max : (num<min) ? min : num; } int targetLocationToMotorPower(tMotor nMotor, int targetPos, short deadband, float speedMultiplier, short minPower, short maxPower, tMotorPowerCurve powerCurve=Linear) {
int iPower; if (abs(nMotorEncoder[nMotor]-targetPos)<deadband) { iPower=0; } else { iPower = pow((-(nMotorEncoder[nMotor]-targetPos)),(float)powerCurve)*(float)speedMultiplier; } return trim(iPower, minPower, maxPower);
} bool moveMotorToPosition(tMotor nMotor, int targetPos, short deadband=20, float speedMultiplier=1.0, short minPower=-50, short maxPower=50, tMotorPowerCurve powerCurve=Linear) // return true if at target {
int power = targetLocationToMotorPower(targetPos, nMotor, deadband, speedMultiplier,minPower,maxPower,powerCurve); motor[nMotor]= power; return power == 0; // if power = 0 then at target
} task main() {
nMotorEncoder[motorD]=0; nMotorEncoder[motorE]=0; while (!moveMotorToPosition(motorD, 720)||!moveMotorToPosition(motorE, 720)) { } wait1Msec(3000);
}

We have different power curves for the target to motor power function because we found that depending on load and backlash in certain applications a single power curve could cause oscillations. We have used this method for controlling everything from arms to our drive base with great success.

Play around with this code and see what settings work the best.

Best of luck,
Team 4211
Reply With Quote