Advertisement
Guest User

Untitled

a guest
Feb 16th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. const byte Encoder_C1 = 2;
  2. const byte Encoder_C2 = 8;
  3. byte Encoder_C1Last;
  4. int pulseNumber;
  5. boolean direction_m;
  6. //variaveis for PID
  7. unsigned long lastTime;
  8. double Input, Output, Setpoint;
  9. double errSum, lastErr;
  10. double kp, ki, kd;
  11. int SampleTime = 1000; //1 sec
  12. double outMin, outMax;
  13. //*******************************
  14. //Pinos de ligacao ponte H L298N
  15. #define pino_motor1 10
  16. #define pino_motor2 9
  17.  
  18. void setup()
  19. {
  20. Serial.begin(57600);
  21. SetOutputLimits(-255, 255);
  22. SetSampleTime(1);
  23. SetTunings(5, 0.5, 0.01);
  24. //Definicao pinos ponte H
  25. pinMode(pino_motor1, OUTPUT);
  26. pinMode(pino_motor2, OUTPUT);
  27. //Definicao do encoder
  28. pinMode(Encoder_C1, INPUT);
  29. pinMode(Encoder_C2, INPUT);
  30. attachInterrupt(0, encoder, CHANGE);
  31. }
  32.  
  33. void loop()
  34. {
  35. Serial.println(pulseNumber);
  36. Serial.println(Output);
  37.  
  38. if(Output > 0){
  39. analogWrite(pino_motor1, Output);
  40. analogWrite(pino_motor2, 0);
  41. }
  42. Compute();
  43. pulseNumber = 0;
  44. delay(100);
  45. }
  46.  
  47.  
  48. void encoder()
  49. {
  50. int Lstate = digitalRead(Encoder_C1);
  51. if(!Encoder_C1Last && Lstate){
  52. int val = digitalRead(Encoder_C2);
  53. if(!val && direction_m){
  54. direction_m = false;
  55. }
  56. else if(val && !direction_m){
  57. direction_m = true;
  58. }
  59.  
  60. }
  61.  
  62. Encoder_C1Last = Lstate;
  63. if(direction_m) pulseNumber++;
  64. else pulseNumber--;
  65. }
  66. void Compute()
  67. {
  68. unsigned long now = millis();
  69. int timeChange = (now - lastTime);
  70. if(timeChange>=SampleTime)
  71. {
  72. Setpoint = 25;
  73. Input = pulseNumber;
  74. double error = Setpoint - Input;
  75. errSum += error;
  76. double dErr = (error - lastErr);
  77.  
  78. /*Compute PID Output*/
  79. Output = kp * error + ki * errSum + kd * dErr;
  80.  
  81. /*Remember some variables for next time*/
  82. lastErr = error;
  83. lastTime = now;
  84. }
  85. }
  86.  
  87. void SetTunings(double Kp, double Ki, double Kd)
  88. {
  89. double SampleTimeInSec = ((double)SampleTime)/1000;
  90. kp = Kp;
  91. ki = Ki * SampleTimeInSec;
  92. kd = Kd / SampleTimeInSec;
  93. }
  94.  
  95. void SetSampleTime(int NewSampleTime)
  96. {
  97. if (NewSampleTime > 0)
  98. {
  99. double ratio = (double)NewSampleTime
  100. / (double)SampleTime;
  101. ki *= ratio;
  102. kd /= ratio;
  103. SampleTime = (unsigned long)NewSampleTime;
  104. }
  105. }
  106. void SetOutputLimits(double Min, double Max)
  107. {
  108. if(Min > Max) return;
  109. outMin = Min;
  110. outMax = Max;
  111. if(Output > outMax) Output = outMax;
  112. else if(Output < outMin) Output = outMin;
  113. if(errSum> outMax) errSum= outMax;
  114. else if(errSum < outMin) errSum= outMin;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement