Подключение шагового двигателя к микроконтроллерам AVR
Модератор: boogyman
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Подключение шагового двигателя к микроконтроллерам AVR
По просьбе пользователя 5335 выкладываю исходник программы управления биполярным шаговым двигателем, исходник переделанный, двигатель работает только тогда когда нажата кнопка "вперед" или "назад", когда кнопка отпускается двигатель останавливается. Оригинал статьи здесь http://radioparty.ru/programming/avr/c/ ... step-motor. Схема осталась без изменений.
- Вложения
-
- bipolar_step_motor_2.rar
- Проект AVRStudio4
- (38.45 КБ) 3374 скачивания
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
Вот еще одна программка, по спадающему импульсу на входе внешнего прерывания двигатель поворачивается на определенное количество шагов, затем останавливается.
Код: Выделить всё
// Подключение биполярного шагового двигателя к 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
Сколько не пытался скомпилировать в HEX - не получается. В программе CodeVisionAVR 3.012 при компиляции пишет ошибку по 2 и 19 строке. Пробовал в разных программах, но так и не смог сделать. Видимо что то не так делаю или в коде дело . Был бы рад получить готовый HEX файл! И еще, если не трудно, сделайте количество шагов изменяемым в 2 раза ( 4 вместо 8), путем подачи на какой-нибудь порт единицы.
Последний раз редактировалось Valeriy 16 янв 2015, 18:40, всего редактировалось 1 раз.
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
Пишу в AVRStudio4, проект во вложении.
- Вложения
-
- unipolar_step_motor.rar
- (27.01 КБ) 2873 скачивания
Re: Подключение шагового двигателя к микроконтроллерам AVR
Спасибо! Сейчас буду пробовать.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
Может имеет смысл начать изучать AVRStudio?Valeriy писал(а):Спасибо! Сейчас буду пробовать.
P.S.
Антон. К сожалению двигатель делает 32 шага от 1 импульса, а надо 8 (или4). Также скорость тоже маленькая. Вообще регулировку скорости в коде можно оставить как была через аналоговый порт.
Переделал, пробуйте
- Вложения
-
- unipolar_step_motor.rar
- (38.69 КБ) 2823 скачивания
Re: Подключение шагового двигателя к микроконтроллерам AVR
Эта прошивка не от шагового двигателя. Посмотрел *с файл, там ''4 канальный блок управления с функцией задержки''
Последний раз редактировалось Valeriy 17 янв 2015, 20:11, всего редактировалось 2 раза.
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
Извиняюсь, перезалил архивValeriy писал(а):Эта прошивка не от шагового двигателя. Посмотрел asm файл, там ''4 канальный блок управления с функцией задержки''
Re: Подключение шагового двигателя к микроконтроллерам AVR
Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.
Последний раз редактировалось Valeriy 17 янв 2015, 19:43, всего редактировалось 1 раз.
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
Переключатель шагов на PD0Valeriy писал(а):Сейчас нормально по шагам, только вот скорость мала. Надо раза в 3 выше. А на каком пине контроллера переключение количества шагов? В конце программы вроде есть такие строки.
Частота контроллера должна быть 8МГц, у Вас наверное с завода 1МГц, надо поменять фьюзы
Re: Подключение шагового двигателя к микроконтроллерам AVR
Фьюзы выставлены правильно на RC 8МГц. Извиняюсь, не подключил питание на пины AVCC и AREF МК, поэтому не работала регулировка скорости.
Скачал и установил AVR Studio4. Ваш проект хорошо компилируется в этой программе. Пробовал менять в коде количества импульсов - все как по нотам работает. Подставлял файл кода от начальной «схемы управления униполярным шаговым двигателем» тоже скомпилировался и получил рабочий HEX файл. Так что, огромное Вам СПАСИБО за оказанную помощь!
Скачал и установил AVR Studio4. Ваш проект хорошо компилируется в этой программе. Пробовал менять в коде количества импульсов - все как по нотам работает. Подставлял файл кода от начальной «схемы управления униполярным шаговым двигателем» тоже скомпилировался и получил рабочий HEX файл. Так что, огромное Вам СПАСИБО за оказанную помощь!
Re: Подключение шагового двигателя к микроконтроллерам AVR
Попытался на базе этой программы, урезав до минимума задачу, воткнуть этот код в ATtini13, но не получается. Hex получаю, а программа не работает. Для высвобождения портов в программе убрал регулировку оборотов (поставил постоянную скорость) и постоянное количество шагов. Вроде все правильно сделал, но работать не хочет. Может посмотрите, что не так. Для моей задачи в самый раз использовать ATtini13.
- Вложения
-
- dvig.rar
- (974 байт) 2636 скачиваний
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
Вот код для 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
Скомпилировал - все нормально. Подправил скорость и количество шагов как мне надо и исправил "мои" неверные коментарии по PB4. Очень гибкая в настройке программа. Большое Вам спасибо!
Re: Подключение шагового двигателя к микроконтроллерам AVR
Здравствуйте Антон!
Схема управления, выполненная на МК ATtini13A с Вашей прошивкой, прекрасно работает, но появилась такая вот проблема. Как я уже писал, схема применяется у меня для управления наружными часами. Так вот, при перемещении стрелок от основного двигателя (220 вольт) на основном циферблате, за счет усилия на дифференциале, шаговый двигатель иногда самопроизвольно прокручивается. В результате время на циферблате часов не соответствует действительности. Это происходит из-за того, что на шаговом двигателе отсутствует фиксация в режиме ожидания. Такую фиксацию можно сделать так. На свободный порт РВ5 МК завести сигнал «единицы», которая будет появляться, когда происходит вращение двигателя (добавить в коде) и исчезать в режиме ожидания. Этот сигнал будет управлять транзистором, который будет подавать общий плюс на обмотки шагового двигателя в режиме прокрутки. Параллельно транзистору включается резистор, номинал которого будет определять ток фиксации двигателя в режиме ожидания после окончания прокрутки. В коде программы также надо исключить нули на выходных портах в режиме ожидания. При остановке двигателя отключение напряжения на обмотке, которая попала на данный момент (зависит от задания в коде количества импульсов) не производится.
Другой вариант такой. Ток в обмотке, попавшей для режима ожидания, с помощью ШИМ (задается в коде) снижается до необходимого. Но, не знаю, на МК ATtini13A такое получится или нет. А это было бы здорово!
Если не трудно, сделайте, пожалуйста, в прошивке необходимые изменения. Иначе такая прекрасная схема у меня работать не сможет! Надеюсь на Вашу помощь!
Схема управления, выполненная на МК ATtini13A с Вашей прошивкой, прекрасно работает, но появилась такая вот проблема. Как я уже писал, схема применяется у меня для управления наружными часами. Так вот, при перемещении стрелок от основного двигателя (220 вольт) на основном циферблате, за счет усилия на дифференциале, шаговый двигатель иногда самопроизвольно прокручивается. В результате время на циферблате часов не соответствует действительности. Это происходит из-за того, что на шаговом двигателе отсутствует фиксация в режиме ожидания. Такую фиксацию можно сделать так. На свободный порт РВ5 МК завести сигнал «единицы», которая будет появляться, когда происходит вращение двигателя (добавить в коде) и исчезать в режиме ожидания. Этот сигнал будет управлять транзистором, который будет подавать общий плюс на обмотки шагового двигателя в режиме прокрутки. Параллельно транзистору включается резистор, номинал которого будет определять ток фиксации двигателя в режиме ожидания после окончания прокрутки. В коде программы также надо исключить нули на выходных портах в режиме ожидания. При остановке двигателя отключение напряжения на обмотке, которая попала на данный момент (зависит от задания в коде количества импульсов) не производится.
Другой вариант такой. Ток в обмотке, попавшей для режима ожидания, с помощью ШИМ (задается в коде) снижается до необходимого. Но, не знаю, на МК ATtini13A такое получится или нет. А это было бы здорово!
Если не трудно, сделайте, пожалуйста, в прошивке необходимые изменения. Иначе такая прекрасная схема у меня работать не сможет! Надеюсь на Вашу помощь!
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Подключение шагового двигателя к микроконтроллерам AVR
А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir
Re: Подключение шагового двигателя к микроконтроллерам AVR
Так L297 это только лишь драйвер ш.д.. К нему опять надо делать схему счетчика шагов (в моем случае). Опять получится большая схема - у меня сейчас подобная. Все-таки, если не трудно, первый вариант реализуйте. Там мне почти ничего переделывать не надо, только дополнить транзистор и резистор в схему. Я пытался сам переделать код, но не получается.AntonChip писал(а):А как вариант использовать спецдрайвер для шаговика, например L297? там уже есть шим, удержание, а управляется все это сигналами step и dir
Re: Подключение шагового двигателя к микроконтроллерам AVR
Добрый день ребята. Схему взял из шапки. Транзисторную часть заменил UNL2003...подойдет, будет работать?
Вопрос по прошивке bipolar_step_motor_2.rar...можете выложить готовый HEX или как его скомпилировать и какие фьюзы выставлять для атмеги8?
подскажите пожалуйста, буду благодарен.
Вопрос по прошивке bipolar_step_motor_2.rar...можете выложить готовый HEX или как его скомпилировать и какие фьюзы выставлять для атмеги8?
подскажите пожалуйста, буду благодарен.
Re: Подключение шагового двигателя к микроконтроллерам AVR
Скачайте программу "AVR Studio 4". Как получить в ней HEX файл расписано в интернете, я прошел через это. Через нее выставите и фьюзы и саму программу. Очень легко. Про фьюзы написано в тексте. Нужно выставить у новой микросхемы внутренний генератор на RC и частоту 8 МГц. Остальное по умолчанию. В первом сообщении во вложении есть HEX файл. Внимательно просмотрите папку "default"passlight писал(а):Добрый день ребята. Схему взял из шапки. Транзисторную часть заменил UNL2003...подойдет, будет работать?
Вопрос по прошивке bipolar_step_motor_2.rar...можете выложить готовый HEX или как его скомпилировать и какие фьюзы выставлять для атмеги8?
подскажите пожалуйста, буду благодарен.
Последний раз редактировалось Valeriy 02 фев 2015, 14:03, всего редактировалось 1 раз.