Шаговый двигатель 4 провода подключение – Tokzamer

Шаговый двигатель 4 провода подключение – Tokzamer Роботы

Шаговые двигатели: особенности и практические схемы управления. часть 2

Журнал “R ADIOLOCMAN”, февраль 2023 г.

Владимир Рентюк, г. Запорожье, Украина

Часть первая.

Часть 2. Схема системы управления

Наиболее важные общие вопросы, касающиеся использования шаговых двигателей, были рассмотрены выше, чтобы помочь вам понять их. Но, как гласит наша любимая украинская пословица: “Не поверю, пока не проверю”. Давайте перейдем к практической части. Как уже упоминалось, шаговые двигатели стоят недешево. Но их можно найти в старых принтерах, флоппи-дисководах и лазерных дисководах, например, SPM-20 (шаговый двигатель для позиционирования головок в дисководах Mitsumi 5″25) или EM-483 (из принтера Epson Stylus C86), которые можно найти в магазинах хлама или купить за бесценок на радиобазарах. Некоторые примеры показаны на рисунке 8.

Монополярный двигатель является самым простым в эксплуатации. Причина кроется в простоте и низкой стоимости их драйвера управления обмоткой. На рисунке 9 показана принципиальная схема драйвера, используемого автором статьи для управления униполярным шаговым двигателем серии P542-M48 [6].

Помимо учета максимального тока переключения и емкости затвора, необходимо также учитывать выбор типа транзистора на ключе управления обмоткой. МОП-транзисторы, подключенные непосредственно к переключающим ИС, в некоторых случаях могут быть неприемлемы. Большинство затворов оснащены резисторами небольших номиналов, которые подключаются последовательно с ними. Ключи также должны управляться соответствующим драйвером, чтобы обеспечить зарядку/разрядку их входной емкости. В некоторых решениях в качестве ключей предлагаются биполярные транзисторы. Они подходят только для двигателей с малым током обмотки и очень низкой мощностью. Для двигателя с рабочим током 230 мА ток управления на базе ключа должен быть не менее 15 мА (в зависимости от того, работает ли ключ в нормальном режиме при 1/10 рабочего тока. 23 мА). Поскольку микросхемы 74HCxx не могут генерировать такой ток, требуются драйверы. Если вы предпочитаете хороший компромисс, можно использовать IGBT, которые сочетают в себе преимущества полевых и биполярных транзисторов.

Смотрите про коптеры:  Пылесосчика Xiaomi на русский язык

Использование МОП-транзисторов RDC(ON), специально разработанных с учетом тока и сопротивления открытого канала, по мнению авторов, является наиболее эффективным способом управления коммутацией обмоток двигателей малой мощности. Мощность, рассеиваемая на ключах для двигателя серии P542-M48, выбранного в качестве примера, при полной остановке ротора не превысит

PVT = RDC(ON) × I2 = 0.25 × (0.230)2 = 13.2 мВт.

Транзисторы I RLML2803 с RDC(ON) = 0,25 Ом имеют коэффициент рассеивания 540 мВ и постоянный ток стока 0,93 А при 70 °C. Таким образом, эти драйверы полностью соответствуют требованиям и обеспечивают надежную работу. Вследствие низких частот переключения, в большинстве случаев вышеприведенной оценки достаточно. В отсутствие подробного рассмотрения особенностей переключателей в данной статье, для их выбора и полного расчета можно воспользоваться методом, изложенным, например, в [7].

Еще одним важным моментом являются шунтирующие диоды (VD1), которые шунтируют обмотку двигателя. VD4 на рисунке 9). Эти диоды используются для маскировки ЭДС самоиндукции, возникающей при отключении органов управления от сети. Неправильный выбор диодов приведет к выходу из строя как транзисторных ключей, так и устройства в целом. Мощные МОП-транзисторы часто уже разработаны с диодами такого типа.

Режим управления двигателем задается коммутатором. Как уже упоминалось выше, наиболее удобным и эффективным режимом управления является управление с перекрытием фаз (рис. 4b). Этого можно легко добиться с помощью триггеров. На рисунке 10 показана практическая схема универсального коммутатора, который автор данной статьи использовал как во многих отладочных модулях (включая вышеупомянутый контроллер), так и в практических приложениях.

