Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. #include<avr/io.h>
  2. #include <avr/interrupt.h>
  3.  
  4. //Czujniki
  5. #define C4 PC0
  6. #define C3 PC1
  7. #define C1 PC2
  8. #define C2 PC3
  9. #define C8 PC4
  10. #define C5 PC5
  11. #define C6 20U
  12. #define C7 21U
  13.  
  14. //Mostek
  15. #define PWMA PD3
  16. #define PWMB PD5
  17. #define AIN1 PD2
  18. #define AIN2 PD4
  19. #define BIN1 PD6
  20. #define BIN2 PD7
  21. #define STBY PB4
  22.  
  23. #define reloadValue 65036
  24.  
  25. //Czuj i PID
  26. int8_t stan_czuj[8] = { 0 };
  27. int8_t tab_czuj[8] = { C1,C2,C3,C4,C5,C6,C7,C8 };
  28. int16_t wag_czuj[8] = { -12,-8,-3,-1,1,3,8,12 };
  29. uint8_t V_zal = 130;
  30. int8_t error_last = 0;
  31. int8_t error = 0;
  32. int8_t uchyb, ostatni_uchyb = 0, d_blad;
  33. uint8_t Kp = 15;
  34. uint8_t Kd = 65;
  35. uint8_t przestrzelony;
  36. int16_t regulacja;
  37. int16_t Blad();//zwraca blad
  38. int16_t PID();
  39. int16_t ADC_conv(int8_t czujnik_pin);
  40.  
  41.  
  42. //ustawienia na poczatek
  43. void ustaw_czujnik()
  44. {
  45. DDRC |= (0 << C1) | (0 << C2) | (0 << C3) | (0 << C4) | (0 << C5) | (0 << C6) | (0 << C8);
  46. }
  47. void ADC_conv()
  48. {
  49. ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
  50. ADMUX |= (1 << REFS0);
  51. ADCSRA |= (1 << ADEN);
  52. ADCSRA |= (1 << ADSC);
  53. }
  54. void set_motors()
  55. {
  56. DDRD |= (1 << PWMA) | (1 << PWMB) | (1 << PWMB) | (1 << AIN1) | (1 << AIN2) | (1 << BIN1) | (1 << BIN2);
  57. DDRB |= (1 << STBY);
  58. PORTD |= (1 << AIN2);
  59. PORTD |= (1 << BIN2);
  60. }
  61. void set_PWM()
  62. {
  63. TCCR1A |= (1 << WGM10);
  64. TCCR1B |= (1 << WGM12);
  65. TCCR1A |= (1 << COM1A1) | (1 << COM1B1);
  66. TCCR1B |= (1 << CS10) | (1 << CS11);
  67. OCR1A = 0;
  68. OCR1B = 0;
  69. }
  70. void wyw_timer()
  71. {
  72. OCR2A = reloadValue;
  73. TCCR2A |= (1 << WGM21);
  74. TIMSK2 |= (1 << OCIE2A);
  75. TCCR2B |= (1 << CS22);
  76. sei();
  77.  
  78. }
  79. ISR(TIMER2_COMPA_vect) {
  80. regulacja = PID();
  81. }
  82.  
  83. int main(void)
  84. {
  85. ustaw_czujnik(); // ustawienie czujników jako wyjście
  86. set_PWM();
  87. set_motors();//ustawienie mostka
  88. ADC_conv();//ustawienie ADC
  89. wyw_timer();//timer2
  90. while (1)
  91. {
  92. aktywne_czujniki(tab_czuj);
  93. uchyb = Blad();
  94. int16_t regulacja = PID();
  95. PWM(V_zal - regulacja, V_zal + regulacja);
  96.  
  97. }
  98. }
  99.  
  100. int16_t ADC_conv(int8_t czujnik_pin)//numer pinu jako argument np: PC1
  101. {
  102. ADMUX &= 0xF0;
  103. ADMUX |= czujnik_pin;
  104. ADCSRA |= (1 << ADSC);
  105. ADCSRA |= (1 << ADSC);
  106. while (ADCSRA & (1 << ADSC));
  107. return ADCW;
  108. }
  109. void aktywne_czujniki(int8_t tab[8])//NR PINU jako argument np:PC1
  110. {
  111. for (int i = 0; i < 8; i++)
  112. {
  113. if (ADC_conv(tab[i]) < 150)
  114. {
  115. stan_czuj[i] = 0;
  116. }
  117. else
  118. {
  119. stan_czuj[i] = 0;
  120. }
  121. }
  122.  
  123.  
  124. }
  125. int16_t Blad()
  126. {
  127. error = 0;
  128. uint8_t lczujnikow = 0;
  129. for (uint8_t i = 0; i < 8; i++)
  130. {
  131. error = error + tab_czuj[i] * wag_czuj[i];
  132. lczujnikow += stan_czuj[i];
  133.  
  134. }
  135.  
  136. if (lczujnikow != 0)
  137. {
  138. error /= lczujnikow;
  139. error_last = error;
  140. }
  141. else
  142. error = error_last;
  143. if (przestrzelony == 1 && error >= 0)
  144. przestrzelony = 0;
  145. else if (przestrzelony == 2 && error <= 0)
  146. przestrzelony = 0;
  147. return error;
  148. }
  149. int16_t PID() // FUNKCJA REALIZUJE ALGORYTM REGULATORA PD
  150. {
  151.  
  152. d_blad = uchyb - ostatni_uchyb;
  153.  
  154. ostatni_uchyb = uchyb;
  155. return Kp * uchyb + Kd * d_blad;
  156. }
  157. void PWM(int16_t lewy, int16_t prawy)// FUNKCJA
  158. {
  159. if (lewy >= 0) {
  160. if (lewy > 255)
  161. lewy = 255;
  162. PORTD |= (1 << AIN2);
  163. PORTD &= ~(1 << AIN1);
  164.  
  165. }
  166. else
  167. {
  168. if (lewy < -255)
  169. lewy = -255;
  170. PORTD |= (1 << AIN1);
  171. PORTD &= ~(1 << AIN2);
  172.  
  173.  
  174. }
  175.  
  176. if (prawy >= 0)
  177. {
  178. if (prawy > 255)
  179. prawy = 255;
  180. PORTD |= (1 << BIN2);
  181. PORTD &= ~(1 << BIN1);
  182.  
  183. }
  184. else
  185. {
  186. if (prawy < -255)
  187. prawy = -255;
  188. PORTD |= (1 << BIN1);
  189. PORTD &= ~(1 << BIN2);
  190. }
  191.  
  192. OCR1A = abs(lewy);
  193. OCR1B = abs(prawy);
  194.  
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement