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

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

Добавлено: Вт окт 29, 2013 15:16:34
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();
                 
      
}
}

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

Добавлено: Вт окт 29, 2013 15:54:17
vem566
В обеих процедурах по 4 шага.

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

Добавлено: Вт окт 29, 2013 15:59:43
Шурики
Программа работает правильно, как она и написана.
Но она не соответствует логике ТЗ.

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

Что будет, если на двух выводах одновременно будет "0"?

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

Добавлено: Вт окт 29, 2013 16:24:20
vek
Что будет, если на двух выводах одновременно будет "0"?
Получается очень похоже на онанизм :))

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

Добавлено: Вт окт 29, 2013 16:26:20
Шурики
Во-во. Я ж про тож.

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

Добавлено: Вт окт 29, 2013 16:33:59
vek
Про оператор фор(в буржуйском варианте "for") знаете?
в идеале это как-бы оператор конечного цикла :)

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

Добавлено: Вт окт 29, 2013 16:37:59
vem566
Че вы накинулись? Обычное дело для начинающих. Любого профессионала можно поставить в тупик вопросом:-А что сделает его программа, если сесть жопой на клавиатуру? Хотя по всем канонам, ситуация должна быть предусмотрена.
А цикл фор проканает, если считывать состояние портов из массива констант. Опять же, нужно помнить последнее состояние.

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

Добавлено: Вт окт 29, 2013 16:45:32
Шурики
Никто не накинулся, ещё чего не хватало.

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

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

Допишу: Примерно, понимаю в чём дело.
Поправьте, если не так, но запись while(1) это не выполнить 1 раз, а выполнять бесконечно.

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

Добавлено: Вт окт 29, 2013 16:58:53
vem566
Шурики писал(а):запись while(1) это не выполнить 1 раз, а выполнять бесконечно.
Именно так. Имитация бесконечного цикла.

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

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

А по поводу новичок, то да НОВИЧОК :oops: но это наверно с каждым случалось :)))

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

Добавлено: Вт окт 29, 2013 17:43:04
vem566
Обработка нажатий кнопок должна выглядеть примерно так:
if ((PINC.5==0)&(PINC.4==1)) vpered();
if ((PINC.4==0)&(PINC.5==1)) nazad();
При этом будет наплевать на нажатие обеих кнопок одновременно.
Что касается цикла, то дело в том, что в конце перемещения состояние портов не соответствует начальному. Можно написать процедуру по выполнению одного шага и вызывать её 10 раз. Можно записать в массив состояния портов при полном обороте и закольцевать счетчик массива внутри цикла. Можно соорудить цикл из двух проходов по написанному тексту и добавить еще два шага. Если не критично, то количество шагов выбрать таким, что бы совпадали состояния портов при начале и конце движения, тогда все резко упрощается. В общем масса вариантов.

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

Добавлено: Вт окт 29, 2013 17:46:41
Шурики
То же самое, что в предыдущем посте, но в тему.


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

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

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

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

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

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

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

Примечание:
Тут придётся завести дополнительные переменные для того, чтобы знать, при следующем проходе цикла чтения из порта, что клавиша уже была нажата при предыдущем проходе.

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

Добавлено: Вт окт 29, 2013 17:50:18
vem566
Может с флагами подождать? Разобраться сначала с вращением? А может там механический конечный выключатель последовательно с кнопкой?

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

Добавлено: Вт окт 29, 2013 17:51:48
RaDevan
как я понял из статьи по этому шаговику, то как раз процедура и описывает полный шаг привода вперед, и такой же назад.
я немного не понимаю, как выполнить эту процедуру только например 10 раз, а потом выполнить другую, тоже только 10 раз (((
кнопки в проекте не принципиальны, но в любом случае за дельный совет СПАСИБО

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

Добавлено: Вт окт 29, 2013 18:12:49
vem566
Вот смотри. Состояние портов при вращении:
1000
0100
0010
0001
...
Это вращение, например вперед. Сдвиг единицы вправо. Полный оборот = 4 шага. Потом повторяется, потом еще два шага 1000 и 0100. Вот последнее 0100 и есть состояние порта по окончанию вращения.
При вращении назад сдвиг единицы влево. Все с точностью наоборот. Состояний порта может быть только 4. Но шагов нужно 10. Если не выкаблучиваться с битовыми операциями в полубайте, то записываем в массив все 10 значений и считываем из него состояние порта 10 раз, используя счетчик цикла как указатель индекса массива. Хоть вперед, хоть назад. Сам я с Си работал давно, поэтому "с ходу" не напишу. Нужно обновить в памяти синтаксис языка.

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

Добавлено: Вт окт 29, 2013 18:41:00
Шурики
Разбиваем задачу ещё раз на подзадачи.

Сейчас нужно получить 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 пока надо убрать.

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

Добавлено: Вт окт 29, 2013 18:43:35
RaDevan
ок, спасибо.
Буду пробовать писать!