Эта схема может быть использована для любого типа двигателя (униполярного или биполярного). На входе “STEPS” устанавливается частота, управляемая внешним генератором (любой рабочий цикл), на входе “DIRECTION” устанавливается направление вращения. Для объединения этих сигналов с помощью выходов с открытым коллектором могут потребоваться подтягивающие резисторы (не показаны на рисунке 10). На рисунке 11 показана временная диаграмма для переключателя.

В Интернете похожая схема была сделана не с D-триггерами, а с JK-триггерами. Будьте осторожны! Некоторые из этих схем содержат ошибки в подключении. Поскольку схема переключателя последовательности фаз не нуждается в реверсе, ее можно упростить (см. рис. 12), скорость останется прежней, а схема управления будет выглядеть как на рис. 11 (осциллограмма до переключения последовательности фаз).

Поскольку к сигналу “STEPs” нет специальных требований, для его формирования можно использовать любой генератор. Автор использовал генератор ИМС таймера 555 для своих отладочных модулей (рис. 13).

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

На рисунке 14 обмотки двигателя питаются двумя постоянными напряжениями: 12 В в режиме работы и 6 В в режиме удержания. Формулу для расчета выходного напряжения можно найти в [8]. Активация рабочего режима требует подачи высокого логического уровня на контакт “STOP” на разъеме X1. Возможность снижения напряжения питания обусловлена тем, что, как уже отмечалось, момент удержания шаговых двигателей превышает момент вращения. Так, для рассматриваемого двигателя P542-M48 момент удержания с редуктором 25:6 составляет 19,8 Н-см, а момент вращения – всего 6 Н-см. Благодаря такому подходу, потребляемая мощность двигателя при остановке снижается с 5,52 Вт до 1,38 Вт! Выключение двигателя завершается подачей высокого логического сигнала на контакт “ON/OFF” разъема X1.

Если схема управления имеет выход, подключенный к транзисторам с открытым коллектором, ключи VT1, VT2 можно не использовать, а вместо них напрямую подключить выходы.

Примечание: В этом варианте не должны использоваться резисторы Pull-up!

В качестве дросселя автор использовал катушку SDR1006-331K (Borns). Формирователи напряжения могут работать с источниками питания ниже 16 – 18 В, что не скажется на их характеристиках. Еще раз обращаем ваше внимание: при самостоятельных расчетах не забудьте учесть, что формирователь обеспечивает режим с наложением фаз, то есть необходимо заложить номинальный ток силовой цепи, равный удвоенному максимальному току обмоток при выбранном напряжении питания.

Задача управления биполярными двигателями более сложная. Главная проблема – это водитель. Для этих двигателей требуется драйвер мостового типа, а изготовление такого драйвера, особенно в наши дни с использованием дискретных компонентов, является неблагодарной задачей. На самом деле, в этом нет необходимости, поскольку существует очень большой выбор специализированных интегральных схем. Все эти ИС можно условно разделить на два типа. Первый – это L293DSTMicroelectronics [9] или его варианты Texas Instruments, которые очень популярны среди энтузиастов робототехники. Они относительно недороги и подходят для управления маломощными двигателями с током обмотки до 600 мА. ИС имеют защиту от перегрева; они должны быть установлены с теплоотводом с помощью фольги на печатной плате [9]. Второй тип – LMD18245 [2], с которым читатели уже знакомы по публикации в [1].

Биполярный шаговый двигатель 20M020D2B 12V/0.1A с низким энергопотреблением управлялся с помощью драйвера L293DD как часть схемы для исследования шаговых двигателей. Этот драйвер удобен тем, что содержит четыре полумостовых ключа, поэтому для управления биполярным шаговым двигателем требуется только одна ИС. [10] Эта схема многократно повторялась на сайтах Интернета и подходит для использования в качестве тестовой платы. ИС драйвера показана на рисунке 15, поскольку именно эта часть нас сейчас интересует, а рисунок 6 (Управление биполярным шаговым двигателем) может сбить с толку начинающего пользователя. Поскольку на нем показаны внешние диоды, это вводит в заблуждение, так как на самом деле они встроены в ИС, и поэтому прекрасно подходят для обмоток двигателей с низким энергопотреблением. Естественно предположить, что драйвер L293D будет работать с любым выключателем. Вход R выключает драйвер по логическому нулю.

