Advertisement
ktostam450

[ARDUINO] sterowanie silnikiem krokowym

May 25th, 2018
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.75 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. #define SILNIK_DDR DDRB
  6. #define SILNIK_PORT PORTB
  7. #define SILNIK_PIN PINB
  8. #define SILNIK_F1 1 /*LSB*/
  9. #define SILNIK_MASK (0x0f<<SILNIK_F1)
  10.  
  11. #define PAUSE() ({ dir = pause; })
  12.  
  13. #define BAUDRATE 19200UL
  14. #define PRESCALE (((F_CPU / (BAUDRATE * 16UL))) - 1)
  15.  
  16. enum Mode {pause, const_left, const_right, left, right, set_upper, set_lower};
  17. volatile uint8_t dir = 0;
  18. volatile uint16_t lowBound = 0;
  19. volatile uint16_t upBound = 2000;
  20.  
  21. ISR (TIMER0_COMPA_vect)
  22. {
  23.     const uint8_t tab[] = {1,3,2,6,4,12,8,9};
  24.     static int16_t i = 0;
  25.     SILNIK_PORT &= ~(SILNIK_MASK);
  26.     if (dir && (i > lowBound) && (i < upBound)) {
  27.         SILNIK_PORT |= (tab[i % 8] << SILNIK_F1);
  28.     }
  29.    
  30.     if (dir == const_left && i < upBound) {
  31.         i++;
  32.     } else if (dir == const_right && i > lowBound) {
  33.         i--;
  34.     }
  35.     if (dir == left) {
  36.         i++; PAUSE();
  37.     }
  38.     if (dir == right) {
  39.         i--; PAUSE();
  40.     }
  41.     if (dir == set_upper){
  42.         PAUSE();
  43.         upBound = i;
  44.     }
  45.     if (dir == set_lower){
  46.         PAUSE();
  47.         lowBound = i;
  48.     }
  49. }
  50.  
  51. int main (void)
  52. {
  53.     uint8_t cmd;
  54.     SILNIK_DDR |= SILNIK_MASK;
  55.    
  56.     TCCR0B |= (1<<CS02);   //preskaler
  57.     TIMSK0 |= (1<<OCIE0A); //Wlacz przerw. dla Timera0
  58.     TCCR0A |= (1<<WGM01);
  59.     UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
  60.     UBRR0 = PRESCALE;
  61.     OCR0A = 100;
  62.     sei();
  63.    
  64.     for(;;) {
  65.         while ( !(UCSR0A & (1 << RXC0)) );
  66.         cmd = (int)UDR0;
  67.         switch(cmd)
  68.         {
  69.             case 108: // l
  70.                 dir = const_left;
  71.             break;
  72.             case 112: // p
  73.                 dir = const_right;
  74.             break;
  75.             case 52: // 4
  76.                 dir = left;
  77.             break;
  78.             case 54: // 6
  79.                 dir = right;
  80.             break;
  81.             case 100: // d
  82.                 dir = set_lower;
  83.             break;
  84.             case 103: // g
  85.                 dir = set_upper;
  86.             break;
  87.             default:
  88.                 dir = pause;
  89.         }              
  90.     }
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement