Advertisement
istomina_sofia

шаговый двигатель

Jun 13th, 2022
772
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.86 KB | None | 0 0
  1. // Подключение биполярного шагового двигателя к AVR
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>  
  5.  
  6. // Полношаговый режим 2 фазы
  7. // Направление вращения по часовой стрелке
  8. unsigned char cw_dir[4]=
  9. {
  10. 0b00000001,
  11. 0b00000010,
  12. 0b00000100,
  13. 0b00001000
  14. };
  15.  
  16. // Направление вращения против часовой стрелки
  17. unsigned char ccw_dir[4]=
  18. {
  19. 0b00001000,
  20. 0b00000100,
  21. 0b00000010,
  22. 0b00000001
  23. };
  24.  
  25. volatile unsigned char step_index;
  26. volatile unsigned int ovftimes;
  27. volatile unsigned char status;
  28.  
  29. // Прерывание по переполнению Т0
  30. ISR(TIMER0_OVF_vect)
  31. {
  32. static unsigned int count = 1;
  33. count++;
  34. if(count >= ovftimes) // Применяем задержку
  35. {
  36. cli(); // Запрещаем прерывания
  37.  
  38. if(status) // если status == 1 крутим по часовой
  39. PORTB = ccw_dir[step_index++];
  40. else       // иначе крутим против часовой
  41. PORTB = cw_dir[step_index++];
  42.  
  43. if (step_index >= 4)
  44. step_index=0;
  45.  
  46. count = 0; // Сброс счетчика
  47. TCNT0 = 0; // Старт счетчика с нуля
  48. sei(); // Глобально разрешаем прерывания
  49. }
  50. }
  51.  
  52. // прерывание по вектору INT0
  53. ISR(INT0_vect)
  54. {
  55. status = 0; // против часовой
  56. }
  57.  
  58. // прерывание по вектору INT1
  59. ISR(INT1_vect)
  60. {
  61. status = 1; // по часовой
  62. }
  63.  
  64. int main(void)
  65. {
  66. DDRB = 0b00001111; // PB0, PB1, PB2, PB3 - выходы
  67. PORTB = 0x00; // Лог. нули на выходе
  68.  
  69. ADCSRA = (1 << ADEN) // разрешение АЦП
  70.       | (1 << ADPS2) // предделитель на 64 (частота АЦП 125kHz)
  71.       | (1 << ADPS1);
  72. ADMUX = 0x00; // ADC0 - вход, внешний ИОН 5 Вольт
  73.  
  74. GICR |= (1 << INT1)|(1 << INT0); // Разрешаем внешние прерывания
  75. MCUCR |= (1 << ISC11) // Прерывание по заднему фронту INT1
  76.         |(1 << ISC01); // Прерывание по заднему фронту INT0
  77.  
  78. TCCR0 |= (1 << CS01); // Предделитель на 8
  79. TCNT0 = 0; // Старт счетчика с нуля
  80. TIMSK |= (1 << TOIE0); // Разрешаем прерывания по переполнению Т0
  81.  
  82. step_index = 0;
  83. ovftimes = 10; // первоначальная задержка
  84. status = 0; // при включении вращение против часовой
  85.  
  86. sei(); // Глобально разрешаем прерывания
  87.  
  88. while(1)
  89. {
  90. ADCSRA |= (1 << ADSC); // Начинаем преобразование
  91. while (ADCSRA & (1 << ADSC)); // Ждем пока завершится преобразование
  92. ovftimes = ADCW; // Значение временной задержки
  93. }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement