Программирование AVR: работа с USB AVR-USB-MEGA16: управление шаговым двигателем через USB Wed, December 11 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AVR-USB-MEGA16: управление шаговым двигателем через USB Печать
Добавил(а) Сергей Кухтецкий   

В статье описана простая система управления шаговым двигателем на базе персонального компьютера, платы AVR-USB-MEGA16 и простого силового модуля для питания обмоток двигателя. Рассмотрены два варианта программного обеспечения: простой вариант для малых частот вращения двигателя и несколько более сложный, но без ограничений на частоту шагов. Разработка выполнена в лаборатории проблем материаловедения Института химии и химической технологии СО РАН, г. Красноярск (http://www.icct.ru/).

Шаговый двигатель – неотъемлемый атрибут многих исполнительных устройств, используемых для позиционирования в пространстве и регулирования материальных расходов. Шаговые двигатели также широко используются в приводах floppy-дисков, HDD, CD-ROM, в бытовых видеомагнитофонах, фотоаппаратах и видеокамерах. Существует множество конструкций шаговых двигателей и способов их питания. В данной статье мы рассмотрим довольно часто встречающийся вариант – униполярный двигатель в полношаговом режиме с одной включенной фазой. При таком питании в каждый момент времени ток подается только на одну обмотку двигателя. Пусть, например, в начальный момент времени ток подан на первую обмотку. В соответствующем положении находится и ротор. Если в следующий момент времени ток будет подан на вторую обмотку и снят с первой, то двигатель сделает один шаг (т.е. ротор повернется на определенный угол). Затем подадим ток только на третью обмотку, потом – на четвертую и опять на первую. И так далее. Ротор будет вращаться по часовой стрелке. Временная диаграмма сигналов показана на Рис.1. Естественно, если запитывать обмотки в обратной последовательности: 1-4-3-2, то двигатель будет вращаться в противоположном направлении.

stepmoto01-avr-usb-mega16.jpg

Рис.1. Схема обмоток и временная диаграмма

Несмотря на то, что при таком включении от двигателя нельзя получить полный момент, схема контроллера двигателя получается очень простой. Если же использовать микроконтроллер, то конструкция получается совсем тривиальной – к четырем цифровым выходам микроконтроллера нужно подсоединить усилители тока (простые транзисторные ключи) для питания обмоток двигателя. Далее остается только подавать единички на соответствующие выходы микроконтроллера. Рассмотрим немного подробнее силовой модуль.

[Силовой модуль]

Схема модуля представлена на Рис.2. При открывании какого-нибудь из транзисторов, ток будет протекать через соответствующую обмотку шагового двигателя. Для управления транзисторами используются свободные выходы PC0, PC1, PC6 и PC7 микроконтроллера платы AVR-USB-MEGA16. Тип транзисторов зависит от мощности подключаемого двигателя, напряжения его питания и, естественно, нагрузочной способности портов микроконтроллера. В данной конструкции я использовал составные транзисторы BD677, обладающие достаточным коэффициентом усиления по току, с допустимым напряжением коллектор-эмиттер до 60В, ток коллектора – до 4 А. Для большинства двигателей, которые используются в лабораторной практике – вполне достаточно. Если не нужна большая мощность, то при питании двигателя от 5В источника можно вообще обойтись без радиаторов.

stepmoto02-avr-usb-mega16.gif

Рис.2. Схема силового модуля

Поскольку нагрузка индуктивная, полезно поставить защитные диоды. Я поставил 1-амперные диоды 1N4001, но можно обойтись и без них. Защитные диоды увеличивают время спада тока в обмотках шагового двигателя (через них ЭДС самоиндукции возвращается в источник питания V+), что уменьшает максимально возможную частоту вращения шагового двигателя. Если убрать диоды, то время спада тока окажется минимальным, двигатель сможет вращаться быстрее, но при этом возникают опасные для транзисторов выбросы ЭДС самоиндукции, которые могут превысить допустимое для них напряжение 60 В.

Для первых экспериментов и отладки программного обеспечения взял небольшой шаговый двигатель от старого матричного принтера. Силовая часть разместилась на макетной плате. Питание двигателей производилось от внешнего источника. Напряжение питания – 5В. Вся электроника с двигателем показана на Рис.3, общий вид стенда – на Рис.4.

stepmoto03-avr-usb-mega16.jpg

Рис.3. Электронная часть и шаговый двигатель

stepmoto04-avr-usb-mega16.jpg

Рис.4. Общий вид стенда

[Программное обеспечение]

Как было отмечено выше, все управление нашим шаговым двигателем сводится к подаче логической единицы последовательно на порты микроконтроллера PC0, PC1, PC6 и PC7. В каждый момент времени единица должна быть только на одном порте. При подаче единицы, откроется соответствующий транзистор в силовом модуле и через одну из обмоток потечет ток. Двигатель сделает шаг. Затем нужно подать единицу на следующий порт, и двигатель сделает следующий шаг. Если не требуется высокая частота шагов, то с такой задачей вполне справится и сам хост. Рассмотрим этот вариант подробнее.

Простой вариант

Для этого решения можно воспользоваться простой универсальной прошивкой «firmware simple» из статьи «AVR-USB-MEGA16 : Быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16». Эта прошивка позволяет с хоста управлять по USB состоянием регистров ввода/вывода и портами микроконтроллера. Т.е. для данного варианта прошивку можно использовать безо всяких изменений. Единственное что нужно сделать - слегка модифицировать приложение хоста «host simple/LedTest» из этой же статьи. Вместо включения/выключения светодиода, подключенного к порту B, нужно управлять портом четырьмя портами порта C.

Прошивка, исходные файлы firmware и проект приложения хоста (на языке C# для Visual Studio 2008 Express Edition) приведены в папке «01 Простой вариант» архива [1]. Приложение хоста очень простое, поэтому ограничусь только комментариями по общей организации программы.

В массиве ph находятся байты, которые нужно послать в порт C для того, чтобы подать единицу на один из портов PC0, PC1, PC6 и PC7. Объявление этого массива – в классе Form1:

byte[] ph = {0x01, 0x02, 0x40, 0x80};

Таймер timerPulse в приложении хоста задает частоту следования шаговых импульсов (точнее – период этих импульсов). По тику этого таймера вызывается метод timerPulse_Tick(), в котором модифицируется индекс фазы (переменная iPh) на +1 или -1 в зависимости от направления вращения двигателя. Индекс фазы модифицируется циклически в диапазоне 0 – 3. В этом же методе соответствующий байт (ph[iPh]) посылается в порт C командой

dev.PORTC = ph[iPh];

Период следования импульсов (переменная T) регулируется компонентом NumericUpDown. При изменении T происходит модификация свойства Interval таймера timerPulse (см. метод numericUpDownMs_ValueChanged()).

Как уже отмечалось, данная реализация программного обеспечения будет работать только на сравнительно низких частотах следования шаговых импульсов. Для того, чтобы придать более строгий смысл фразе «сравнительно низкие частоты», проведем небольшой эксперимент. Подключим к одному из портов (PC0, PC1, PC6 или PC7) осциллограф и будем измерять длительность импульсов на этом порте в зависимости от длительности импульсов, задаваемой хостом при помощи компонента NumericUpDown. Мы увидим, что длительность импульсов и период их следования заметно «гуляют» (на десятки миллисекунд). Поэтому будем измерять среднее значение (например, по 10-20 импульсам). На Рис. 5 представлена зависимость этой средней величины от длительности, задаваемой хостом. Шкалы – в логарифмическом масштабе.

stepmoto05-avr-usb-mega16.png

Рис.5. Длительность импульсов на выводе порта микроконтроллера в зависимости от длительности, задаваемой хостом.

Из графика видно, что при больших длительностях (более 100 мс), длительность импульсов на ножке порта микроконтроллера практически совпадает с длительностью, задаваемой хостом. Т.е. в этом режиме хост вполне контролирует частоту вращения двигателя. Для более коротких импульсов (в диапазоне 10-100 мс) наблюдается заметное увеличение средней длительности импульсов (по сравнению с длительностью, задаваемой хостом). Внешне это проявляется как нестабильность вращения и неплавное увеличение скорости вращения при уменьшении длительности импульсов. Наконец, в диапазоне 1-10 мс, скорость вращения двигателя вообще перестает изменяться с изменением длительности импульсов, задаваемых хостом. Для моего компьютера эта величина оказалась равной 15.6 мс, т.е. частота - не более 64 шагов в секунду. Реально – еще меньше. Если учесть, что для типичных двигателей максимальная частота приемистости составляет величину порядка 1000 Гц, то становится ясно, что добиться максимальных скоростей вращения шагового двигателя при управлении шагами непосредственно из хоста нам не удастся. Поэтому (если, конечно, необходимы высокие скорости!) программное обеспечение необходимо модифицировать. Кроме того, возможно придется увеличить напряжение питания (для увеличения скорости нарастания тока в обмотках), применить другой принцип коммутации фаз, убрать защитные диоды и заменить их на специальные защитные цепочки, снижающие выбросы ЭДС самоиндукции до допустимого уровня, применить транзисторы подороже, у которых высокое допустимое напряжение коллектор-эмиттер.

Быстрый и точный вариант

Самый простой выходом из описанной выше ситуации является переход от управления шагами двигателя по таймеру хоста к управлению от аппаратного таймера микроконтроллера. Логика работы программы не меняется, только тактирование шагов двигателя и подача соответствующих байтов в порт C происходит уже не из хоста, а непосредственно в firmware. Некритичные ко времени реакции системы операции (в частности, инициализация таймера, изменение частоты шагов и направления вращения двигателя) можно оставить на хосте.

Для реализации этого варианта нам нужно модифицировать как firmware, так и приложение хоста. Исходные файлы и проект можно найти в папке «02 Быстрый вариант» архива [1]. Ниже – небольшие комментарии к этому программному обеспечению. Начнем с firmware (за основу без изменений взято firmware из статьи [5]).

Firmware

Будем работать с 16-разрядным таймером TIMER1 (чтобы ни в чем себе не отказывать). Основное изменение, которое нам необходимо сделать в firmware, – вставить обработчик прерывания, которое генерируется при достижении счетчиком определенного значения. Это значение как раз будет задавать период шага двигателя. Таймер, естественно, должен работать в режиме со сбросом значения счетчика при достижении этого значения (режим CTC - Clear Timer on Compare).

Модифицируем файл main.c из папки «firmware simple» следующим образом.
1. Вставим в начале модуля объявление константы:

#define RQ_SM_SET_DIR 0x31

2. Как и в предыдущем варианте (но только не в хосте, а в firmware!) объявим массив байтов, посылаемых в порт C и другие рабочие переменные:

byte ph[4] = {0x01, 0x02, 0x40, 0x80};
int iPh = 0, maxPh = 3, inc = 1;

3. Напишем две функции (сделать шаг в нужном направлении и обработчик прерывания от таймера):

//-----------------------------------------------------------------
// Сделать шаг в заданном (inc) направлении
//-----------------------------------------------------------------
void SMDoStep(void)
{
   iPh += inc;       // Циклически (из интервала 0, 1, 2, 3) изменяем индекс фазы
   if(iPh < 0)       // Зацикливаем индекс фазы для inc == -1
      iPh = maxPh;
   if(iPh > maxPh)   // Зацикливаем индекс фазы для inc == +1
      iPh = 0;
   PORTC &= 0x3C;    // Очистим биты 0, 1, 6 и 7 порта C
   PORTC |= ph[iPh]; // Установим 1 на соответствующей ножке (см. массив ph[])
}
//-----------------------------------------------------------------
// Обработчик прерывания от таймера 1 (COMPA)
//-----------------------------------------------------------------
ISR(TIMER1_COMPA_vect)
{
   sei();            // Дадим возможность обработать прерывания от USB...
   SMDoStep();       // Сделаем шаг в нужную сторону
}

4. И, наконец, в функцию usbFunctionSetup() вставим еще один case для установки направления вращения двигателя:

    case RQ_SM_SET_DIR:  
       // Установка направления вращения двигателя
       inc = (val > 0)? +1 : -1;
       return 0;

Это все изменения firmware, которые необходимо сделать. Компилируем, прошиваем микроконтроллер и переходим к хосту.

ПО хоста

Сначала модифицируем класс-обертку ATMega (файл ATMega.cs).

1. В секцию «Константы» блока «Интерфейс с libusb» добавим константу, связанную с установкой направления вращения двигателя:

const int RQ_SM_SET_DIR = 0x31;

2. В секцию «Адреса портов, регистров и порты микроконтроллера ATMega16» добавим константы для работы с регистром масок прерываний TIMSK:

        public const byte aTIMSK    = 0x39;
        public const byte TOIE0     = 0;
        public const byte OCIE0     = 1;
        public const byte TOIE1     = 2;
        public const byte OCIE1B    = 3;
        public const byte OCIE1A    = 4;
        public const byte TICIE1    = 5;
        public const byte TOIE2     = 6;
        public const byte OCIE2     = 7;

Раньше мы не использовали прерывания от таймера, поэтому этот фрагмент в «firmware simple» просто не был реализован. Естественно, нужно добавить и реализацию свойства TIMSK.

3. Сделаем это в секции «Работа с регистрами TIMER1»:

public byte TIMSK
{
   set
   {
      usb_control_msg(handle,
                      USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
                      RQ_IO_WRITE,
                      value, aTIMSK, null, 0, 5000);
   }
   get
   {
      usb_control_msg(handle,
                      USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
                      RQ_IO_READ,
                      0, aTIMSK, buffer, 1, 5000);
 
      return buffer[0];
   }
}

4. Ну и, наконец, свойство smDir, задающее направление вращения двигателя:

public int smDir
{
   set
    {
        usb_control_msg(handle,
                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
                        RQ_SM_SET_DIR,
                        ((value > 0)? 1 : 0),
                        0, null, 0, 5000);
    }
}

Все. Модификация класса-обертки закончена.

Теперь разберемся с главным файлом приложения (файл Form1.cs). Готовый файл можно найти в проекте хоста (папка «02 Быстрый вариант» архива [1]). Краткие комментарии ниже.

1. После успешного создания объекта dev класса ATMega16 производится инициализация таймера TIMER1. Выбираем режим 4 – обнуление таймера при совпадении счетчика со значением, находящимся в регистре OCR1A (единичка в бите WGM12 регистра TCCR1B, см. Datasheet на ATMega16). Коэффициент деления тактовой частоты выбираем 1024 (биты CS12 и CS10 в 1, а CS11 – в 0). При этом 16 разрядный счетчик перекроет весь необходимый нам диапазон частот (здесь я ориентировался на свой микродозатор, для которого, собственно говоря, и делалась вся эта разработка).

2. Далее посылаем в регистр OCR1A какое-нибудь значение по умолчанию (здесь оно берется из компонента numericUpDownMs.Value). В конце метода соответствующие биты порта C настраиваются на вывод.
Далее вся работа приложения основана на обработке событий от элементов управления, расположенных на форме.

3. При нажатии на кнопку «Старт/Стоп» вызывается метод checkBoxStartStop_CheckedChanged(), в котором, в зависимости от состояния кнопки (нажата или отжата), происходит либо разрешение, либо запрет прерываний от таймера в микроконтроллере (бит OCIE1A регистра TIMSK). Дальше генерацией шаговых импульсов двигателя занимается уже сам микроконтроллер (точнее – его аппаратный таймер TIMER1) независимо от хоста.

4. При переключении направления вращения двигателя (радио кнопки radioButtonForward и radioButtonBack) происходит вызов метода radioButtonForward_CheckedChanged(). В этом методе свойству smDir присваивается значение +1 или -1. При этом по USB производится установка переменной inc (в firmware) в такое же значение. Это сразу же отражается на направлении вращения двигателя.

5. При изменении значения компонента numericUpDownMs, вызывается метод numericUpDownMs_ValueChanged(), в котором происходит вычисление нового значения регистра OCR1A и присваивание ему этого значения. Текущее значение счетчика (TCNT1) при этом обнуляется. Теперь шаговый двигатель будет делать шаги с новой частотой.

6. Чтобы не греть двигатель по окончанию работы программы (таймер микроконтроллера работает независимо от хоста!) в методе Form1_FormClosing(), вызываемом при закрытии формы приложения, происходит запрет прерываний от таймера микроконтроллера и обнуление тока всех обмоток двигателя.

Вот, собственно говоря, и все приложение. Компилируем и запускаем. Теперь измерим длительности импульсов на каком-нибудь из портов (PC0, PC1, PC6 или PC7) микроконтроллера как и в предыдущем (простом) варианте программного обеспечения. Результат такого эксперимента представлен на Рис.6. Видно, что теперь длительность импульсов на портах микроконтроллера совпадает с длительностью импульсов, задаваемых в приложении хоста во всем нужном нам диапазоне.

stepmoto06-avr-usb-mega16.png

Рис.6. Теперь можно работать на любых частотах

[Микродозатор]

Итак, мы решили проблему управления шаговым двигателем на высоких частотах за счет использования периферии микроконтроллера (в данном случае - аппаратного таймера TIMER1). Тем самым нам удалось обойтись без использования какого-либо специализированного контроллера шаговых двигателей. Замечательно и то, что переход от первого варианта системы ко второму происходил только за счет изменения программного обеспечения, без каких либо модернизаций «железа».

Расширенный вариант программного обеспечения, описанного выше, используется в реальном прототипе микродозатора жидкостей. В его основе лежит шприцевой насос, приводимый в действие шаговым двигателем. В качестве модели насоса был взят насос от жидкостного хроматографа Милихром. Там используется неплохой отечественный шаговый двигатель ДШИ-200-1. Он работает довольно устойчиво от этого же силового модуля, которое рассмотрено в данной статье выше.

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

1. Элементы управления откалиброваны в естественных для дозатора единицах. Объемы – в микролитрах, скорости подачи – микролитры/мин.
2. Естественно, для работы реальных устройств необходима обработка сигналов от ограничителей диапазона перемещения поршня насоса. При наборе раствора – это сигнал от концевого выключателя (логический 0), расположенного снизу. При подаче – сигнал от датчика давления. При засорении капилляров происходит повышение давления и на выходе датчика формируется логический 0. Этот же сигнал формируется и при достижении поршнем насоса предельного положения при подаче. Обработка этих сигналов производится на стороне firmware.
3. Для дозатора необходим режим подачи (или набора) заданного количества жидкости, после чего насос должен остановиться. Этот функционал тоже реализован в firmware.
4. Еще один необходимый элемент дозатора – счетчик и передача хосту количества поданной или набранной жидкости (в том числе и в режиме накопления, т.е. за несколько включений дозатора в различных режимах).
Прошивка, исходные файлы firmware и полный проект хоста для Visual Studio 2008 Express Edition можно найти в архиве [1], в папке «03 Расширенный вариант». Общий вид прототипа микродозатора показан на Рис.7. Как выглядит приложение хоста можно посмотреть на Рис.8.

stepmoto07-avr-usb-mega16.jpg

Рис.7. Общий вид прототипа микродозатора

stepmoto08-avr-usb-mega16.png

Рис.8. Вид работающего приложения хоста

Байты перемычек (fuse bits) ATmega16 должны быть 0xFF (low) и 0x09 (high).

@ S.V.Kukhtetskiy, 2009
Кухтецкий Сергей Владимирович,
лаборатория проблем материаловедения,
Институт химии и химической технологии СО РАН, Красноярск
E-mail: ku@icct.ru

[Решение возможных проблем]

Здесь описаны некоторые типичные проблемы, которые возникают при использовании прошивки Сергея Кухтецкого. Решение других проблем см. в статье AVR-USB-MEGA16, V-USB, FAQ: переписка по вопросам программирования.

1. Записал в платку прошивку Сергея Кухтецкого с помощью загрузчика USB и программы Khazama, но платка не определяется как устройство USB. Если снова установить перемычку для активации загрузчика USB, то платка определяется, и загорается светодиод. В чем проблема? Ответ: платка у Вас исправна, но Вы записали в неё не ту прошивку. Например, прошивка соответствует другой частоте кварца, не той что используется на Вашей макетной плате AVR-USB-MEGA16. Прошейте HEX-файл прошивки Сергея Кухтецкого, рассчитанный на нужную частоту кварца, который стоит у Вас. Частоту кварца можно прочитать на его корпусе, например если на корпусе написано 12.000, то кварц на 12 МГц.

2. При подключении платки к компьютеру (в платку записана прошивка Сергея Кухтецкого) система Windows запрашивает драйвер. Что это за драйвер, где его брать? Ответ: это драйвер библиотеки LibUSB, скачайте его по ссылке [11].

3. На моей системе Windows драйвер LibUSB не устанавливается, и о причине система не сообщает. Как быть? Ответ: такое нередко бывает на урезанных версиях Windows. Причина может быть в том, что не отключена система проверки цифровой подписи драйвера, либо пакет драйвера неполон (например, если Вы скачали драйвер по ссылке из статьи на сайте vanoid.ru, то там не хватает некоторых файлов, требуемых для 64-битных версий Windows). Поэтому, во-первых, перезагрузите систему, и при загрузке отключите проверку цифровой подписи драйвера (нажимайте при старте F8, и на черном экране выберите соответствующую нижнюю строчку загрузочного меню). Во-вторых, устанавливайте полную версию драйвера LibUSB (скачайте его по ссылке [11]).

4. Скомпилированное ПО хоста на C# не запускается с ошибкой. Что делать? Ответ: возможно не установлена библиотека .NET 3.5 от Microsoft. В этом случае могут выскакивать разные ошибки (наподобие The application failed to initialize properly 0xc0000135), но программа в любом случае не запустится. Чтобы решить проблему, скачайте и установите эту библиотеку (строка для поиска Microsoft .NET Framework 3.5 site:microsoft.com). Инсталлятор для библиотеки можете скачать по ссылке [11] (инсталлятор требует подключения к интернет, так как он закачивает недостающие модули).

[Ссылки]

1. 130524stepmotor-soft-mega16.zip - исходный код проектов этой статьи (firmware и ПО хоста).
3. Статья из журнала Схемотехника, автор Леонид Ридико «Раз шажок, два шажок...», 2001. Пароль на rar-архив - 075275z2p
4. Макетные платы с интерфейсом USB.
5. AVR-USB-MEGA16: быстрая разработка USB приложений на C# при помощи класса-обертки ATMega16. Класс C# (для Visual Studio Express Edition 2008) и соответствующая прошивка, позволяющие быстро сделать USB HID устройство и написать для него приложение для компьютера. Вы управляете микроконтроллером прямо из кода на C# (дергаете его ножками, читаете регистры и т. п.).
6. avr-usb-russian.rar - библиотека V-USB, примеры, документация на русском языке.
7. Как работать с платой AVR-USB-MEGA16 из Visual Studio (версия 2003). На примере описано управление светодиодом на макетной плате из кода на C++.
8. Projects Based on V-USB site:obdev.at - проекты, которые основаны на V-USB. Все эти проекты можно реализовать на макетной плате AVR-USB-MEGA16.
9. Разработка устройства USB - как начать работу с библиотеками AVR USB и libusb.
10. Общение с контроллером по USB site:speleoastronomy.org - другой пример управления шаговым двигателем, использующий V-USB.
11140808LibUSB-driver.zip - архив с драйвером библиотеки LibUSB, он нужен для корректной работы прошивки Сергея Кухтецкого совместно с операционными системами Windows. Драйвер подходит для всех версий операционных систем Windows XP (32 bit и 64 bit), Windows 7 (32 bit и 64 bit), Windows 8 (32 bit и 64 bit). В этом же архиве найдете инсталлятор для библиотеки .NET 3.5 (требуется для приложений ПО хоста, написанных на Visual Studio C# 2010). 

 

Комментарии  

 
0 #10 Vasilih007 28.05.2011 20:51
Замечательная статья, и благодаря ей я возможно сдам диплом. Но вот такой вопрос - как были выбраны диоды? Ведь нельзя же просто так взять и сказать: "а вот эти должны точно выдержать"?! Ведь можно было взять и диод послабее. Как именно посчитать максимум ЭДС в катушке, чтобы диод оставался работоспособным ?

microsin: поспешили Вы с благодарностями , потому что ответа фактически не будет. Дело в том, что расчет такой схемы довольно сложен (при желании можете найти в учебниках), поэтому расчет делается только в крайнем случае, и очень приблизительно (считай с потолка), и берется диод с запасом по параметрам на 100..200%. Если так сделать нельзя, то просто подгоняется схема включения - для уменьшения выброса обратного напряжения снижают скорость нарастания импульса, а для ограничения тока ставят гасящие резисторы. В этой схеме скорость нарастания импульса противоЭДС ограничена переходными емкостями переходов транзисторов (попробуйте-ка их учесть в расчетах), а ток импульса ограничен активным сопротивлением обмоток, монтажа и внутренним сопротивлением блокирующих конденсаторов (как Вы собираетесь их учитывать, интересно?). Поэтому никто собственно и не рассчитывает такую схему.
Цитировать
 
 
0 #9 Bиталий 20.05.2011 23:40
Подскажите пожалуйста, как переделать схему, чтобы управлять не одним,а несколькими ШД? Какую плату ставить и какие изменения в программе?

microsin: чтобы управлять несколькими ШД, лучше применить макетную плату AVR-USB162 (или AVR-USB162MU), на которой стоит чип с аппаратным USB. Схему ключей менять не надо, просто их будет больше. Программу firmware придется переделать для поддержки нескольких ШД. Как переделать - на этот вопрос в комментариях ответить невозможно.
Цитировать
 
 
0 #8 BraMix 11.05.2011 01:48
А как сделать что бы он крутился вперед-назад???

microsin: для изменения направления вращения нужно поменять порядок чередования фаз.
Цитировать
 
 
0 #7 fasty 11.03.2011 01:26
Здравствуйте!!! Сразу извиняюсь т.к. я полный нуб в этой теме, но можете по возможности ответить на следующие вопросы:
1) какая приблизительно доля от заявленного производителем момента остается при использовании одной фазы?
2) мешает ли что-нибудь организовать полношаговый режим с двумя включенными фазами в данном примере тупо изменив немного программный код?
3) можно ли управлять биполярным двигателем?
4) Можно ли управлять таким устройством двигателями уровня ДШИ-200-3-3 (FL57...) и вообще какой предел?
5) Можно ли использовать AVR-USB-MEGA16 в качестве микроконтроллер а перед L297+L298N или L6208?

