Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

motorНекоторые читатели уже давно просили рассмотреть работу шагового двигателя. Моторчик был приобретен еще полгода назад, алгоритм изучен. Хотелось совместить много всего интересного в одной статье и как обычно, чем больше планируешь, тем ниже шанс доделать устройство. В общем, я решил снова вернуться к этому вопросу и сделать статью как можно проще.

Представим себе постоянный магнит (ПМ), с осью в центре, относительно которой он может вращаться, синий — север, красный — юг. Рядом с ним электромагнит, который жестко закреплен и пока никуда не подключен, поэтому положение ПМ произвольное.
step1

В следующий момент, подаем на начало обмотки минус, на конец плюс. Условимся, что по правилу правой руки (буравчика 🙂 ) север у электромагнита будет слева, юг справа, поэтому ПМ развернется севером к электромагниту.
step2

Если поменять полярность электромагнита — полюса поменяются, ПМ развернется. Таким образом, в зависимости от полярности электромагнита у вращающегося ПМ будет два устойчивых состояния, т.е. шаг будет равен 180 градусов.
step3

Если добавить еще один электромагнит, то будет уже четыре устойчивых состояния, т.е. шаг будет 90 градусов.
state_all1

Картинки весьма условны и не отражают реальной конструкции двигателя, просто на мой взгляд они более наглядны. Двигатели с двумя независимыми обмотками, без выводов от центра обмотки называются биполярными, бывают еще униполярные и четырехобмоточные, но их пока рассматривать не будем.

Мне достался ST-PM35-15-11C, каждый шаг — 7,5 градусов, т.е. 360/7,5=48 шагов на оборот. Номинальное напряжение 12В, сопротивление обмотки 4 Ома.
bipolar_avr

Для управления шаговым двигателем производитель предлагает такую таблицу.
bipolar_dc_table

Таким образом все что нам нужно — это подавать напряжение на провода в соответствии с этой таблицей, там где стоят галочки — подать напряжение, там где не стоят — ноль.

Программа очень проста — делаем шаг, ждем секунду и так по кругу. При желании можно запилить управление с компа.

#include <mega8.h>
#include <delay.h>
 
void main(void)
{
PORTD=0x00;
DDRD=0x0F;
 
while (1)
      {
      PORTD=0b00000011; //+a +b 
      delay_ms(1000); 
      PORTD=0b00000110; //+b -a
      delay_ms(1000);
      PORTD=0b00001100; //-a -b
      delay_ms(1000);
      PORTD=0b00001001; //-b +a
      delay_ms(1000);     
      }
}

Ради теста можно покрутить это дело в протеусе.
bipolar2

Естественно, ножки микроконтроллера не в состоянии обеспечить достаточный ток. Поэтому можно поставить транзистор, но на каждые два шага полярность напряжения обмотки меняется на противоположную, значит одного транзистора недостаточно, поэтому на каждый вход нужно будет поставить по два транзистора(пуш пул). Кроме того, при отключении обмотки возникают броски обратного напряжения способные пробить транзистор. Поэтому понадобится защитный диод.
L_load

В общем, для таких ленивых людей как я 🙂 есть микросхемы которые уже содержат в себе эти транзисторы и диоды, остается лишь подавать управляющие импульсы от микроконтроллера. Например L293D, QUADRUPLE HALF-H DRIVERS — драйвер шагового двигателя. Придумывать ничего не надо, в даташите есть пример для биполярного двигателя.
apnout

Если не понятно, то на ножки:
8 подаем Vcc2 = от Vсс1 до 36В,
1,9,16 Vсс1 = от 4.5 до 7,
4,5,12,13 — землю,
3,6 — первая обмотка,
11,14 — вторая обмотка.
2,7,10,15 к микроконтроллеру.
l298_mcu

Все работает как часы 🙂

Прошивка исходники

