Подписаться на получение новых статей на почту:

Контроллер любительского станка ЧПУ (step/dir) на AVR. Шаг №15

Обновлено 17.12.15. Всем привет. В этом посте мы рассмотрим основы для построения контроллера любительского станка ЧПУ, а также программную реализацию. Как Вы помните в прошлой записи мы рассмотрели настройку и управление ШИМ-ом , вот этот полученный опыт мы сегодня и используем. Схему для построения контроллера я взял по этой ссылке http://radiokot.ru/circuit/digital/automat/25/. Лично я выбрал схему на ШИМ  управлении. Схемы очень доступно расписаны. Поэтому проблем возникнуть не должно. Я не много добавил в схеме выход для подключения ЖКИ и интерфейс SPI. Здесь речь пойдет о программной реализации.

Я реализовал пока для одной оси, т.к. механика станка в проекте...Подобные контроллеры называются step/dir. И представляют собой самый дешевый способ управления станка. Т.к. подобный станок, но со своими скажем “мозгами” будет дороже. Данное устройство является синхронизирующим звеном между компьютером и драйвером для управления ШД. Итак Step – это шаг, dir – направление. Конечно на ПК предварительно должно быть установлено специализированное ПО. Благо таких море.
На фото ниже мой вариант реализации этого девайса, кое что я добавил, но основы те же.  Естественно такое устройство претендует на базовую основу, т.к. для нормальной работы более менее серъезного станка необходима обратная связь.
Контроллер ЧПУ (step/dir) на AVR
Итак контроллер представляет собой устройство посредник между задающим и исполняющим механизмом. Где задающее устройство программа и компьютер, исполняющее – двигатель. Контроллер принимает сигнал с компьютера , обрабатывает и управляет драйвером.
Цифры на рисунке:
1. Выход контроллер – драйвер.
2. Вход компьютер – контроллер.
3. Выход драйвер — исполняющее устройство.
4. Интерфейс внутрисхемного программирования.
5. Вход драйвер — контроллер.

Для проектирования контроллера сначала необходимо определиться с параметрами будущего станка, т.е. выбора необходимых шаговых двигателей или др. исполняющих устройств.
Что нам необходимо реализовать:
1. Нам необходимо считывать направление и шаг. Для опроса шага необходимо настроить прерывания по входящему сигналу. Для направления отвести какой нибудь пин для считывания состояние. Настройка прерывания подобна обработке нажатия на кнопку.
2. Настроить ШИМ, в прошлой записи (шаг №14).
3. Настроить минимально возможную задержку между шагами, чтобы вал успел провернуться.
4. Прописать алгоритм шага. Здесь немного теории . Данный алгоритм зависит от выбранного нами двигателя. У меня гибридный униполярный.  Что значит гибридный, это значит что он в себе сочетает как переменные магниты так и постоянные. Один шаг двигателя составляет либо 3.6 (4 полюса) град. либо 1.8 — 0.9 град (8 полюсов). Т.е. шаг зависит от количества полюсов на статоре. У меня 6-ть проводков, т.е. 4 полюсный, угол поворота 3.6. Как это работает?  Ниже приведена анимация работы шагового двигателя. (Взята из wikipedia.)

  Статор и ротор двигателя  имеют зубцы, в некоторых положениях зубцы ротора находятся строго напротив зубцов статора, а в некоторых между зубцами статора. Зубцы ротора обеспечивают меньшее сопротивление магнитной цепи в определенных положениях ротора, что улучшает статический и динамический момент. При подаче питания на обмотки ротор фиксирует зубцы напротив запитанного полюса, чем и обеспечивается шаг.
Для уменьшения шага и увеличение дискретности за оборот мы можем программно обеспечить полушаг.
Ниже приведена таблица истиности для шагового и полушагового режима.

Номер шага Полно шаговый режим Полу шаговый режим
1 1000 1000
2 0100 1100
3 0010 0100
4 0001 0110
5 0010
6 0011
7 0001
8 1001

Что такое полу шаговый режим это когда на каждый второй шаг запитана лишь одна фаза, а в остальных случаях запитаны две . В результате угловое перемещение ротора составляет половину угла шага . Кроме уменьшения размера шага этот способ управления позволяет частично избавиться от явления резонанса.

