roboforum.ru

Технический форум по робототехнике.

Мой первинец

Re: Мой первинец

AntLer » 05 сен 2008, 14:07

Хотелось бы посмотреть как организованно управление шаговыми движками программно. Буду оч признателен

Re: Мой первинец

spider » 08 сен 2008, 20:59

Я б тоже взглянул

Добавлено спустя 2 минуты 5 секунд:
А робот - зачод :good:

Re: Мой первинец

esprit » 10 сен 2008, 01:00

Да про моторы тоже интересно. Я пробовал - дергается и все. Хотя бы в псевдо коде.

Re: Мой первинец

e-not » 14 сен 2008, 16:40

По просьбам читателей :)
Из истории. Валялись они у меня в столе с пол года, как-то было скучно, взял 2 провода от блока питания и попробовал потыкать ими в клемы мотора, внимательно наблюдая за его поведеннием. Так, что не читая книжек и не пользуясь плодами прогресса типа гугл выяснил как там что устроено. Советую повторить эксперимент для закрепления знаний.
Далее, уже с подачи прочитанного здесь и на подобных ресурсах обзавелся мелкосхемой L293B. Распаял на монтажке и подключил к LPT-порту. Набросал прогу на LV7 и начал экспериментировать с тем как и что надо переключать.
В итоге получилось, что для того что бы мотор крутился в нужную сторону необходимо последовательно выводить на 4 линии управления ключами следущую последовательность:

порядок соответствует 4 выводам на клемнике моторчика
Катушка А -> биты 7, 6
Катушка В -> биты 5, 4 порта D (в моём случае)

7 - 1-0-0-0
6 - 0-0-1-0
5 - 0-1-0-0
4 - 0-0-0-1
или если изменить способ что бы катушки подкулючались по 2 (то есть промежуточные шаги)
7 - 1-1-0-0-0-0-0-1
6 - 0-0-0-1-1-1-0-0
5 - 0-1-1-1-0-0-0-0
4 - 0-0-0-0-0-1-1-1
Итак, к сути, как это сделано програмно:
Глобальный массив и указатель (что бы постоянно помнил текущее состояние)
Код: Выделить всёРазвернуть
   
char mstp[8] = {0x80,0xA0,0x20,0x60,0x40,0x50,0x10,0x90};
char m1; //

и функция, которая собственно и управляется с этим
Код: Выделить всёРазвернуть
void M_Naklon(char dir)
{   
        switch(dir)
      {
      case 1: // left
         {
            if(++m1 > 17)
               m1=10;
                PORTD = (PORTD & 0x0F) | (mstp[m1-10]);
                break;
         }
      case 2: // right
         {
            if(--m1 < 10)
               m1=17;
                PORTD = (PORTD & 0x0F) | (mstp[m1-10]);
            break;
         }
      case 0:
         {
            PORTD = (PORTD & 0x0F) | 0x0;
            break;
         }
      }
};   

Входной параметр - направление, если влево (например) то надо выводить следующий элемент массива, если наоборот, то предыдущий. Если "0" значит везде вывести ноль. Это что бы отключить обмотки от батарейки. (сначала забыл об этом и моторчики просто кипели)
Такой огород с выводом в порт - ничего умнее не придумал. Но работает. В маске еденичками отмечено то, что изменять не надо.
Из порта D для управления пользуем старшие 4 бита
Цифры 17 и 10 вместо 7 и 0 в кольце потому что это первое что пришло в голову, когда понял что надо было использовать беззнаковую переменную для указателя :)
И самое последнее
В ходе программы вызывать эту функцию с определённым интервалом и нужным направлением шага. В моём случае интервал 2 милисекунды.
Медленне не интересно, хотя чуть увеличивается момент (субъективно, характеристик мотора не знаю), быстрее - у меня не работало, наверное слишком большая нагрузка, в холостую крутится нормально и смешно гудит :)

Всем творческих успехов

Добавлено спустя 59 минут 45 секунд:
А , и вот ещё. плиз как разберётесь со своими непонятками отпишите что и как было не так


Rambler\'s Top100 Mail.ru counter