microsin: пишите лучше в почту, потому что Ваши вопросы вызывают слишком много вопросов, и о чем Вы спрашиваете, мало понятно.

1) Шаговый двигатель на одной фазе - это как? Наверное, моих телепатических способностей недостаточно.
2) Ничто не мешает.
3) Можно.
4) Можно. Пределов никаких, если отсутствует техническое задание.
5) Конечно можно.
Цитировать
 
 
0 #6 Сергей 16.02.2011 02:17
А у меня 4 провода, как мне подключать?
Цитировать
 
 
0 #5 NEW_Domine 19.01.2011 07:57
Цитирую Smith:
пс: у меня 6 проводов 3 вверху и 3 в низу

Смит, у Вас "Униполярный шаговый двигатель с постоянными магнитами", т.е. у вас на нём 2 обмотки со срединными отводами.
Цитировать
 
 
0 #4 Глазастер 30.10.2010 18:06
На меге8 управляю 3 шаговиками через вритуальный COM-порт, в полушаговом режиме :-*. А есть желание в микрошаговом!
куда можете отправить для получения знаний о данном виде коммутации? Или что посоветуете? Cпасибо за внимание!

microsin: если по ссылке [3] ничего подходящего для Вас нет, то тогда надо искать специальную литературу. Проектом для mega8 поделитесь? Хочу статью написать.
Цитировать
 
 
0 #3 Михаил 06.06.2010 23:01
Добрый вечер, меня интересует возможно ли это устройство использовать для управления независимо четырьмя ШГ... и осуществить обратную связь с концевыми и нулевого положения датчиками?

