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

Модератор: boogyman

Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#1

Сообщение AntonChip »

По просьбе пользователя 5335 выкладываю исходник программы управления биполярным шаговым двигателем, исходник переделанный, двигатель работает только тогда когда нажата кнопка "вперед" или "назад", когда кнопка отпускается двигатель останавливается. Оригинал статьи здесь http://radioparty.ru/programming/avr/c/ ... step-motor. Схема осталась без изменений.
Вложения
bipolar_step_motor_2.rar
Проект AVRStudio4
(38.45 КБ) 3109 скачиваний
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#2

Сообщение 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; // Значение временной задержки
}
}
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#3

Сообщение Valeriy »

Сколько не пытался скомпилировать в HEX - не получается. В программе CodeVisionAVR 3.012 при компиляции пишет ошибку по 2 и 19 строке. Пробовал в разных программах, но так и не смог сделать. Видимо что то не так делаю или в коде дело . Был бы рад получить готовый HEX файл! И еще, если не трудно, сделайте количество шагов изменяемым в 2 раза ( 4 вместо 8), путем подачи на какой-нибудь порт единицы.
Последний раз редактировалось Valeriy 16 янв 2015, 18:40, всего редактировалось 1 раз.
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#4

Сообщение AntonChip »

Пишу в AVRStudio4, проект во вложении.
Вложения
unipolar_step_motor.rar
(27.01 КБ) 2607 скачиваний
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#5

Сообщение Valeriy »

Спасибо! Сейчас буду пробовать.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#6

Сообщение AntonChip »

Valeriy писал(а):Спасибо! Сейчас буду пробовать.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.
Может имеет смысл начать изучать AVRStudio?
Переделал, пробуйте
Вложения
unipolar_step_motor.rar
(38.69 КБ) 2547 скачиваний
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#7

Сообщение Valeriy »

Эта прошивка не от шагового двигателя. Посмотрел *с файл, там ''4 канальный блок управления с функцией задержки''
Последний раз редактировалось Valeriy 17 янв 2015, 20:11, всего редактировалось 2 раза.
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#8

Сообщение AntonChip »

Valeriy писал(а):Эта прошивка не от шагового двигателя. Посмотрел asm файл, там ''4 канальный блок управления с функцией задержки''
Извиняюсь, перезалил архив
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#9

Сообщение Valeriy »

Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.
Последний раз редактировалось Valeriy 17 янв 2015, 19:43, всего редактировалось 1 раз.
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#10

Сообщение AntonChip »

Valeriy писал(а):Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.
Переключатель шагов на PD0
Частота контроллера должна быть 8МГц, у Вас наверное с завода 1МГц, надо поменять фьюзы
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#11

Сообщение Valeriy »

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

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

#12

Сообщение Valeriy »

Попытался на базе этой программы, урезав до минимума задачу, воткнуть этот код в ATtini13, но не получается. Hex получаю, а программа не работает. Для высвобождения портов в программе убрал регулировку оборотов (поставил постоянную скорость) и постоянное количество шагов. Вроде все правильно сделал, но работать не хочет. Может посмотрите, что не так. Для моей задачи в самый раз использовать ATtini13.
Вложения
dvig.rar
(974 байт) 2369 скачиваний
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

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

#13

Сообщение 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;
}
}

Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#14

Сообщение Valeriy »

Скомпилировал - все нормально. Подправил скорость и количество шагов как мне надо и исправил "мои" неверные коментарии по PB4. Очень гибкая в настройке программа. Большое Вам спасибо!
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#15

Сообщение Valeriy »

Вопрос снят
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#16

Сообщение Valeriy »

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

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

#17

Сообщение AntonChip »

А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#18

Сообщение Valeriy »

AntonChip писал(а):А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir
Так L297 это только лишь драйвер ш.д.. К нему опять надо делать схему счетчика шагов (в моем случае). Опять получится большая схема - у меня сейчас подобная. Все-таки, если не трудно, первый вариант реализуйте. Там мне почти ничего переделывать не надо, только дополнить транзистор и резистор в схему. Я пытался сам переделать код, но не получается.
Аватара пользователя
passlight
Новичок
Сообщения: 3
Зарегистрирован: 02 фев 2015, 11:18

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

#19

Сообщение passlight »

Добрый день ребята. Схему взял из шапки. Транзисторную часть заменил UNL2003...подойдет, будет работать?
Вопрос по прошивке bipolar_step_motor_2.rar...можете выложить готовый HEX или как его скомпилировать и какие фьюзы выставлять для атмеги8?
подскажите пожалуйста, буду благодарен.
Аватара пользователя
Valeriy
Любитель
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

#20

Сообщение Valeriy »

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