Существует различная нумерация и количество выводов для микросхем L293 в зависимости от их производителя и суффикса.

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

Поскольку драйвер LMD18245 имеет только два канала, для реализации схемы управления ему требуется две ИС, в отличие от драйвера L293DD. В драйвере LMD18245 вы получаете технологию DMOS, защиту от перегрева и короткого замыкания, а также удобный 15-контактный корпус TO-220, позволяющий легко отводить излишки тепла от его корпуса. В качестве задающего генератора мы использовали схему на рисунке 13, но с резистором R2, увеличенным до 4,7 кОм. Для подачи одиночных импульсов используется кнопка BH1, которая позволяет сдвинуть ротор двигателя на один шаг. S1 определяет направление, в котором будет вращаться ротор. Включение и выключение двигателя осуществляется переключателем S2. При выключении двигателя ротор двигателя освобождается, и его вращение управляющими импульсами становится невозможным. Режим удержания снижает максимальный ток обмоток двигателя с двух ампер до одного ампера. Благодаря тому, что управляющие импульсы не подаются, ротор двигателя остается в заблокированном положении с вдвое меньшим потреблением энергии. В этом режиме, если импульсы подаются, вращение двигателя происходит на низких скоростях с пониженным крутящим моментом. Однако следует отметить, что поскольку при двухфазном включении включаются обе обмотки, ток двигателя удваивается, и схема драйвера должна быть разработана с учетом обеспечения заданного тока в обеих обмотках (резистор R3, R8).

Он состоит из двунаправленного двухфазного формирователя, установленного на D-триггерах (рис. 10). Максимальный ток драйвера регулируется резисторами на выводе 13 ИС LMD18245 (R3, R8), а также двоичным кодом на выводах управления током (выводы 8, 7, 6, 4). В спецификациях драйверов приведена формула для расчета максимального тока [2]. Используя импульсный метод, мы ограничиваем ток. Ток “рубится”, когда он достигает максимального заданного значения. Параллельные RC-цепочки подключаются к выводу 3 драйвера для установки параметров этого “рубильника”. Его преимущество в том, что токопотребляющий резистор, который не подключен непосредственно к двигателю, имеет большой номинал и рассеивает очень малую мощность. Если рассматривать рассматриваемую схему, то максимальный ток, выраженный в амперах, будет следующим:

Шаговый двигатель 4 провода подключение – Tokzamer

где:

VDAC REF – опорное напряжение ЦАП (в рассматриваемой схеме 5 В);
D – задействованные разряды ЦАП (в этом режиме используются все 16 разрядов);
RS – сопротивление токоограничивающего резистора (R3 = R8 = 10 кОм).

Поэтому в режиме удержания (поскольку используются 8-битные ЦАП) максимальный ток составит 1 A.

Следует отметить, что драйвер LMD18245 также позволяет осуществлять микрошаговый режим. При использовании этого режима паразитный резонанс будет уменьшен и даже подавлен. Входы ЦАП управляются микропроцессором, который поддерживает подобный режим для указанного драйвера.

Шаговые двигатели, хотя и сложнее в управлении, чем коллекторные, но отказаться от них не так сложно, как видно из предлагаемой статьи. Люди, которые идут по дороге, проходят ее, как говорили древние римляне. Собственно говоря, на практике управление шаговыми двигателями целесообразно осуществлять с помощью микроконтроллеров, поскольку они способны формировать необходимые команды для драйверов и выступать в роли переключателей. Дополнительную информацию и более подробное рассмотрение проблем, связанных с применением шаговых двигателей, кроме указанных выше ссылок [3, 4, 7], можно найти в классической монографии Кенио Такаши [11] и на специализированных сайтах Интернета, например [12].

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

Литература:

  1. Рентюк В. «Управление двигателями постоянного тока»
  2. LMD18245 3A, 55V DMOS Full-Bridge Motor Driver, Texas Instruments Inc., April 2023
  3. Емельянов А. В., Шилин А. Н. Шаговые двигатели: учебное пособие. Волг. ГТУ, Волгоград, 2005
  4. en.nanotec.com
  5. DHS 56 series TECO Electro Devices Co. Ltd.
  6. Geared stepper motor P542-M48 series, Mclennan Servo Supplies Ltd.
  7. Дьяконов В. П., Максимчук А. А., Ремнев А. М., Смердов В. Ю. Энциклопедия устройств на полевых транзисторах. М., СОЛОН-Р, 2002
  8. LM2675 SIMPLE SWITCHER Power Converter High Efficiency 1A Step-Down Voltage Regulator, Texas Instruments Inc., Rev. June 2005
  9. L293, L293D PUSH-PULL FOUR CHANNEL DRIVER WITH DIODES STMicroelectronics, July 2003
  10. Rentyuk Vladimir «Control stepper motors in both directions» EDN March 18, 2023
  11. Кенио Такаши. Шаговые двигатели и их микропроцессорные системы управления: Пер. с англ., М.: Энергоатомиздат, 1987 – 199 с.
  12. stepmotor.ru

Эксперимент №1. l293d attiny44

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

Вместо того чтобы делать его из транзисторов, мы использовали готовую микросхему L293D. Еще одно преимущество этой микросхемы в том, что она имеет специальные выводы Enable1 и Enable2, которые позволяют включать и выключать каждый мост. Это можно использовать для подачи ШИМ-сигнала на каждый мост, что позволяет управлять напряжением питания. В следующих параграфах мы рассмотрим, зачем это может понадобиться.

Кроме того, микросхема L293D может коммутировать напряжение до 36 В и выдавать до 1,2 А на канал, чего должно быть достаточно для питания обмоток нашего электродвигателя.

Таким образом, в настоящее время на территории России действует

В ходе будущих обновлений микропрограммы на управляющие входы и выходы L293D будет подан сигнал ШИМ, чтобы их можно было использовать для управления устройствами OC0A и OC0B.

Управление будет прошито программатором (на схеме не показан):

Вот так позиционируется наша тема:

Теперь вы можете начать эксперименты.

Если подключить обмотки двигателя к напряжению 5 В, то будет протекать следующий ток:

I=U/R = 5В/26Ом = 190мА

Он совсем небольшой. Интересно, как долго он сможет поддерживать такой ток без перегрева.

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

В данном случае амперметр показывает силу тока 150 мА при напряжении на обмотке 2,56 В. Вы можете ясно видеть, как сила тока падает по мере нагрева обмотки. Обратите внимание, что она нагревается не так сильно.

Убедитесь, что напряжение 5 В безопасно для двигателя, покрутив его в разных направлениях. Теперь давайте немного поговорим о различных режимах работы шагового двигателя.

Это достаточно хорошо объяснено здесь.

Мы не станем утомлять вас описанием трех режимов работы шагового двигателя:

  • Однофазный полный цикл – это когда одновременно активируется только одна фаза двигателя, ротор делает один шаг, затем текущая фаза выключается и активируется следующая фаза.
  • Двухфазный полношаговый двигатель – это двигатель, в котором напряжение подается одновременно на две фазы двигателя, так что ротор притягивается двумя обмотками одновременно, что приводит к увеличению крутящего момента.
  • Микрошаговый режим в этом случае использует тот же принцип, что и в двухфазном полношаговом режиме, т.е. две обмотки работают одновременно, но напряжение (и, следовательно, ток) распределяется между ними неравномерно. В действительности это означает, что мы можем разместить двигатель в неограниченном количестве позиций (на практике, конечно, это невозможно). Повышается точность позиционирования.

Попробуем реализовать первые два режима на микросхеме L293D, а драйвер микрошага оставим из второго эксперимента.

Как видно из исходного кода, программа выглядит следующим образом:

Исходный код в среде WinAVR
#define F_CPU 8000000UL  // указываем частоту в герцах

// фьюзы необходимо выставить L: E2; H:DF; Ex:FF; 
// это будет частота 8МГц от внутреннего генератора с выключенным предделителем тактовый частоты (включен по умолчанию и равен 8)

#include <avr/io.h> // подключаем библиотеку АВР

#include <util/delay.h> // подключаем библиотеку задержек

#include <avr/interrupt.h> // подключаем библиотеку прерываний

// управление штатным светодиодом

#define LED_pin PA5

#define LED_ON PORTA |=(1<<LED_pin)

#define LED_OFF PORTA &=(~(1<<LED_pin))

// управление драйвером шагового двигателя L293DD

#define PWM_1 PB2 // OC0A (EN1)

#define PWM_2 PA7 // OC0B (EN2)

#define PWM_1_value OCR0A

#define PWM_2_value OCR0B

// пины управления обмотками шагового двигателя микросхемой L293D

#define IN1 PA0 // к PORTA

#define IN2 PA1

#define IN3 PB1 // к PORTB

#define IN4 PB0

void delay_microsecond (unsigned int delay_time) { // функция реализации задежки в микросекундах
    
	// функция нужна для экономии памяти микроконтроллера

    for(unsigned int delay_us = 0; delay_us<delay_time; delay_us  ) {
	
	    _delay_us(1);
	
	}

}

void delay_millisecond (unsigned int delay_time) { // функция реализации задежки в миллисекундах

    for(unsigned int delay_ms = 0; delay_ms<delay_time; delay_ms  ) {
	
	    _delay_ms(1);
	
	}

}

// функции шагов для полношагового однофазного режима

void step_1_one_phase (void) {

    PORTB &=(~((1<<IN3)|(1<<IN4)));
	
	PORTA &=(~(1<<IN2)); // сначала выключаем 
  
    PORTA |=(1<<IN1); // и только потом включаем
}

void step_2_one_phase (void) {

    PORTA &=(~((1<<IN1)|(1<<IN2)));
	
	PORTB &=(~(1<<IN3));
  
    PORTB |=(1<<IN4);
  
}

void step_3_one_phase (void) {

    PORTB &=(~((1<<IN3)|(1<<IN4))); 
	 
	PORTA &=(~(1<<IN1));
  
    PORTA |=(1<<IN2);
  
	
}

void step_4_one_phase (void) {

    PORTA &=(~((1<<IN1)|(1<<IN2))); 
	
	PORTB &=(~(1<<IN4));
    
    PORTB |=(1<<IN3);
  
}

// функции шагов для полношагового двухфазного режима

void step_1_two_phase (void) {

    PORTB |=(1<<IN4);  
  
    PORTB &=(~(1<<IN3));
  
    PORTA |=(1<<IN1);
  
    PORTA &=(~(1<<IN2));
}

void step_2_two_phase (void) {

    PORTA &=(~(1<<IN2));//2
	
	PORTA |=(1<<IN1);
  
    PORTB |=(1<<IN3);
  
    PORTB &=(~(1<<IN4));
  
}

void step_3_two_phase (void) {

    PORTB |=(1<<IN3);//3
  
    PORTB &=(~(1<<IN4));
	
	PORTA &=(~(1<<IN1));
  
    PORTA |=(1<<IN2);
  
	
}

void step_4_two_phase (void) {

    PORTA |=(1<<IN2);//4
  
    PORTA &=(~(1<<IN1));
    
    PORTB |=(1<<IN4);
  
    PORTB &=(~(1<<IN3));
  
}

void stepper_OFF (void) { // функция отключения двигателя

	// снимаем напрядение с обмоток, если не нужна фиксация в установленном положении, чтобы двигатель не перегревался
	
	PORTA &=(~((1<<IN1)|(1<<IN2)));
	
	PORTB &=(~((1<<IN3)|(1<<IN4)));
	
}

unsigned char step_counter = 0; 

// функция следящая за текущим шагом 

void L293D_step (unsigned int step_quantity, unsigned char direction, unsigned int step_delay, unsigned char phase) { // при вызове функции происходит смена шага

    while(step_quantity>0) { // цикл выполняется, пока не будут выполнены все шаги

        switch(direction) { // в зависимости от установленного направления вращения инкрементируем или декрементируем счётчик шагов
	
			case 'F':
				if(step_counter<3) { step_counter  ; } else { step_counter=0; }
			break;
		
			case 'B':
				if(step_counter>0) { step_counter--; } else { step_counter=3; }
			break;
		
		}
		
		switch(phase) { // выбираем однофазный или двухфазный режим
		
		    case 1: 
			
				switch(step_counter) { // назначаем текущий шаг
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
			
			case 2:
			
				switch(step_counter) { // назначаем текущий шаг
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
		
		}
		
    delay_millisecond(step_delay); // пауза между шагами задаёт скорость вращения двиагетля
	
	step_quantity--; 
	
	} 

}


void PWM_init (void) { // функция инициализации ШИМ

    DDRB |=(1<<PWM_1);

    DDRA |=(1<<PWM_2);

    TCCR0A = (1<<WGM01)|(1<<WGM00)|(1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0); // режим FAST PWM, сброс при совпадении
	
    TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); // предделитель на 8
	
    OCR0A = 255; // коэффициент заполнения ШИМ (0-255)

    OCR0B = 255;

} // конец функции инициализации ШИМ

int main (void) { 

    DDRA |=(1<<LED_pin);
	
    DDRA |=(1<<IN1)|(1<<IN2);

    DDRB |=(1<<IN3)|(1<<IN4);
	
    PWM_init(); // инициализация ШИМ
	
    delay_millisecond(2000);
	
    while(1==1) { 
	   
	LED_ON;
		
        L293D_step(16,'F',100,2); //step(количество шагов, направление F/B, пауза между шагами, однофазный/двухфазный режим)
		
	//stepper_OFF();
		
	delay_millisecond(2000);
		
	LED_OFF;
		
	L293D_step(16,'B',100,2);
		
	//stepper_OFF();
		
	delay_millisecond(2000);
		  
    } 

} 

Эксперимент №3. attiny44-драйвер

В первом эксперименте мы подключили входы EN1 и EN2 микросхемы драйвера к контактам OC0A и OC0B микроконтроллера. ШИМ-сигнал, генерируемый таймером TIMER0, может быть подключен к обмоткам двигателя, что приводит к изменению приложенного напряжения и тока, протекающего через двигатель.

Согласно техническому описанию микроконтроллера ATtiny44, один вывод может обеспечивать ток только 40 мА. Более того, не упоминается, к какому типу тока (пульсирующему или постоянному) относится эта характеристика. Вот так, просто.

Мой опыт работы с микроконтроллерами ATMEL насчитывает более семи лет. Кроме того, я никогда не чувствовал необходимости проверять эту строку в техническом описании.

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

Мы выясним это. Нам нужно выяснить, при каком минимальном токе двигатель вообще может вращаться.

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

Отлично! Двигатель запустился после 40 мА. Кроме того, было рассчитано минимальное значение тока обмотки для обеспечения стабильной работы двигателя, и это значение составило 30 мА.

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

С помощью следующей схемы шаговый двигатель подключен к микроконтроллеру:

Каждый вывод микроконтроллера работает как полумост (он может переключаться между Vcc и GND), поэтому для управления биполярным шаговым двигателем нам потребуется 4 вывода.

Код программы:

Исходный код в среде WinAVR
#define F_CPU 8000000UL  // указываем частоту в герцах

// фьюзы необходимо выставить L: E2; H:DF; Ex:FF; 
// это будет частота 8МГц от внутреннего генератора с выключенным предделителем тактовый частоты (включен по умолчанию и равен 8)

#include <avr/io.h> // подключаем библиотеку АВР

#include <util/delay.h> // подключаем библиотеку задержек

#include <avr/interrupt.h> // подключаем библиотеку прерываний

// управление штатным светодиодом

#define LED_pin PA5

#define LED_ON PORTA |=(1<<LED_pin)

#define LED_OFF PORTA &=(~(1<<LED_pin))

// управление драйвером шагового двигателя L293DD

#define PWM_1 PB2 // OC0A (EN1)

#define PWM_2 PA7 // OC0B (EN2)

#define PWM_1_value OCR0A

#define PWM_2_value OCR0B

// пины управления обмотками шагового двигателя микросхемой L293D

#define IN1 PA0 // к PORTA

#define IN2 PA1

#define IN3 PB1 // к PORTB

#define IN4 PB0


void delay_microsecond (unsigned int delay_time) { // функция реализации задежки в микросекундах
    
	// функция нужна для экономии памяти микроконтроллера

    for(unsigned int delay_us = 0; delay_us<delay_time; delay_us  ) {
	
	    _delay_us(1);
	
	}

}

void delay_millisecond (unsigned int delay_time) { // функция реализации задежки в миллисекундах

    for(unsigned int delay_ms = 0; delay_ms<delay_time; delay_ms  ) {
	
	    _delay_ms(1);
	
	}

}

// функции шагов для двухфазного полношагового режима без драйверов

void step_1_two_phase_DL (void) { // DL - driver less
   
   // первая обмотка
   OCR0A = 160;
   PORTB &=(~(1<<IN4)); 
   
   // вторая обмотка
   OCR0B = 160;
   PORTB &=(~(1<<IN3)); 
    
}

void step_2_two_phase_DL (void) { 
   
   // первая обмотка
   OCR0A = 160;
   PORTB &=(~(1<<IN4)); 
   
   // вторая обмотка
   OCR0B = 95;
   PORTB |=(1<<IN3); 
    
}

void step_3_two_phase_DL (void) { 
   
   // первая обмотка
   OCR0A = 95;
   PORTB |=(1<<IN4); 
   
   // вторая обмотка
   OCR0B = 95;
   PORTB |=(1<<IN3); 
    
}

void step_4_two_phase_DL (void) { 
   
   // первая обмотка
   OCR0A = 95;
   PORTB |=(1<<IN4); 
   
   // вторая обмотка
   OCR0B = 160;
   PORTB &=(~(1<<IN3)); 
    
}

unsigned char step_counter = 0; 

// функция следящая за текущим шагом 

void L293D_step (unsigned int step_quantity, unsigned char direction, unsigned int step_delay, unsigned char phase) { // при вызове функции происходит смена шага

    while(step_quantity>0) { // цикл выполняется, пока не будут выполнены все шаги

        switch(direction) { // в зависимости от установленного направления вращения инкрементируем или декрементируем счётчик шагов
	
			case 'F':
				if(step_counter<3) { step_counter  ; } else { step_counter=0; }
			break;
		
			case 'B':
				if(step_counter>0) { step_counter--; } else { step_counter=3; }
			break;
		
		}
		
		switch(phase) { // выбираем однофазный или двухфазный режим
		
		    case 1: 
			
				switch(step_counter) { // назначаем текущий шаг
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
			
			case 2:
			
				switch(step_counter) { // назначаем текущий шаг
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
		
		}
		
    delay_millisecond(step_delay); // пауза между шагами задаёт скорость вращения двиагетля
	
	step_quantity--; 
	
	} 

}


void PWM_init (void) { // функция инициализации ШИМ

    DDRB |=(1<<PWM_1); 
	
    DDRA |=(1<<PWM_2);

    TCCR0A = (1<<WGM01)|(1<<WGM00)|(1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0); // режим FAST PWM, сброс при совпадении
	
    TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); // предделитель на 8
	
    OCR0A = 160; 
	
    OCR0B = 160;

} // конец функции инициализации ШИМ

int main (void) { // главная функция

    DDRA |=(1<<LED_pin);
	
	DDRA |=(1<<IN1)|(1<<IN2);
	
	DDRB |=(1<<IN3)|(1<<IN4);
	
	PWM_init(); // инициализация ШИМ
	
	delay_millisecond(2000);
	
	while(1==1) { // бесконечный цикл

	    LED_ON;
		
	    L293D_step(16,'F',100,2); //step(количество шагов, направление F/B, пауза между шагами, однофазный/двухфазный режим)
		
            delay_millisecond(2000);
		
	    LED_OFF;
		
	    L293D_step(16,'B',100,2);
		
	    delay_millisecond(2000);
		
	
	   
	} 

} 

Я немного объясню, как работает эта программа. Код из первого эксперимента был изменен. Выходы OC0A и OC0B будут управляться 8-битным TIMER0, о котором я упоминал ранее. Частота тактового сигнала микроконтроллера на частоте 8 МГц составляет 3906 Гц. Таймер настроен на работу в режиме FastPWM с предварительным задерживающим слоем, установленным на 8.

Для изменения полярности сигналов на обмотках вывод микроконтроллера переключается с Vcc на GND путем изменения соответствующего бита в регистре PORTx и изменения коэффициента заполнения ШИМ путем записи значений в регистры OCR0A и OCR0B (значения были подобраны экспериментально).

И вот… :

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

Шаговый двигатель вращается от контактов микроконтроллера без драйверов!

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

Оцените статью
Радиокоптер.ру
Добавить комментарий