Advertisement
ivosexa

PID

Mar 12th, 2015
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4.  
  5. //Map Sensor Number to ADC Channel
  6. #define SENSOR1 0
  7. #define SENSOR2 1
  8. #define SENSOR3 2
  9. #define SENSOR4 3
  10. #define SENSOR5 4
  11.  
  12.  
  13. float pGain = 100; //Proportional Gain
  14. float iGain = 0.1; //Integral Gain
  15. float dGain = 60; //Differential Gain
  16.  
  17.  
  18. int eInteg = 0; //Integral accumulator
  19. int ePrev =0; //Previous Error
  20.  
  21.  
  22.  
  23. float ReadSensors();
  24. float PID(float current_value);
  25.  
  26.  
  27. float control;
  28. float s;
  29.  
  30. int main(void)
  31. {
  32. MotorInit();
  33.  
  34. InitADC();
  35.  
  36.  
  37. while(1)
  38. {
  39.  
  40. float sprev;
  41.  
  42.  
  43. s=ReadSensors();
  44.  
  45. if(s==0xFF)
  46. {
  47. s=sprev;
  48. }
  49.  
  50.  
  51.  
  52. control = PID(s);
  53.  
  54.  
  55. if(control > 255)
  56. {control = 255;}
  57. if(control < -255)
  58. {control = -255;}
  59.  
  60. if(control > 0.0)// rovera e ot dqsnata strana na liniqta
  61. {
  62.  
  63. Move((255-control) ,255); // zaviva na lqvo
  64.  
  65.  
  66. }
  67. if(control <= 0.0)// rovera e ot lqvata strana na liniqta
  68. {
  69.  
  70. MotorB(255, (255-control));
  71.  
  72. }
  73.  
  74.  
  75. delay_ms(10)
  76.  
  77. sprev=s;
  78. }
  79. }
  80.  
  81.  
  82.  
  83.  
  84. float PID(float current_value)
  85. {
  86. float pid;
  87. float error;
  88.  
  89. error = current_value;
  90. pid = (pGain * error) + (iGain * eInteg) + (dGain * (error - ePrev));
  91.  
  92. eInteg += error;
  93. ePrev = error;
  94. return pid;
  95. }
  96.  
  97. float ReadSensors()
  98. {
  99. int eleft. left, middle, right, eright; //tuk slagame stoinostite ot ADC-to
  100. int left2,left1, centre, right1,right2; // 1 ako e nad liniqta i obratnoto
  101.  
  102. float AverageSens = 0;
  103.  
  104. eright=ReadADC(SENSOR5);
  105. if(eright>SENSOR_THRES)
  106. {
  107. sensor5 = 1;
  108. LEDOn(5);
  109. }
  110. else
  111. {
  112. sensor5 = 0;
  113. LEDOff(5);
  114. }
  115.  
  116. // Read analog inputs
  117. right=ReadADC(SENSOR4);
  118. if(right>SENSOR_THRES)
  119. {
  120. sensor4 = 1;
  121.  
  122. }
  123. else
  124. {
  125. sensor4 = 0;
  126.  
  127. }
  128.  
  129. middle=ReadADC(SENSOR3);
  130. if(middle>SENSOR_THRES)
  131. {
  132. sensor3 = 1;
  133.  
  134. }
  135. else
  136. {
  137. sensor3 = 0;
  138.  
  139. }
  140.  
  141. left=ReadADC(SENSOR2);
  142. if(left>SENSOR_THRES)
  143. {
  144. sensor2 = 1;
  145.  
  146. }
  147. else
  148. {
  149. sensor2 = 0;
  150.  
  151. }
  152.  
  153. eleft=ReadADC(SENSOR1);
  154. if(eleft>SENSOR_THRES)
  155. {
  156. sensor1 = 1;
  157.  
  158. }
  159. else
  160. {
  161. sensor1 = 0;
  162.  
  163. }
  164.  
  165.  
  166. if(left2==0 && left1==0 && centre==0 && right1==0 && right2==0)
  167. {
  168. return 0xFF;
  169. }
  170.  
  171. // Calculate weighted mean
  172. AverageSens = (float) left2*(-2) + left1*(-1) + centre*0 + right1*1 + right2*2 ;
  173. AverageSens = (float) AverageSens / (left2 + left1 + centre + right1 + right2);
  174.  
  175. return AverageSens;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement