Некоторые читатели уже давно просили рассмотреть работу шагового двигателя. Моторчик был приобретен еще полгода назад, алгоритм изучен. Хотелось совместить много всего интересного в одной статье и как обычно, чем больше планируешь, тем ниже шанс доделать устройство. В общем, я решил снова вернуться к этому вопросу и сделать статью как можно проще.
Представим себе постоянный магнит (ПМ), с осью в центре, относительно которой он может вращаться, синий — север, красный — юг. Рядом с ним электромагнит, который жестко закреплен и пока никуда не подключен, поэтому положение ПМ произвольное.
В следующий момент, подаем на начало обмотки минус, на конец плюс. Условимся, что по правилу правой руки (буравчика 🙂 ) север у электромагнита будет слева, юг справа, поэтому ПМ развернется севером к электромагниту.
Если поменять полярность электромагнита — полюса поменяются, ПМ развернется. Таким образом, в зависимости от полярности электромагнита у вращающегося ПМ будет два устойчивых состояния, т.е. шаг будет равен 180 градусов.
Если добавить еще один электромагнит, то будет уже четыре устойчивых состояния, т.е. шаг будет 90 градусов.
Картинки весьма условны и не отражают реальной конструкции двигателя, просто на мой взгляд они более наглядны. Двигатели с двумя независимыми обмотками, без выводов от центра обмотки называются биполярными, бывают еще униполярные и четырехобмоточные, но их пока рассматривать не будем.
Мне достался ST-PM35-15-11C, каждый шаг — 7,5 градусов, т.е. 360/7,5=48 шагов на оборот. Номинальное напряжение 12В, сопротивление обмотки 4 Ома.
Для управления шаговым двигателем производитель предлагает такую таблицу.
Таким образом все что нам нужно — это подавать напряжение на провода в соответствии с этой таблицей, там где стоят галочки — подать напряжение, там где не стоят — ноль.
Программа очень проста — делаем шаг, ждем секунду и так по кругу. При желании можно запилить управление с компа.
#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); } } |
Ради теста можно покрутить это дело в протеусе.
Естественно, ножки микроконтроллера не в состоянии обеспечить достаточный ток. Поэтому можно поставить транзистор, но на каждые два шага полярность напряжения обмотки меняется на противоположную, значит одного транзистора недостаточно, поэтому на каждый вход нужно будет поставить по два транзистора(пуш пул). Кроме того, при отключении обмотки возникают броски обратного напряжения способные пробить транзистор. Поэтому понадобится защитный диод.
В общем, для таких ленивых людей как я 🙂 есть микросхемы которые уже содержат в себе эти транзисторы и диоды, остается лишь подавать управляющие импульсы от микроконтроллера. Например L293D, QUADRUPLE HALF-H DRIVERS — драйвер шагового двигателя. Придумывать ничего не надо, в даташите есть пример для биполярного двигателя.
Если не понятно, то на ножки:
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 к микроконтроллеру.
Все работает как часы 🙂
Прошивка исходники
Здравствуйте! Скажите пожалуйста, какой шагогый двигатель можно использовать кроме 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){}
}
}