Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. /**
  2.  * Seweryn Zeman
  3.  * (C)2011
  4.  * Sterowanie robota:
  5.  * 4x serwo
  6.  * 2x krokowy
  7.  * LCD + RS232
  8.  * SET mode
  9.  * sterowanie all-motors-at-once
  10.  *
  11.  * Napędy:
  12.  * J1, J2, D3, J4, GRIP
  13.  *
  14.  * Timer1 - przepełnienie co 2,5ms (2,5ms z 20000 krokami)
  15.  * Timer2 - przepełnienie co 4,75ms (19ms/4serwa)
  16.  *
  17.  * Kierunek (dir):
  18.  * 0 - lewo
  19.  * 1 - prawo
  20.  */
  21.  
  22. #include <avr/io.h>
  23. #include <avr/interrupt.h>
  24. #include <util/delay.h>
  25.  
  26. // serwa: zestaw portów
  27. #define SERVO0_PIN              PD0
  28. #define SERVO1_PIN              PD1
  29. #define SERVO2_PIN              PD2
  30. #define SERVO3_PIN              PD3
  31. #define SERVOS                  (1<<SERVO0_PIN)|(1<<SERVO1_PIN)|(1<<SERVO2_PIN)|(1<<SERVO3_PIN)
  32.  
  33. // serwa: ilość kroków na 1deg
  34. #define SERVO_STEPS_PER_DEG     68      // 68 kroków/deg
  35. #define SERVO_STEP              68      // speed
  36.  
  37. // serwa: wartości położeń
  38. #define SERVO_MIN               5200
  39. #define SERVO_NULL              9150
  40. #define SERVO_MAX               13100
  41.  
  42. #define SERVO_MIN_DEG           0
  43. #define SERVO_MAX_DEG           115
  44.  
  45. // serwa: położenie domyślne
  46. #define SERVO_DEFAULT           9150
  47.  
  48. uint16_t volatile servo_pos[4] = {5200,8400,11600,13100};
  49. uint8_t volatile current_servo = 0;
  50.  
  51. void init_ports(void) {
  52.     DDRB &= ~((1<<PB0)|(1<<PB1));
  53.     PORTB |= (1<<PB0)|(1<<PB1);
  54.     DDRD |= SERVOS;
  55.     PORTD &= ~(SERVOS);
  56. }
  57.  
  58. void init_timer2(void) {
  59.     TCCR2 |= (1<<WGM21);            // CTC
  60.     TCCR2 |= (1<<CS21)|(1<<CS22);   // prescaler 256
  61.     OCR2 = 0x93;                    // ~5ms
  62.     TIMSK |= (1<<OCIE2);            // interrupt on compare match
  63. }
  64.  
  65. void init_timer1(void) {
  66.     TCCR1B |= (1<<WGM12);           // CTC
  67.     TIMSK |= (1<<OCIE1A);           // interrupt on compare match
  68. }
  69.  
  70. void toggle_servo_signal(uint8_t servo) {
  71.     switch(servo) {
  72.         case 0:
  73.             PORTD ^= (1<<SERVO0_PIN);
  74.             break;
  75.         case 1:
  76.             PORTD ^= (1<<SERVO1_PIN);
  77.             break;
  78.         case 2:
  79.             PORTD ^= (1<<SERVO2_PIN);
  80.             break;
  81.         case 3:
  82.             PORTD ^= (1<<SERVO3_PIN);
  83.             break;
  84.     }
  85. }
  86.  
  87. void start_timer1(void) {
  88.     OCR1A = servo_pos[current_servo];
  89.     TCCR1B |= (1<<CS10);
  90. }
  91.  
  92. void stop_timer1(void) {
  93.     TCCR1B &= ~(1<<CS10);
  94.     TCNT1 = 0;
  95.     TIFR &= ~(1<<OCF1A);
  96.     if(current_servo<4) {
  97.         current_servo++;
  98.     } else {
  99.         current_servo = 0;
  100.     }
  101. }
  102.  
  103. ISR(TIMER2_COMP_vect) {
  104.     toggle_servo_signal(current_servo);
  105.     start_timer1();
  106. }
  107.  
  108. ISR(TIMER1_COMPA_vect) {
  109.     toggle_servo_signal(current_servo);
  110.     stop_timer1();
  111. }
  112.  
  113. int servo_move(uint8_t servo, uint8_t dir) {
  114.     _delay_us(4750);
  115.     if(dir==1 && servo_pos[servo]<SERVO_MAX) {
  116.         servo_pos[servo] += SERVO_STEP;
  117.         return 1;
  118.     } else if(dir==0 && servo_pos[servo]>SERVO_MIN) {
  119.         servo_pos[servo] -= SERVO_STEP;
  120.         return 1;
  121.     }
  122.     return 0;
  123. }
  124.  
  125. int servo_to_deg(uint8_t servo, uint8_t deg) {
  126.     if(deg>=SERVO_MIN_DEG && deg<=SERVO_MAX_DEG) {
  127.         servo_pos[servo] = SERVO_MIN + (SERVO_STEPS_PER_DEG*deg);
  128.         return 1;
  129.     }
  130.     return 0;
  131. }
  132.  
  133. int main (void) {
  134.     init_ports();
  135.     init_timer2();
  136.     init_timer1();
  137.     sei();
  138.     while(1) {
  139.         if(!(PINB&(1<<PB0))) {
  140.             servo_to_deg(0,0);
  141.         } else if(!(PINB&(1<<PB1))) {
  142.             servo_to_deg(0,90);
  143.         }
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement