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

Модератор: boogyman

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

Сообщение:#1  Сообщение AntonChip » 26 ноя 2013, 21:03

По просьбе пользователя 5335 выкладываю исходник программы управления биполярным шаговым двигателем, исходник переделанный, двигатель работает только тогда когда нажата кнопка "вперед" или "назад", когда кнопка отпускается двигатель останавливается. Оригинал статьи здесь http://radioparty.ru/index.php/prog-avr/program-c/485-lesson-bipolar-step-motor. Схема осталась без изменений
Вложения
bipolar_step_motor_2.rar
Проект AVRStudio4
(38.45 КБ) Скачиваний: 1967
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#2  Сообщение AntonChip » 15 янв 2015, 21:51

Вот еще одна программка, по спадающему импульсу на входе внешнего прерывания двигатель поворачивается на определенное количество шагов, затем останавливается.
Код: Выделить всё
// Подключение биполярного шагового двигателя к 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; // Значение временной задержки
}
}
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#3  Сообщение Valeriy » 16 янв 2015, 14:04

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

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

Сообщение:#4  Сообщение AntonChip » 16 янв 2015, 18:14

Пишу в AVRStudio4, проект во вложении.
Вложения
unipolar_step_motor.rar
(27.01 КБ) Скачиваний: 1580
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#5  Сообщение Valeriy » 16 янв 2015, 18:44

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

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

Сообщение:#6  Сообщение AntonChip » 16 янв 2015, 20:54

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

Может имеет смысл начать изучать AVRStudio?
Переделал, пробуйте
Вложения
unipolar_step_motor.rar
(38.69 КБ) Скачиваний: 1534
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#7  Сообщение Valeriy » 16 янв 2015, 21:47

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

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

Сообщение:#8  Сообщение AntonChip » 16 янв 2015, 22:28

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

Извиняюсь, перезалил архив
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#9  Сообщение Valeriy » 16 янв 2015, 23:05

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

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

Сообщение:#10  Сообщение AntonChip » 17 янв 2015, 00:09

Valeriy писал(а):Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.

Переключатель шагов на PD0
Частота контроллера должна быть 8МГц, у Вас наверное с завода 1МГц, надо поменять фьюзы
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#11  Сообщение Valeriy » 17 янв 2015, 07:54

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

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

Сообщение:#12  Сообщение Valeriy » 18 янв 2015, 20:31

Попытался на базе этой программы, урезав до минимума задачу, воткнуть этот код в ATtini13, но не получается. Hex получаю, а программа не работает. Для высвобождения портов в программе убрал регулировку оборотов (поставил постоянную скорость) и постоянное количество шагов. Вроде все правильно сделал, но работать не хочет. Может посмотрите, что не так. Для моей задачи в самый раз использовать ATtini13.
Вложения
dvig.rar
(974 байт) Скачиваний: 1455
Аватара пользователя
Valeriy
Любитель
 
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

Сообщение:#13  Сообщение AntonChip » 18 янв 2015, 23:04

Вот код для 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;
}
}

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

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

Сообщение:#14  Сообщение Valeriy » 19 янв 2015, 18:10

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

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

Сообщение:#15  Сообщение Valeriy » 20 янв 2015, 13:13

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

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

Сообщение:#16  Сообщение Valeriy » 31 янв 2015, 19:08

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

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

Сообщение:#17  Сообщение AntonChip » 31 янв 2015, 21:50

А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 193
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

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

Сообщение:#18  Сообщение Valeriy » 31 янв 2015, 22:01

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

Так L297 это только лишь драйвер ш.д.. К нему опять надо делать схему счетчика шагов (в моем случае). Опять получится большая схема - у меня сейчас подобная. Все-таки, если не трудно, первый вариант реализуйте. Там мне почти ничего переделывать не надо, только дополнить транзистор и резистор в схему. Я пытался сам переделать код, но не получается.
Аватара пользователя
Valeriy
Любитель
 
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

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

Сообщение:#19  Сообщение passlight » 02 фев 2015, 11:27

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

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

Сообщение:#20  Сообщение Valeriy » 02 фев 2015, 13:41

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

Скачайте программу "AVR Studio 4". Как получить в ней HEX файл расписано в интернете, я прошел через это. Через нее выставите и фьюзы и саму программу. Очень легко. Про фьюзы написано в тексте. Нужно выставить у новой микросхемы внутренний генератор на RC и частоту 8 МГц. Остальное по умолчанию. В первом сообщении во вложении есть HEX файл. Внимательно просмотрите папку "default"
Последний раз редактировалось Valeriy 02 фев 2015, 14:03, всего редактировалось 1 раз.
Аватара пользователя
Valeriy
Любитель
 
Сообщения: 25
Зарегистрирован: 14 янв 2015, 15:26
Откуда: Магнитогорск

След.

Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Rambler's Top100