microsin: да, это возможно, но точность и скорость управления будут зависеть от того, каким образом Вы все это реализуете, и будет ли использована библиотека V-USB - её использование поглощает 60..80 процентов процессорного времени ATmega16.
Цитировать
 
 
0 #2 Smith 26.03.2010 23:29
Спасибо за быстрый ответ. Хорошо я попробую, но прежде прошу помочь. Как я у вас на картинке вижу так это то что там у мотора 5 проводов. Красный, синий, белий, оранжевый подключены к транзисторам (выходит к плюсу) и потом подаётся позитивний сигнал поочереди.

а коричневий подключин думаю к минусу?

если так то мне понатно что у мотора есть питанийе -, а + управлаем шагами.

если я правилно понял то как понять какой именно -.

ведь просто так нельзя подавать поочереди на каждий провод позитивний сигнал.

please help

пс: у меня 6 проводов 3 вверху и 3 в низу

заранее спасибо

microsin - агенту Смиту: попробую ответить на вопросы по порядку, как умею.

"Красный, синий, белий, оранжевый подключены к транзисторам (выходит к плюсу) и потом подаётся позитивний сигнал поочереди." - агент, тут Вы слишком сильно зашифровались, понять о чем идет речь - совершенно невозможно. В реальной жизни все совсем по другому - 4 конца от 4 обмоток (какие цвета у проводов, совершенно не важно) подключаются по одному на коллекторы 4-х транзисторов (т. е. на эти концы подается не плюс, а МИНУС в момент коммутации соответствующей фазы), а другие 4 конца всех обмоток соединены вместе и подключены к плюсу источника питания (т. е. в момент коммутации фазы на них подают ПЛЮС, а не минус).