В своей программе я реализовал полно шаговый режим. Что ж используя часть программ из предыдущих статей напишем программу для AVR.
/* Как всегда начинаем с шапки, сдесь нам главное подключить три библиотеки: ввод-вывод, задержка и прерывание */
  #define F_CPU 10000000UL  // 10 MHz
  #include <avr/io.h>
  #include <util/delay.h>
  #include <avr/interrupt.h>
  volatile int pwm_x, x_sleep; // вспомогательные пременные
  #define n 15;   //минимально допустимая задержка
  /* Прерывание по входящему сигналу*/
  SIGNAL (SIG_INTERRUPT0)  //обработка прерывания
  {
      x_sleep = 0;
      pwm_x=0;
     OCR1A = 255; //5в  Рассмотрели в предыдущем посте №14. 
        /* Считываем состояние пина  и определяемся с направлением*/
     if (bit_is_clear (PINC,4)) //когда бит 4 равен 0
     {
                /* Далее мы должны прописать алгоритм для  шагания двигателя. */
                 PORTA |= _BV (PA0);
                 PORTA &= ~_BV (PA1);
                 PORTA &= ~_BV (PA2);
                 PORTA &= ~_BV (PA3);
                 _delay_ms (n);    /* Задержка характеризуется скоростью  проворачивания вала,т.к. при слишком быстром открывании ключей двигатель будет просто “дёргаться”, не успевать проварачиваться*/
                  PORTA &= ~_BV (PA0);
                  PORTA |= _BV (PA1);
                  PORTA &= ~_BV (PA2);
                  PORTA &= ~_BV (PA3);
                _delay_ms (n);

                 PORTA &= ~_BV (PA0);
                 PORTA &= ~_BV (PA1);
                 PORTA |= _BV (PA2);
                 PORTA &= ~_BV (PA3);
_delay_ms (n);

                 PORTA &= ~_BV (PA0);
                 PORTA &= ~_BV (PA1);
                 PORTA &= ~_BV (PA2);
                 PORTA |= _BV (PA3);
                _delay_ms (n);

                pwm_x=1;
                x_sleep=0;
     }
    else  if (bit_is_set (PINC,4))
//КОГДА БИТ 4 РАВЕН 1
    {
                  PORTA &= ~_BV (PA0);
                  PORTA &= ~_BV (PA1);
                  PORTA &= ~_BV (PA2);
                  PORTA |= _BV (PA3);    

_delay_ms (n);

                 PORTA &= ~_BV (PA0);
                 PORTA &= ~_BV (PA1);
                 PORTA |= _BV (PA2);
                 PORTA &= ~_BV (PA3);
                 _delay_ms (n);

                 PORTA &= ~_BV (PA0);
                 PORTA |= _BV (PA1);
                 PORTA &= ~_BV (PA2);
                 PORTA &= ~_BV (PA3);
                 _delay_ms (n);

                 PORTA |= _BV (PA0);
                 PORTA &= ~_BV (PA1);
                 PORTA &= ~_BV (PA2);
                 PORTA &= ~_BV (PA3);

                 _delay_ms (n);
                 pwm_x=1; // переменная для определения включения оси
                 x_sleep=0;
      }
  }

  int main (void)              // начало основой программы
  {
         DDRB = 0xfb;   
//ВХОД PB2
         DDRD = 0xf3;   //выводы порта pd2 and PD3 — входы
         DDRC = 0x8f;    //выводы порта PC4,5,6 — входы
         DDRA = 0xff;   // все выходы  1- выход, 0 -вход
         PORTA = 0X00;
   //производим начальные настройки для внешнего прерывания, пока для INT0
        GICR =0×40;
        MCUCR = 0×02;//по спадающему фронту
        sei (); //Разрешение прерываний глобально по всей программе
// устанавливаем настройки счетного регистра для ШИМ
        TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<WGM10); /*На выводе OC1A единица, когда  OCR1A==TCNT1, восьмибитный ШИМ Phase Correct PWM  , номер режима 1 . модуль счета ТОР $00FF*/
        TCCR1B=(1<<CS10);         /*Делитель= /1,  частота 19607,84Гц на выходе ОС1А*/

/*OCR1A по этому регистру происходит сравнение с счетным регистром, необходим постоянный  ШИМ , т.е. задаем ОСR1A разрядность до 255. т.к. модуль счета ло 255*/
        while (1)
        {   
// Бесконечный цикл
              if (pwm_x==1)
//глобальный регистр, который определяет включение оси
              {

              /* Цикл для входа в режим сна*/
                    while ((PIND2 != 0) && ( x_sleep <= 750 ))/*если на пине по шагам ноль, больше 750 мс, то          переводим двигатель в удержание с 20% ШИМом*/
                     {
                           _delay_ms (1);
                           x_sleep++;// глобальный регистр, который определяет режим сна
                           pwm_x=0;
                           OCR1A = 50 ;
                      }
              }
             else
            {
                OCR1A=50;                                                                     
                 pwm_x=0;      /*данная переменная необходимо если задействованно несколько осей*/
            }

        }     
   }                // закрывающая скобка основной программы

На этом все. Программа для ЧПУ рабочая, хоть и сыроватая. Двигатель в режиме удержания греется незначительно. Для шлифовки программы необходимо начать строить механику. Поэтому как только продвинется этот вопрос, сразу продолжим этот пост. Критикуйте, спрашивайте, комментируйте. А пока этот проект отложен, в следующей статье приступим к разбору нового проекта, который представит собой контроллер сбора данных.  Спасибо всем за внимание.

Просмотрено 9324 раз.

Я на Google+

Контроллер любительского станка ЧПУ (step/dir) на AVR. Шаг №15: 7 комментариев

  1. Здраствуйте! А как на счот микрошага? Можно програмно реализовать на avr?

    • Здравствуйте! Если честно не знаю. Если теоритически то можна. На практике, если и получится, то шаг скорее всего будет плавающий. Код заберет много времени, и нефакт что будет работать. Тут надо время и желание. Нету ни того ни другого.

    • Скорей всего данный проект пойдет как пид-регулятор для печек. Но это немного в будущем))) Для станка очень дорого покупать механику, тем более в качестве хобби.

  2. почему при 1 на step двигатель проворачивается на один оборот 360 градусов а не на один шаг

    • Смотрите внимательно программу или устройство у себя. Импульс пришол, прерывание сработало, транзситоры пооткрывались , двигатель пошагал,позакрывались, ШИМ в режиме удержания.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting