Страница 1 из 5

Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 26 ноя 2013, 22:03
AntonChip
По просьбе пользователя 5335 выкладываю исходник программы управления биполярным шаговым двигателем, исходник переделанный, двигатель работает только тогда когда нажата кнопка "вперед" или "назад", когда кнопка отпускается двигатель останавливается. Оригинал статьи здесь http://radioparty.ru/programming/avr/c/ ... step-motor. Схема осталась без изменений.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 15 янв 2015, 21:51
AntonChip
Вот еще одна программка, по спадающему импульсу на входе внешнего прерывания двигатель поворачивается на определенное количество шагов, затем останавливается.

Код: Выделить всё

// Подключение биполярного шагового двигателя к AVR
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> 

// Полношаговый режим 2 фазы
// Направление вращения по часовой стрелке
unsigned char cw_dir[4]= 
{
0b00000001,
0b00000010,
0b00000100,
0b00001000
};

volatile unsigned char step_index, count_2, status;
volatile unsigned int ovftimes;

// Прерывание по переполнению Т0
ISR(TIMER0_OVF_vect)
{
static unsigned int count = 1;
count++;

if(count >= ovftimes) // Применяем задержку
{
cli(); // Запрещаем прерывания

count_2++; // Считаем кол-во шагов

if(status) // если status == 1 крутим двигатель
PORTB = cw_dir[step_index++];
else       // иначе останавливаем
PORTB = 0x00;

if(step_index >= 4)
{
step_index = 0;
}

if(count_2 > 8) // Если кол-во шагов превысит определенное значение останавливаем двигатель
{
status = 0;
}

count = 0; // Сброс счетчика
TCNT0 = 0; // Старт счетчика с нуля
sei(); // Глобально разрешаем прерывания
}
}

// прерывание по вектору INT0
ISR(INT0_vect)
{
status = 1; // Запускаем двигатель
count_2 = 1;
}

int main(void)
{
DDRB = 0b00001111; // PB0, PB1, PB2, PB3 - выходы
PORTB = 0x00; // Лог. нули на выходе

ADCSRA = (1 << ADEN) // разрешение АЦП
      | (1 << ADPS2) // предделитель на 64 (частота АЦП 125kHz)
	  | (1 << ADPS1);
ADMUX = 0x00; // ADC0 - вход, внешний ИОН 5 Вольт

GICR |= (1 << INT0); // Разрешаем внешние прерывания
MCUCR |= (1 << ISC01); // Прерывание по заднему фронту INT0

TCCR0 |= (1 << CS01); // Предделитель на 8
TCNT0 = 0; // Старт счетчика с нуля
TIMSK |= (1 << TOIE0); // Разрешаем прерывания по переполнению Т0

ovftimes = 10; // первоначальная задержка

sei(); // Глобально разрешаем прерывания

while(1) 
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем пока завершится преобразование
ovftimes = ADCW; // Значение временной задержки
}
}

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 14:04
Valeriy
Сколько не пытался скомпилировать в HEX - не получается. В программе CodeVisionAVR 3.012 при компиляции пишет ошибку по 2 и 19 строке. Пробовал в разных программах, но так и не смог сделать. Видимо что то не так делаю или в коде дело . Был бы рад получить готовый HEX файл! И еще, если не трудно, сделайте количество шагов изменяемым в 2 раза ( 4 вместо 8), путем подачи на какой-нибудь порт единицы.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 18:14
AntonChip
Пишу в AVRStudio4, проект во вложении.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 18:44
Valeriy
Спасибо! Сейчас буду пробовать.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 20:54
AntonChip
Valeriy писал(а):Спасибо! Сейчас буду пробовать.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.
Может имеет смысл начать изучать AVRStudio?
Переделал, пробуйте

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 21:47
Valeriy
Эта прошивка не от шагового двигателя. Посмотрел *с файл, там ''4 канальный блок управления с функцией задержки''

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 22:28
AntonChip
Valeriy писал(а):Эта прошивка не от шагового двигателя. Посмотрел asm файл, там ''4 канальный блок управления с функцией задержки''
Извиняюсь, перезалил архив

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 16 янв 2015, 23:05
Valeriy
Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 17 янв 2015, 00:09
AntonChip
Valeriy писал(а):Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.
Переключатель шагов на PD0
Частота контроллера должна быть 8МГц, у Вас наверное с завода 1МГц, надо поменять фьюзы

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 17 янв 2015, 07:54
Valeriy
Фьюзы выставлены правильно на RC 8МГц. Извиняюсь, не подключил питание на пины AVCC и AREF МК, поэтому не работала регулировка скорости.
Скачал и установил AVR Studio4. Ваш проект хорошо компилируется в этой программе. Пробовал менять в коде количества импульсов - все как по нотам работает. Подставлял файл кода от начальной «схемы управления униполярным шаговым двигателем» тоже скомпилировался и получил рабочий HEX файл. Так что, огромное Вам СПАСИБО за оказанную помощь!

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 18 янв 2015, 20:31
Valeriy
Попытался на базе этой программы, урезав до минимума задачу, воткнуть этот код в ATtini13, но не получается. Hex получаю, а программа не работает. Для высвобождения портов в программе убрал регулировку оборотов (поставил постоянную скорость) и постоянное количество шагов. Вроде все правильно сделал, но работать не хочет. Может посмотрите, что не так. Для моей задачи в самый раз использовать ATtini13.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 18 янв 2015, 23:04
AntonChip
Вот код для Attiny13, думаю справитесь если надо что то подправить:

Код: Выделить всё

// Подключение биполярного шагового двигателя к AVR
//  Target  	  : ATTiny13
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> 

// Полношаговый режим 2 фазы
// Направление вращения по часовой стрелке
unsigned char cw_dir[4]= 
{
0b00000001,
0b00000100,
0b00001000,
0b00010000
};

volatile unsigned char step_index, count_2, status;
volatile unsigned int ovftimes, step_limit;

// Прерывание по переполнению Т0
ISR(TIM0_OVF_vect)
{
static unsigned int count = 1;
count++;

if(count >= ovftimes) // Применяем задержку
{
cli(); // Запрещаем прерывания

count_2++; // Считаем кол-во шагов

if(status) // если status = 1 крутим двигатель
PORTB = cw_dir[step_index++];
else       // иначе останавливаем
PORTB = 0x00;

if(step_index >= 4)
{
step_index = 0;
}

if(count_2 > step_limit) // Если кол-во шагов превысит определенное значение(step_limit) останавливаем двигатель
{
status = 0;
}

count = 0; // Сброс счетчика
TCNT0 = 0; // Старт счетчика с нуля
sei(); // Глобально разрешаем прерывания
}
}

// прерывание по вектору PB4
ISR(INT0_vect)
{
status = 1; // Запускаем двигатель
count_2 = 1;
}

int main(void)
{
DDRB = 0b00011101; // PB0, PB2, PB3, PB4 - выходы
PORTB = 0x00; // Лог. нули на выходе

GIMSK |= (1 << INT0); // Разрешаем внешние прерывания
MCUCR |= (1 << ISC01); // Прерывание по заднему фронту PB4

TCCR0B |= (1 << CS01); // Предделитель на 8
TCNT0 = 0; // Старт счетчика с нуля
TIMSK0 |= (1 << TOIE0); // Разрешаем прерывания по переполнению Т0

ovftimes = 100; //  задержка

sei(); // Глобально разрешаем прерывания

while(1) 
{
step_limit = 80;
}
}


Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 19 янв 2015, 18:10
Valeriy
Скомпилировал - все нормально. Подправил скорость и количество шагов как мне надо и исправил "мои" неверные коментарии по PB4. Очень гибкая в настройке программа. Большое Вам спасибо!

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 20 янв 2015, 13:13
Valeriy
Вопрос снят

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 31 янв 2015, 19:08
Valeriy
Здравствуйте Антон!
Схема управления, выполненная на МК ATtini13A с Вашей прошивкой, прекрасно работает, но появилась такая вот проблема. Как я уже писал, схема применяется у меня для управления наружными часами. Так вот, при перемещении стрелок от основного двигателя (220 вольт) на основном циферблате, за счет усилия на дифференциале, шаговый двигатель иногда самопроизвольно прокручивается. В результате время на циферблате часов не соответствует действительности. Это происходит из-за того, что на шаговом двигателе отсутствует фиксация в режиме ожидания. Такую фиксацию можно сделать так. На свободный порт РВ5 МК завести сигнал «единицы», которая будет появляться, когда происходит вращение двигателя (добавить в коде) и исчезать в режиме ожидания. Этот сигнал будет управлять транзистором, который будет подавать общий плюс на обмотки шагового двигателя в режиме прокрутки. Параллельно транзистору включается резистор, номинал которого будет определять ток фиксации двигателя в режиме ожидания после окончания прокрутки. В коде программы также надо исключить нули на выходных портах в режиме ожидания. При остановке двигателя отключение напряжения на обмотке, которая попала на данный момент (зависит от задания в коде количества импульсов) не производится.
Другой вариант такой. Ток в обмотке, попавшей для режима ожидания, с помощью ШИМ (задается в коде) снижается до необходимого. Но, не знаю, на МК ATtini13A такое получится или нет. А это было бы здорово!
Если не трудно, сделайте, пожалуйста, в прошивке необходимые изменения. Иначе такая прекрасная схема у меня работать не сможет! Надеюсь на Вашу помощь!

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 31 янв 2015, 21:50
AntonChip
А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 31 янв 2015, 22:01
Valeriy
AntonChip писал(а):А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir
Так L297 это только лишь драйвер ш.д.. К нему опять надо делать схему счетчика шагов (в моем случае). Опять получится большая схема - у меня сейчас подобная. Все-таки, если не трудно, первый вариант реализуйте. Там мне почти ничего переделывать не надо, только дополнить транзистор и резистор в схему. Я пытался сам переделать код, но не получается.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 02 фев 2015, 11:27
passlight
Добрый день ребята. Схему взял из шапки. Транзисторную часть заменил UNL2003...подойдет, будет работать?
Вопрос по прошивке bipolar_step_motor_2.rar...можете выложить готовый HEX или как его скомпилировать и какие фьюзы выставлять для атмеги8?
подскажите пожалуйста, буду благодарен.

Re: Подключение шагового двигателя к микроконтроллерам AVR

Добавлено: 02 фев 2015, 13:41
Valeriy
passlight писал(а):Добрый день ребята. Схему взял из шапки. Транзисторную часть заменил UNL2003...подойдет, будет работать?
Вопрос по прошивке bipolar_step_motor_2.rar...можете выложить готовый HEX или как его скомпилировать и какие фьюзы выставлять для атмеги8?
подскажите пожалуйста, буду благодарен.
Скачайте программу "AVR Studio 4". Как получить в ней HEX файл расписано в интернете, я прошел через это. Через нее выставите и фьюзы и саму программу. Очень легко. Про фьюзы написано в тексте. Нужно выставить у новой микросхемы внутренний генератор на RC и частоту 8 МГц. Остальное по умолчанию. В первом сообщении во вложении есть HEX файл. Внимательно просмотрите папку "default"