"а коричневий подключин думаю к минусу" - к минусу ничего не подключено, и никаких коричневых в глаза не видел - хотите верьте, хотите нет. На допросе тоже ничего не скажу, даже если пытать будут.

"если так то мне понатно что у мотора есть питанийе -, а + управлаем шагами. если я правилно понял то как понять какой именно -. ведь просто так нельзя подавать поочереди на каждий провод позитивний сигнал." - вам, может, что-то и понятно, но мой мозг скоро закипит. Эх, агент, писали бы лучше по английски, что ли... ну ничегошеньки непонятно, хоть убейте. В чем вопрос, и о чем тут идет речь? Dear agent Smit, write please your questions in simple human language - in english. My russian is not so good.

"пс: у меня 6 проводов 3 вверху и 3 в низу" - одно предложение понял, это радует. Скорее всего у Вас, агент, в моторчике 3 обмотки, и три конца сверху и снизу - концы обмоток. Воспользуйтесь тестером для прозвонки, чтобы убедиться в этом. Если так и есть, то Вам понадобится делать не 4 фазы, а только три. Лучше всего применить мост из 6 транзисторов.

"заранее спасибо" - право, не стоит благодарности. Я всем помогаю, но агентам - в первую очередь.
Цитировать
 
 
0 #1 Smith 26.03.2010 05:20
Здравствуйте! Спасибо за статью! Мне вот только интересно - как узнать на пошаговом двигателе, какой провод относится к какой обмотке. Искал в Инете - ничего не нашёл. Может, есть для всех пошаговых двигателей общее правило? Заранее благодарю...

microsin: правило очень простое - никакого правила не существует. Не имеет значения - какой провод к какой обмотке относится. Т. е. подключаете обмотки от балды и все будет работать. Если направление вращения не совпадает с ожидаемым, то просто либо меняют местами две обмотки, либо меняют порядок смены фаз.
Цитировать
 

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


Защитный код
Обновить

Top of Page