24 комментария: Урок 25. Управление шаговым двигателем

  • Здравствуйте! Скажите пожалуйста, какой шагогый двигатель можно использовать кроме ST-PM35-15-11C ? Мне нужен подобный двигатель который можно было бы купить на аукционе ebaey

  • Если хотите полностью повторить статью то ищите «bipolar stepper motor»

  • Для начала не мешало бы уточнить приминение мотора. Если просто искать шаговик то можно гордо купить nema23 с током обмотки в 2 и более ампер. С таким током этот драйвер через минуту скажет пшшшшшш и пойдёт дымок. Для чего нужен мотор?

  • Алексей, это как объяснять зачем нужно колесо 🙂 Принтеры, станки и еще over 9000 где еще. Именно по той причине что вы описали, контролировать ток, напряжение и прочие параметры вы должны самостоятельно. Собственно, забота выбора силовой части тоже лежит на плечах юзера. Это лишь простой пример. Конкретный выбор, можно обсудить на форуме.

  • Так я ж вопрос Янису задавал Он хочет купить подобный. А он уверен что характеристики текущего мотора из статьи ему подойдут. 😛 Вот и говорю что если на ебее искать по запросу «bipolar stepper motor» то можно купить гордо нема23 в надежде что он такой же и гордо сжечь драйвер. Кстати можно использовать Л297+Л298 векселей будет 😛

  • лол, занятно получилось, я уж думал объяснять зачем колесо нужно 😛

  • Да понятно это мне) Только вот я не знаю где достать такой двигател.. В ebay его нет как не странно. Вот и ищу подобный ) Пока еще не нашел.

  • Очень познавательная статья. Как раз думал как бы автоматизировать кормушку для домашней живности. Ув. админ, не могли бы вы ещё пролить свет на управление бесколлекторным двигателем из старых винчестеров — у него 3 полюса (6 выводов) + 3 датчика Холла (правильно ли я их назвал) — ещё 6 выводов, которые указывают на положение ротора. Есть конечно специальные дрова, но уж с очень большим обвесом и дискретных элементов, да к тому же очень дорогие. Плюс столкнулся с такой проблемой, что при чрезмерной нагрузке на двигатель он автоматом стопорится. Если сделать свои драйвера, да ещё на 1 мк+усиливающие по току транзисторы — было бы прекрасно!

  • Привет!! Когда тиристором научимся управлять?? Или симистором, там… 🙂

  • здравствуйте, имею ШД от принтера, униполярный, не могли бы пример дать как управлять скоростью вращения с помощью обычного потенциометра? может как то с помощью АЦП? изменять напряжение на ноже ацп 0-5В.

  • умножайте значение ацп на коэффициент и используйте полученное число как задержку

  • а вы не помогаете с написанием программы? дело в том что есть два шаговых мотора, хочу намоточный станок сделать с укладчиком. не могу понять где копать, так то вроде относительно понятно, не могли бы пример дать ? микроконтроллер использую Atmega16

  • 12 вольт(вплоть до 36) можно и нужно подавать только на 8 ножку микросхемы L293

  • верно, поправил

  • Здравствуйте!
    Не могу понять почему не работает. Просто добавил кнопку на порт В для включения шагового двигателя. Помогите пожалуйста разобраться, что я сделал не так?

    #include
    #include

    void main(void)
    {
    PORTB=0x02;
    DDRB=0x00;

    PORTD=0x00;
    DDRD=0x0F;

    while (1)
    {

    if(PINB.1==0)

    {
    PORTD=0b00000011; //+a +b
    delay_ms(10);
    PORTD=0b00000110; //+b -a
    delay_ms(10);
    PORTD=0b00001100; //-a -b
    delay_ms(10);
    PORTD=0b00001001; //-b +a
    delay_ms(10);
    }
    };
    }

  • Разобрался. Это я Протеусом пользоваться не умею. 😳 Все работает. 😀

  • Доброго времени суток!
    Хочу сказать, большое спасибо за ваши уроки, многое новое для себя открываю в работе с МК.
    Есть желание собрать устройство работы шагового двигателя в зависимости от температуры. Температуру измерять датчиком DS18b20 (как в уроке 12) и, к примеру, с ростом температуры на 1 градус поворачивать двигатель на один шаг. Подскажите, пожалуйста, как объединить два урока 12 и 25?! Выводить при этом температуру на дисплей нет необходимости. Спасибо!

  • Спасибо за познавательный урок. Скажите пожалуйста как в данном случае можно изменить таблицу последовательности импульсов изменяя тем самым направление вращения.Это будет аналогично и в дугих шаговых двигателях? например на 28BYJ-48-5V?
    А тут через драйвер как сориентироваться в какой последовательности надо посылать импульсы для вращения по часовой и против часовой ?
    ? http://42bots.com/wp-content/uploads/2014/02/stepper01.jpg

  • можно поменять полярность обмотки

  • 1) Для смены полярности понадобится драйвер который мог бы это делать. Как иначе менять полярность ? 2) а если подавать в обратном направлении импульсы ?

  • на одной из обмоток меняете 2 провода местами

  • Ладно а как на программном уровне сменить полюса ? Где и когда их сменять чтобы все было последовательно а не 3 вперет 1 назат…?
    Например тут как изменить чтобы крутился в обратную сторону ?
    while (1)
    {
    PORTD=0b00000011; //+a +b
    delay_ms(1000);
    PORTD=0b00000110; //+b -a
    delay_ms(1000);
    PORTD=0b00001100; //-a -b
    delay_ms(1000);
    PORTD=0b00001001; //-b +a
    delay_ms(1000);
    }

  • попробуйте переставлять строчки местами и посмотреть на результат

  • Используйте массив:

    #include
    // Declare your global variables here
    unsigned char n=1;
    unsigned char arr[4]={1,2,4,8};// полношаговый
    //unsigned char arr[4]={3,6,12,9}; для вас

    while (1)
    {
    // Place your code here
    while (PIND.2==0){ PORTB=0;} //PIND.2=step PIND.1=dir(направление вращения)
    if (PIND.1==0){n=n+1;} else {n=n-1;}
    if (n==5) {n=1;}
    if (n==0) {n=4;}
    PORTB=arr[n-1];
    while (PIND.2==1){}
    }
    }

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Свежие записи
Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика