====== Шаговый двигатель ====== //Необходимые знания: [HW] [[et:hardware:homelab:motor]], [AVR] [[et:avr:io]], \\ [LIB] [[et:software:homelab:library:module:motor]], [LIB] [[et:software:homelab:library:delay]]// ===== Теория ===== [{{ :examples:motor:stepper:stepper.jpg?220|Шаговый двигатель}}] Шаговые двигатели широко применяются в приложениях, требующих точность. В отличие от двигателя постоянного тока у шагового двигателя отсутствуют щетки и коммутатор - для этого там несколько отдельных обмоток, которые коммутируются внешней электроникой (драйвером). Вращение ротора происходит за счет коммутации обмоток шаг за шагом, без обратной связи. Здесь проявляется и один недостаток шаговых двигателей - в случае механической перегрузки, когда ротор не двигается, шаги начинают путаться и движение становится неточным. По виду обмоток, шаговые двигатели разделяются на два типа: униполярные и биполярные шаговые двигатели. По строению их делят еще на три вида: * С переменным магнитным сопротивлением (высокая точность, низкий крутящий момент, низкая цена) * С постоянным магнитом (низкая точность, высокий крутящий момент, низкая цена) * Гибридный (высокая точность, высокий крутящий момент, высокая цена) У шаговых двигателей с переменным магнитным сопротивлением зубчатые обмотки и зубчатый ротор из железа. Максимальная сила тяги возникает при перекрытии зубьев обоих сторон. В шаговых двигателях с постоянным магнитом, как следует из названия, есть постоянный магнит, который ориентируется в зависимости от полярности обмотки. В гибридных используются обе технологии. Независимо от модели шагового двигателя для создания одного полного оборота вала (360 градусов) требуется сотня коммутационных шагов. Для обеспечения стабильного и плавного движения используют подходящую управляющую электронику, которая управляет двигателем в соответствии с его параметрами (инертность ротора, крутящий момент, резонанс и т.д.). Вдобавок в управляющей электронике можно применять различные методы коммутации. Коммутацию последовательно по одной обмотке называют полным шагом, но если коммутируется поочередно одна и две обмотки, то это называется полушагом. Используют так же синусоидальные микрошаги, что дает особую точность и плавность управления. **Униполярный шаговый двигатель** [{{ :examples:motor:stepper:motor_stepper_unipolar.png?250|Обмотки униполярного шагового двигателя}}] Униполярный шаговый двигатель имеет пять или шесть проводов. В соответствии со схемой привода запускается разом только одна четвертая обмоток. Линии //Vcc// обычно соединяются с положительным питающим напряжением двигателя. Концы обмоток 1a, 1b, 2a, и 2b соединяются при коммутации через транзисторы только с землей, в связи, с чем их управляющая электроника довольно простая. **Биполярный шаговый двигатель** [{{ :examples:motor:stepper:motor_stepper_bipolar.png?250|Обмотки биполярного шагового двигателя}}] Биполярный шаговый двигатель отличается от униполярного шагового двигателя тем, что полярность обмоток изменяется во время коммутации. Разом активируется половина обмоток, что обеспечивает в сравнении с униполярными шаговыми двигателями большую эффективность. У биполярных шаговых двигателей четыре провода, которые все соединяются отдельно полумостом. При коммутации полумосты прикладывают к концам обмоток положительное или отрицательное напряжение. Униполярные шаговые двигатели можно запускать и с помощью биполярного драйвера: для этого нужно соединить только линии обмоток 1a, 1b, 2a и 2b (//Vcc// остается не соединенным). Необходимые коммутации полного шага и полушага шаговых двигателей с обоими видами обмоток отображает следующая таблица. Так как в случае драйвера униполярного шагового двигателя происходит только отпирание транзисторов, то эти шаги представлены логическими числами 0 и 1. Управление биполярным шаговым двигателем может потребовать больше сигналов, и его шаги представлены выходной полярностью драйвера. ^ ^ Униполярный ^^^^ Биполярный ^^^^ ^ Шаг ^ 1A ^ 2A ^ 1B ^ 2B ^ 1A ^ 2A ^ 1B ^ 2B ^ ^ Полный шаг ^^^^^^^^^ | 1 ^ 1 | 0 | 0 | 0 ^ + | - | - | - | | 2 | 0 ^ 1 | 0 | 0 | - ^ + | - | - | | 3 | 0 | 0 ^ 1 | 0 | - | - ^ + | - | | 4 | 0 | 0 | 0 ^ 1 | - | - | - ^ + | ^ Полушаг ^^^^^^^^^ | 1 ^ 1 | 0 | 0 | 0 ^ + | - | - | - | | 2 ^ 1 ^ 1 | 0 | 0 ^ + ^ + | - | - | | 3 | 0 ^ 1 | 0 | 0 | - ^ + | - | - | | 4 | 0 ^ 1 ^ 1 | 0 | - ^ + ^ + | - | | 5 | 0 | 0 ^ 1 | 0 | - | - ^ + | - | | 6 | 0 | 0 ^ 1 ^ 1 | - | - ^ + ^ + | | 7 | 0 | 0 | 0 ^ 1 | - | - | - ^ + | | 8 ^ 1 | 0 | 0 ^ 1 ^ + | - | - ^ + | ===== Практика ===== Цель упражнения запустить биполярный шаговый двигатель, вместо чего можно использовать по приведенному выше методу и униполярный двигатель. На плате модуля «Двигателя» имеются два драйвера L293D, которые управляются четырьмя входными выводами микроконтроллера. Каждый вывод обозначает один конец полярности обмотки. Напряжение конца обмотки положительное, если вывод высокий, и отрицательное, если вывод низкий. Концам 1A, 1B, 2A и 2B соответствуют выводы микроконтроллера PB0, PB1, PB2 и PB3. Для управления биполярным шаговым двигателем в библиотеке Домашней Лаборатории есть функция //bipolar_init//, которая настраивает выводы выходом и функция //bipolar_halfstep//, которая совершает вращение на определенное количество полушагов. Коммутация происходит по таблице полушагов, но используются более сложные битовые операции. // // Подготовка управления биполярного шагового двигателя // void bipolar_init(void) { DDRB |= 0x0F; PORTB &= 0xF0; } // // Передвижение биполярного шагового двигателя полушагами // void bipolar_halfstep(signed char dir, unsigned short num_steps, unsigned char speed) { unsigned short i; unsigned char pattern, state1 = 0, state2 = 1; // Утверждение направления +- 1 dir = ((dir < 0) ? -1 : +1); // Осуществление полушагов for (i = 0; i < num_steps; i++) { state1 += dir; state2 += dir; // Создание шаблона pattern = (1 << ((state1 % 8) >> 1)) | (1 << ((state2 % 8) >> 1)); // Обозначение выхода PORTB = (PORTB & 0xF0) | (pattern & 0x0F); // Создание паузы для ожидания выполнения шага sw_delay_ms(speed); } // Остановка двигателя PORTB &= 0xF0; } Использование функций демонстрирует пример программы, которая поворачивает двигатель попеременно в одну и другую сторону на 200 полушагов. Скорость вращения двигателя определяет длинна паузы, создаваемая между шагами. Если паузу настроить слишком маленькой, то двигатель не успевает осуществлять вращение в связи с инертностью ротора и вал не двигается. // // Тест-программа биполярного шагового двигателя // модуля «Двигатели» Домашней Лаборатории // #include // // Основная программа // int main(void) { // Настройка двигателя bipolar_init(); // Бесконечный цикл while (true) { // Вращение в одну сторону 200 полушагов со скоростью 30 мс/шаг bipolar_halfstep(+1, 200, 30); // Вращение в другую сторону 200 полушагов со скоростью 30 мс/шаг bipolar_halfstep(-1, 200, 30); } }