Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.25 KB | None | 0 0
  1. #pragma config(I2C_Usage, I2C1, i2cSensors)
  2. #pragma config(Sensor, in2,    rightside,      sensorNone)
  3. #pragma config(Sensor, I2C_1,  ,               sensorQuadEncoderOnI2CPort,    , AutoAssign )
  4. #pragma config(Sensor, I2C_2,  ,               sensorQuadEncoderOnI2CPort,    , AutoAssign )
  5. #pragma config(Motor,  port1,           intake,        tmotorVex393TurboSpeed_HBridge, openLoop)
  6. #pragma config(Motor,  port2,           RightBase2,    tmotorVex393TurboSpeed_MC29, openLoop, driveRight, encoderPort, I2C_1)
  7. #pragma config(Motor,  port3,           Arm,           tmotorVex393TurboSpeed_MC29, openLoop, reversed)
  8. #pragma config(Motor,  port4,           RightBase,     tmotorVex393TurboSpeed_MC29, openLoop, reversed, driveRight, encoderPort, I2C_1)
  9. #pragma config(Motor,  port5,           RightBase1,    tmotorVex393TurboSpeed_MC29, openLoop, driveRight, encoderPort, I2C_1)
  10. #pragma config(Motor,  port6,           LeftBase,      tmotorVex393TurboSpeed_MC29, openLoop, reversed, driveLeft, encoderPort, I2C_2)
  11. #pragma config(Motor,  port7,           LeftBase1,     tmotorVex393TurboSpeed_MC29, openLoop, reversed, driveLeft, encoderPort, I2C_2)
  12. #pragma config(Motor,  port8,           Arm,           tmotorVex393TurboSpeed_MC29, openLoop, reversed)
  13. #pragma config(Motor,  port9,           LeftBase2,     tmotorVex393TurboSpeed_MC29, openLoop, reversed, driveLeft, encoderPort, I2C_2)
  14. #pragma config(Motor,  port10,          intake,        tmotorVex393TurboSpeed_HBridge, openLoop)
  15. //*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//
  16.  
  17. #pragma DebuggerWindows("Globals")
  18. #pragma DebuggerWindows("Motors")
  19.  
  20. #pragma platform(VEX)
  21.  
  22. void moveBase (int speed)
  23. {
  24.     motor[LeftBase] = speed;
  25.     motor[RightBase1] = speed;
  26.     motor[RightBase2] = speed;
  27.     motor[LeftBase1] = speed;
  28.     motor[LeftBase2] = speed;
  29.     motor[RightBase] = speed;
  30. }
  31.  
  32. void turnBase (int speed) // positive is clockwise
  33. {
  34.     motor[LeftBase] = speed;
  35.     motor[RightBase] = -speed;
  36. }
  37.  
  38.  
  39. int inchToTicks (float inch)
  40. {
  41.     int ticks;
  42.     ticks = inch*99.82198;
  43.     return ticks;
  44. }
  45.  
  46. int fixTimerValue (float rawSeconds)
  47. {
  48.     int miliseconds;
  49.     miliseconds = rawSeconds*1000;
  50.     if (miliseconds < 250)
  51.     {
  52.         miliseconds = 250;
  53.     }
  54.     return miliseconds;
  55. }
  56.  
  57. void PIDBaseControl (float target, float waitTime, float maxPower = 1)
  58. {
  59.     float Kp = 0.1;
  60.     float Ki = 0.04;
  61.     float Kd = 0.4;
  62.  
  63.     int error;
  64.  
  65.     float proportion;
  66.     int integralRaw;
  67.     float integral;
  68.     int lastError;
  69.     int derivative;
  70.  
  71.     float integralActiveZone = inchToTicks(3);
  72.     float integralPowerLimit = 50/Ki;
  73.  
  74.     int finalPower;
  75.  
  76.     bool timerBool = true;
  77.  
  78.     nMotorEncoder[LeftBase] = 0;
  79.     nMotorEncoder[RightBase] = 0;
  80.  
  81.     clearTimer(T1);
  82.  
  83.     while (time1[T1] < fixTimerValue(waitTime))
  84.     {
  85.         error = inchToTicks(target)-(nMotorEncoder[LeftBase]+nMotorEncoder[RightBase]);
  86.  
  87.         proportion = Kp*error;
  88.  
  89.         if (abs(error) < integralActiveZone && error != 0)
  90.         {
  91.             integralRaw = integralRaw+error;
  92.         }
  93.         else
  94.         {
  95.             integralRaw = 0;
  96.         }
  97.  
  98.         if (integralRaw > integralPowerLimit)
  99.         {
  100.             integralRaw = integralPowerLimit;
  101.         }
  102.         if (integralRaw < -integralPowerLimit)
  103.         {
  104.             integralRaw = -integralPowerLimit;
  105.         }
  106.  
  107.         integral = Ki*integralRaw;
  108.  
  109.         derivative = Kd*(error-lastError);
  110.         lastError = error;
  111.  
  112.         if (error == 0)
  113.         {
  114.             derivative = 0;
  115.         }
  116.  
  117.         finalPower = proportion+integral+derivative;
  118.  
  119.         if (finalPower > maxPower*127)
  120.         {
  121.             finalPower = maxPower*127;
  122.         }
  123.         else if (finalPower < -maxPower*127)
  124.         {
  125.             finalPower = -maxPower*127;
  126.         }
  127.  
  128.         moveBase(finalPower);
  129.  
  130.         wait1Msec(40);
  131.  
  132.         if (error < 30)
  133.         {
  134.             timerBool = false;
  135.         }
  136.  
  137.         if (timerBool)
  138.         {
  139.             clearTimer(T1);
  140.         }
  141.     }
  142.     moveBase(0);
  143. }
  144.  
  145. void PIDBaseTurn (int target, float waitTime, float maxPower = 1)
  146. {
  147.     float Kp = 0.2;
  148.     float Ki = 0.05;
  149.     float Kd = 0.5;
  150.  
  151.     int error;
  152.  
  153.     float proportion;
  154.     int integralRaw;
  155.     float integral;
  156.     int lastError;
  157.     int derivative;
  158.  
  159.     float integralActiveZone = inchToTicks(3);
  160.     float integralPowerLimit = 50/Ki;
  161.  
  162.     int finalPower;
  163.  
  164.     bool timerBool = true;
  165.  
  166.     nMotorEncoder[LeftBase] = 0;
  167.     nMotorEncoder[RightBase] = 0;
  168.  
  169.     clearTimer(T1);
  170.  
  171.     while (time1[T1] < fixTimerValue(waitTime))
  172.     {
  173.         error = target-(nMotorEncoder[LeftBase]-nMotorEncoder[RightBase]);
  174.  
  175.         proportion = Kp*error;
  176.  
  177.         if (abs(error) < integralActiveZone && error != 0)
  178.         {
  179.             integralRaw = integralRaw+error;
  180.         }
  181.         else
  182.         {
  183.             integralRaw = 0;
  184.         }
  185.  
  186.         if (integralRaw > integralPowerLimit)
  187.         {
  188.             integralRaw = integralPowerLimit;
  189.         }
  190.         if (integralRaw < -integralPowerLimit)
  191.         {
  192.             integralRaw = -integralPowerLimit;
  193.         }
  194.  
  195.         integral = Ki*integralRaw;
  196.  
  197.         derivative = Kd*(error-lastError);
  198.         lastError = error;
  199.  
  200.         if (error == 0)
  201.         {
  202.             derivative = 0;
  203.         }
  204.  
  205.         finalPower = proportion+integral+derivative;
  206.  
  207.         if (finalPower > maxPower*127)
  208.         {
  209.             finalPower = maxPower*127;
  210.         }
  211.         else if (finalPower < -maxPower*127)
  212.         {
  213.             finalPower = -maxPower*127;
  214.         }
  215.  
  216.         turnBase(finalPower);
  217.  
  218.         wait1Msec(40);
  219.  
  220.         if (error < 30)
  221.         {
  222.             timerBool = false;
  223.         }
  224.  
  225.         if (timerBool)
  226.         {
  227.             clearTimer(T1);
  228.         }
  229.     }
  230.     turnBase(0);
  231. }
  232.  
  233. task main ()
  234. {
  235.     PIDBaseControl(3,1); // move forward 39 inches with 1 sec delay;
  236.     PIDBaseControl(0,10);
  237.    
  238.     //close claw
  239.    
  240.  
  241.     while(true)
  242.     {
  243.         wait1Msec(20);
  244.     }
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement