Управление биполярным шаговиком от CD-ROM

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн май 17, 2010 09:59:59
Откуда: Kiev

Сообщение RaDevan »

Доброго здоровья коты!
Есть задача управлять шаговиком от Привода, тем который двигает каретку лазера, по определенному алгоритму, то есть подача на 10 шагов вперед пауза, подача на исходное положения, то есть на десять шагов назад!
Написал программу в CodeVision в итоге при нажатии кнопки у меня шаговик ползет в одну сторону, при нажатии другой кнопки ползет обратно.
Но вот как задать количество шагов в одну сторону. и обратно, не могу вкурить. Посему прошу направить на путь истинный, советом или ссылочкой, на тему где можно побольше для себя почитать!
Вот код

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

#include <mega328p.h>

#include <delay.h>

void vpered (void)
{
  PIND.4=1;
  PIND.5=0;
  PIND.6=0;
  PIND.7=0;
  delay_ms(25);
  
  PIND.4=0;
  PIND.5=0;
  PIND.6=1;
  PIND.7=0;
  delay_ms(25);
  
  PIND.4=0;
  PIND.5=1;
  PIND.6=0;
  PIND.7=0;
  delay_ms(25);
  
  PIND.4=0;
  PIND.5=0;
  PIND.6=0;
  PIND.7=1;
  delay_ms(25);
}
void nazad(void)
{
  PIND.4=0;
  PIND.5=0;
  PIND.6=0;
  PIND.7=1;
  delay_ms(25);
  
  PIND.4=0;
  PIND.5=1;
  PIND.6=0;
  PIND.7=0;
  delay_ms(25);
  
  PIND.4=0;
  PIND.5=0;
  PIND.6=1;
  PIND.7=0;
  delay_ms(25);
  
  PIND.4=1;
  PIND.5=0;
  PIND.6=0;
  PIND.7=0;
  delay_ms(25);
}
void main(void)
{ 

   PORTB=0x00;
   DDRB=0x00;
   PORTD=0x00;        
   DDRD=0xFF;
   
while (1)
      {  
      
           
      if (PINC.5==0) 
             vpered();
  
      if (PINC.4==0)
        nazad();
                 
      
}
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

В обеих процедурах по 4 шага.
Реклама
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Программа работает правильно, как она и написана.
Но она не соответствует логике ТЗ.

Если на двух выводах "1", то никто никуда не идёт. Если "0" на одном из выводов, то включается бесконечный цикл перемещения.

Что будет, если на двух выводах одновременно будет "0"?
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Что будет, если на двух выводах одновременно будет "0"?
Получается очень похоже на онанизм :))
Последний раз редактировалось vek Вт окт 29, 2013 16:31:16, всего редактировалось 1 раз.
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Во-во. Я ж про тож.
Реклама
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Про оператор фор(в буржуйском варианте "for") знаете?
в идеале это как-бы оператор конечного цикла :)
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Че вы накинулись? Обычное дело для начинающих. Любого профессионала можно поставить в тупик вопросом:-А что сделает его программа, если сесть жопой на клавиатуру? Хотя по всем канонам, ситуация должна быть предусмотрена.
А цикл фор проканает, если считывать состояние портов из массива констант. Опять же, нужно помнить последнее состояние.
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Никто не накинулся, ещё чего не хватало.

Просто это не чтение из массива, а прямое чтение с ноги микросхемы. Поэтому, когда "0" на ноге, он будет "0" в бесконечном цикле. За это разговор.

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

Допишу: Примерно, понимаю в чём дело.
Поправьте, если не так, но запись while(1) это не выполнить 1 раз, а выполнять бесконечно.
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Шурики писал(а):запись while(1) это не выполнить 1 раз, а выполнять бесконечно.
Именно так. Имитация бесконечного цикла.
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн май 17, 2010 09:59:59
Откуда: Kiev

Сообщение RaDevan »

По поводу 0 и 1 в цикле while это ясно, брал логику работы привода вот от сюда
http://radiohlam.ru/control/bipolar_step_motor.htm
соответственно вот как понял так и наваял, при нажатии кнопочек в протеусе, двигатель вращается, НО больше этого увы сделать не смог!
Дайте хоть намек, как мне стоить писать прогу, или где можно прочитать.

А по поводу новичок, то да НОВИЧОК :oops: но это наверно с каждым случалось :)))
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Обработка нажатий кнопок должна выглядеть примерно так:
if ((PINC.5==0)&(PINC.4==1)) vpered();
if ((PINC.4==0)&(PINC.5==1)) nazad();
При этом будет наплевать на нажатие обеих кнопок одновременно.
Что касается цикла, то дело в том, что в конце перемещения состояние портов не соответствует начальному. Можно написать процедуру по выполнению одного шага и вызывать её 10 раз. Можно записать в массив состояния портов при полном обороте и закольцевать счетчик массива внутри цикла. Можно соорудить цикл из двух проходов по написанному тексту и добавить еще два шага. Если не критично, то количество шагов выбрать таким, что бы совпадали состояния портов при начале и конце движения, тогда все резко упрощается. В общем масса вариантов.
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

То же самое, что в предыдущем посте, но в тему.


Эмуляторы и железо ведут себя несколько по-разному.
Поэтому и задачи формулируем по-другому.
Например, что нам нужно получить: 1 нажатие на кнопку - 10 щелчков двигателя. Направление сейчас не интересно.

Как, примерно, сделать:
1. Шаговый двигатель, значит перебор фаз на 1 шаг. Допускаем.
2. 10 шагов - значит, повторить 1-е 10 раз. Это тоже понятно.
3. Считывание кнопки. Вот с этого места начинаются нюансы.

Если бы у нас стояла задача сдвига на 1 шаг по включению микроконтроллера, то мы могли бы зажать кнопку направления, подать питание. Двигатель бы отработал сдвиг на 1 шаг. Всё.
Далее систему нужно обесточить и опять подать питание - ещё один шаг. Не устраивает.

Поэтому и стоит общий бесконечный цикл while. Даже если эта система, казалось бы, ничего не делает - это не так: она ждёт нажатия кнопки.

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

Теперь примерная реализация:

1. Инициализация - в программе есть.
2. Подпрограммы движения на 1 шаг в двух направлениях - в программе есть. С нюансами, пока оставляем.
3. Отработка нажатия клавиши (основной цикл): Нужно узнать, что клавиша нажата, сделать 10 раз в цикле сдвиг на 1 шаг в зависимости от нажатой клавиши. Теперь далее: если клавиша после этого остаётся далее нажатой, ничего не делаем, просто крутимся в цикле.
4. возврат к пункту 3 - это и есть while

Примечание:
Тут придётся завести дополнительные переменные для того, чтобы знать, при следующем проходе цикла чтения из порта, что клавиша уже была нажата при предыдущем проходе.
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Может с флагами подождать? Разобраться сначала с вращением? А может там механический конечный выключатель последовательно с кнопкой?
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн май 17, 2010 09:59:59
Откуда: Kiev

Сообщение RaDevan »

как я понял из статьи по этому шаговику, то как раз процедура и описывает полный шаг привода вперед, и такой же назад.
я немного не понимаю, как выполнить эту процедуру только например 10 раз, а потом выполнить другую, тоже только 10 раз (((
кнопки в проекте не принципиальны, но в любом случае за дельный совет СПАСИБО
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Вот смотри. Состояние портов при вращении:
1000
0100
0010
0001
...
Это вращение, например вперед. Сдвиг единицы вправо. Полный оборот = 4 шага. Потом повторяется, потом еще два шага 1000 и 0100. Вот последнее 0100 и есть состояние порта по окончанию вращения.
При вращении назад сдвиг единицы влево. Все с точностью наоборот. Состояний порта может быть только 4. Но шагов нужно 10. Если не выкаблучиваться с битовыми операциями в полубайте, то записываем в массив все 10 значений и считываем из него состояние порта 10 раз, используя счетчик цикла как указатель индекса массива. Хоть вперед, хоть назад. Сам я с Си работал давно, поэтому "с ходу" не напишу. Нужно обновить в памяти синтаксис языка.
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Разбиваем задачу ещё раз на подзадачи.

Сейчас нужно получить 10 шагов двигателя.
1 шаг есть.

void vpered (void)
{
PIND.4=1;
PIND.5=0;
PIND.6=0;
PIND.7=0;
delay_ms(25);

ну и т.д.

Основной цикл есть:

void main(void)
{

PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0xFF;


то же ну и т.д.

теперь внутри этой конструкции надо сделать цикл for, который будет отсчитывать 10 раз по 1 шагу.

Сделай устройство, которое, просто по включению будет просто передвигать двигатель, допустим, на 10 шагов вперёд, вообще без всяких других задач. Подал питание - сдвинул, выключил, ещё раз подал - дальше сдвинул. И всё. Когда добьёшся результата, там уже можно сначала поиграться с количеством шагов и направлениями (с программой).

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

Кстати, тогда while пока надо убрать.
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн май 17, 2010 09:59:59
Откуда: Kiev

Сообщение RaDevan »

ок, спасибо.
Буду пробовать писать!
Ответить

Вернуться в «AVR»