STEP/DIR контроллер 3-х шаговых двигателей на микроконтролле

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


vahoo
Открыл глаза
Сообщения: 74
Зарегистрирован: Чт янв 10, 2008 15:30:33

STEP/DIR контроллер 3-х шаговых двигателей на микроконтролле

Сообщение vahoo »

станок интересный,

http://radiokot.ru/circuit/digital/automat/25/

но откуда найти деталировку механики и печатную плату, по моему проект не докончен, и что можно в роли бор

машини использовать
Аватара пользователя
Sailanser
Друг Кота
Сообщения: 3121
Зарегистрирован: Ср фев 01, 2006 22:29:02
Откуда: г.Ростов-на-Дону

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Sailanser »

Проект требует реальной доводки до ума, даже если попытаться фрезеровать на нем фанерку скажем 4-5 мм конструкция начнет по швам сыпаться. Ось Z выглядит таким образом что ее делали на очень скорую руку.
Аватара пользователя
kiahack
Прорезались зубы
Сообщения: 224
Зарегистрирован: Пт мар 19, 2010 16:52:19
Откуда: Челябинск
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение kiahack »

Этот STEP/DIR контроллер работает под Kcam4? :)
Изображение
Freeman
Встал на лапы
Сообщения: 113
Зарегистрирован: Чт янв 17, 2008 23:40:37
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Freeman »

Ну конструкция далеко по швам не сыплется, она крепче чем кажется на первый взгляд. Фрезеровал алюминий, делал узор на дубовой доске глубиной до 8 мм V-образной 30 градусной фрезой. Прекрасно фрезирует акрил, контуры плат. Единственное нехватает вертикальной жесткости по оси У... т.е. если кривой винт, стол подпрыгивает при повороте винта. Планирую заменить эти мебельные направляющие...
И еще одно... грабли... В качестве стола не берите фанетру. Я пару недель назад поменял на 20 мм. МДФ от столешницы.
Печатку могу выложить, но она на ОООЧЕНь скорую руку... но работает...

Под Kcam4 не проверял, но должно работать...
Аватара пользователя
kiahack
Прорезались зубы
Сообщения: 224
Зарегистрирован: Пт мар 19, 2010 16:52:19
Откуда: Челябинск
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение kiahack »

Freeman писал(а): Печатку могу выложить, но она на ОООЧЕНь скорую руку... но работает...


Можно глянуть печатку? :)
Изображение
Freeman
Встал на лапы
Сообщения: 113
Зарегистрирован: Чт янв 17, 2008 23:40:37
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Freeman »

kiahack писал(а):Можно глянуть печатку?

Да, пожалуйста.

Во вложении платы в формате орла...
Вложения
Stepper Driver.rar
(16.28 КБ) 2636 скачиваний
Аватара пользователя
kiahack
Прорезались зубы
Сообщения: 224
Зарегистрирован: Пт мар 19, 2010 16:52:19
Откуда: Челябинск
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение kiahack »

Freeman писал(а):Да, пожалуйста.

Во вложении платы в формате орла...


Спасибо! :)
Изображение
Lighter
Родился
Сообщения: 11
Зарегистрирован: Пн авг 30, 2010 17:51:22
Откуда: Нижнекамск
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Lighter »

Freeman писал(а):
kiahack писал(а):Можно глянуть печатку?

Да, пожалуйста.

Во вложении платы в формате орла...


А исходники с целью анализа, тренировки в программировании и похищения идей можно посмотреть?
Freeman
Встал на лапы
Сообщения: 113
Зарегистрирован: Чт янв 17, 2008 23:40:37
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Freeman »

низя, уж извините...
там и идей-то никаких новых нету, и писать нечего... все предельно просто...
Аватара пользователя
kiahack
Прорезались зубы
Сообщения: 224
Зарегистрирован: Пт мар 19, 2010 16:52:19
Откуда: Челябинск
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение kiahack »

Куда это питание идёт?
Изображение
Вложения
123.jpg
123
(42.09 КБ) 12409 скачиваний
Изображение
Freeman
Встал на лапы
Сообщения: 113
Зарегистрирован: Чт янв 17, 2008 23:40:37
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Freeman »

kiahack писал(а):Куда это питание идёт?

+12 на колодку J1

И вообще, я ж писал, разъем XD - резервный, на него, кажется, в этой версии прошивки ничего не идет. Потом планирую добавить управление реле всякими... но пока времени нету.
Аватара пользователя
kiahack
Прорезались зубы
Сообщения: 224
Зарегистрирован: Пт мар 19, 2010 16:52:19
Откуда: Челябинск
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение kiahack »

Freeman писал(а):+12 на колодку J1

И вообще, я ж писал, разъем XD - резервный, на него, кажется, в этой версии прошивки ничего не идет. Потом планирую добавить управление реле всякими... но пока времени нету.



Спасибо! )
Изображение
ViP
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вт дек 19, 2006 16:44:13
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение ViP »

не подскажете какая мега подойдет? в магазине мег16 кучка небольшая
mega16-16AU
mega16-16PU
mega16A-AU
mega16A-PU
mega16L-8PU
спасибо
пысы: развитие контроллера будет и как скоро?
Freeman
Встал на лапы
Сообщения: 113
Зарегистрирован: Чт янв 17, 2008 23:40:37
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Freeman »

ViP писал(а):не подскажете какая мега подойдет? в магазине мег16 кучка небольшая

Впринципи любая...
mega16L-8PU будет работать с небольшим оверклокингом.

У меня вроди atmega16-16PU стоит, хотя хз, завтра буду дома, гляну...

ViP писал(а):пысы: развитие контроллера будет и как скоро?

На счет развития - планирую, но как скоро, не знаю... пока дел много...
А чего там вообще развивать? ну кроме реле управления шпинделем... Мож пожелания какие будут?
убивец
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн ноя 30, 2009 23:49:43
Откуда: Донецк

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение убивец »

Freeman мне понравился ваш проект довольно простое и практичное решение. Давно уже обдумываю постройку чпу но все в поисках надежной и недорогой конструкции электроники , ваш проект то что надо дешево и практично... Но я не не понял как реализованы концевые выключатели нулевого положения осей х,у,z?
Я думаю что кроме реле управления шпинделем, не помешало бы управление для пылесоса или какой нибудь небольшой вытяжки...
Аватара пользователя
vitrix
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Пн май 31, 2010 16:50:37
Откуда: Тольятти

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение vitrix »

Вот подобный агрегат:
CNC.doc
(350.5 КБ) 8236 скачиваний

Freeman - извини, что влез в тему твоей статьи.
Просто как вариант для развития.
Это ВАМ не Это...
vahoo
Открыл глаза
Сообщения: 74
Зарегистрирован: Чт янв 10, 2008 15:30:33

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение vahoo »

vitrix писал(а):Вот подобный агрегат:
CNC.doc

Freeman - извини, что влез в тему твоей статьи.
Просто как вариант для развития.


класс! Вот это уже то, что надо, а можно по подробнее ? печатная плата, пошивка.
Аватара пользователя
vitrix
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Пн май 31, 2010 16:50:37
Откуда: Тольятти

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение vitrix »

vahoo писал(а): а можно по подробнее ? печатная плата, пошивка.

Вечером, если Freeman будет не против.
Уже и не помню - откуда скачал.
Есть прошивки на мегу16,32,8535.
Это ВАМ не Это...
Аватара пользователя
aleksey_gregul
Встал на лапы
Сообщения: 130
Зарегистрирован: Ср дек 29, 2010 17:30:34

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение aleksey_gregul »

Когда-то для друга, который хотел начать программировать авр_ки, делал подобное.
Упор делал не на оптимальность работы прошивки, а на максимальность понимания процессов,
происходящих в контроллере на примере понятного ему (другу) задания.
Но тем не менее, оно хоть и учебное, но работало.
Сделано в ИАР_е под МЕГУ8
3 step-dir с режимом "сна"
Поскольку у этого контроллера только 2 внешних прерывания, третьим выбран вход компаратора.

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

#include <inavr.h>
#include <iom8.h>

/* Set BIT in ADDRESS */
#define setbit(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))

/* Clear BIT in ADDRESS */
#define clearbit(ADDRESS,BIT)  ((ADDRESS) &= ~(1<<(BIT)))

/* Test BIT in ADDRESS */
#define testbit(ADDRESS,BIT)  ((ADDRESS) & (1<<(BIT)))


volatile unsigned char worktime1,worktime2,worktime3;
volatile unsigned char oldstatus_motor1,oldstatus_motor2,oldstatus_motor3;

void port_init(void)
{
 PORTB = 0x00;//all pin=0
 DDRB  = 0xFF;//all for output
 
 PORTC = 0x00;//all pin=0
 DDRC  = 0x7F;//C0-C6 for output
 
 PORTD = 0x00;//all output pinD=0, input pin D5 without pullup_s
 DDRD  = 0x20;//D5-output, all other-input
}

//TIMER0 initialize (On system clock=8MHZ, overflow interrupt every 32768us.)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCCR0 = 0x05; //start timer prescale:1024
}

//Comparator initialize
void comparator_init(void)
{
 ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
 ACSR = 0x4B; //Use Analog Comparator+Compare interrupt
              //fixed bandgap reference voltage replaces the positive input to the Analog Comparator.
              //Interrupt trigger level - Rising output edge
              //interrupt from 1 to 0 on pin D7
}

void sleep_motor1(void) //мотор 1 ложим в спящее состояние
{
clearbit(PORTD,5); // установили в 1 PORTB,5 договоримся, что лог 1 уменьшает питание этого двигателя до состояния удержания
}
void sleep_motor2(void)
{
clearbit(PORTB,7);
}
void sleep_motor3(void)
{
clearbit(PORTB,6);
}

void wakeup_motor1(void)//мотор 1 выводим из спящего состояния
{
setbit(PORTD,5);  //установили в 0 PORTB,5 договоримся, что лог 0 питание этого двигателя на всю катушку
worktime1=0;        //раз двигатель проснулся, то переменная, содержащая количество тактов таймера когда двигатель1 неактивен, =0
}                   //грубо говоря, считаем с нуля.

void wakeup_motor2(void)
{
setbit(PORTB,7);
worktime2=0;
}

void wakeup_motor3(void)
{
setbit(PORTB,6);
worktime3=0;
}


#pragma vector =  TIMER0_OVF_vect
__interrupt void  timer0_ovf_handler(void)
{
  //32786 us time left
worktime1++; //таймер клацнул. увеличиваем переменные неактивности двигателей
worktime2++;
worktime3++;
if (worktime1>=30){sleep_motor1();worktime1=0;}//30 клацаний это около 1 секунды
if (worktime2>=30){sleep_motor2();worktime2=0;}//если двигатель неактивен более секунды,
if (worktime3>=30){sleep_motor3();worktime3=0;}//то ему пора баеньки
}//а чтобы не часто его укладывать(32786 us), счетчики обнулим. повторно уложим через 1 секунду.

//тутычки процедура вычисления статуса, если нужно вращать влево
unsigned char workleft(unsigned char data)
{
unsigned char resultat=1;// промежуточная переменная
switch (data)// смотрим, что нам принесло число, переданное в эту процедуру
      {
      case 1: {resultat=2;break;} //в зависимости от предыдущих состояний
      case 2: {resultat=3;break;} //присваиваем промежуточной переменной различные состояния
      case 3: {resultat=4;break;}
      case 4: {resultat=5;break;}
      case 5: {resultat=6;break;}
      case 6: {resultat=7;break;}
      case 7: {resultat=8;break;}
      case 8: {resultat=1;break;}
      default: break;  // так нужно...
      }
return resultat;// говорим то, что вернет нам эта процедура
}


//а здеся процедура вычисления статуса, если нужно вращать вправо
unsigned char workright(unsigned char data)
{
unsigned char resultat=1;//    все, как и выше, только вправо
switch (data)
      {
      case 1: {resultat=8;break;}
      case 2: {resultat=1;break;}
      case 3: {resultat=2;break;}
      case 4: {resultat=3;break;}
      case 5: {resultat=4;break;}
      case 6: {resultat=5;break;}
      case 7: {resultat=6;break;}
      case 8: {resultat=7;break;}
      default: break; 
      }
return resultat;
}

// и вот, наконец само воздействие на состояния выходных линий
void left_motor1(void)
{
unsigned char newstatus; // все, как и раньше. обьявляем промежуточную переменную
newstatus=workleft(oldstatus_motor1); //выясняем, какой статус будет, если раньше у мотора был статус-oldstatus_motor1
clearbit(PORTB,0);                    //а вращать нужно влево.
clearbit(PORTB,1);                 
clearbit(PORTB,2);                    //наитупейшим образом обнуляем выходные линии
clearbit(PORTB,3);                   
if (newstatus==1) {setbit(PORTB,0);}
if (newstatus==2) {setbit(PORTB,0);setbit(PORTB,1);}
if (newstatus==3) {setbit(PORTB,1);}
if (newstatus==4) {setbit(PORTB,1);setbit(PORTB,2);}
if (newstatus==5) {setbit(PORTB,2);}
if (newstatus==6) {setbit(PORTB,2);setbit(PORTB,3);}
if (newstatus==7) {setbit(PORTB,3);}
if (newstatus==8) {setbit(PORTB,3);setbit(PORTB,0);}
oldstatus_motor1=newstatus; // и напоследок, ведь статус выходных линий уже поменяли, запоминаем новый статус, как старый.
}                           // это пригодится при повторном вычислении этого статуса


void right_motor1(void)
{
unsigned char newstatus;
newstatus=workright(oldstatus_motor1);// все, как и раньше. Только вправо.
clearbit(PORTB,0);
clearbit(PORTB,1);
clearbit(PORTB,2);
clearbit(PORTB,3);
if (newstatus==1) {setbit(PORTB,0);}
if (newstatus==2) {setbit(PORTB,0);setbit(PORTB,1);}
if (newstatus==3) {setbit(PORTB,1);}
if (newstatus==4) {setbit(PORTB,1);setbit(PORTB,2);}
if (newstatus==5) {setbit(PORTB,2);}
if (newstatus==6) {setbit(PORTB,2);setbit(PORTB,3);}
if (newstatus==7) {setbit(PORTB,3);}
if (newstatus==8) {setbit(PORTB,3);setbit(PORTB,0);}
oldstatus_motor1=newstatus;
}

void left_motor3(void)
{
unsigned char newstatus;
newstatus=workleft(oldstatus_motor3);
clearbit(PORTC,2);
clearbit(PORTC,3);
clearbit(PORTC,4);
clearbit(PORTC,5);
if (newstatus==1) {setbit(PORTC,2);}
if (newstatus==2) {setbit(PORTC,2);setbit(PORTC,3);}
if (newstatus==3) {setbit(PORTC,3);}
if (newstatus==4) {setbit(PORTC,3);setbit(PORTC,4);}
if (newstatus==5) {setbit(PORTC,4);}
if (newstatus==6) {setbit(PORTC,4);setbit(PORTC,5);}
if (newstatus==7) {setbit(PORTC,5);}
if (newstatus==8) {setbit(PORTC,5);setbit(PORTC,2);}
oldstatus_motor3=newstatus;
}


void right_motor3(void)
{
unsigned char newstatus;
newstatus=workright(oldstatus_motor3);
clearbit(PORTC,2);
clearbit(PORTC,3);
clearbit(PORTC,4);
clearbit(PORTC,5);
if (newstatus==1) {setbit(PORTC,2);}
if (newstatus==2) {setbit(PORTC,2);setbit(PORTC,3);}
if (newstatus==3) {setbit(PORTC,3);}
if (newstatus==4) {setbit(PORTC,3);setbit(PORTC,4);}
if (newstatus==5) {setbit(PORTC,4);}
if (newstatus==6) {setbit(PORTC,4);setbit(PORTC,5);}
if (newstatus==7) {setbit(PORTC,5);}
if (newstatus==8) {setbit(PORTC,5);setbit(PORTC,2);}
oldstatus_motor3=newstatus;
}



#pragma vector =  ANA_COMP_vect// Сюда мы попадем, если вход AIN1 установится в 0
__interrupt void  ana_comp_handler(void)
{
//analog comparator compare event
wakeup_motor3(); // договорились, что рабочий фронт =0, значит двигатель просят подвинуться. Нужно просыпаться
if (!testbit(PIND,1)>0) left_motor3();// а в зависимости, от того, в какую сторону просят крутиться,
  else right_motor3();               //вызываем и соответствующие подппрограмки
}


void left_motor2(void)// все, как и раньше. Только для двигателя 2.
{
unsigned char newstatus;
newstatus=workleft(oldstatus_motor2);
clearbit(PORTB,4);
clearbit(PORTB,5);
clearbit(PORTC,0);
clearbit(PORTC,1);
if (newstatus==1) {setbit(PORTB,4);}
if (newstatus==2) {setbit(PORTB,4);setbit(PORTB,5);}
if (newstatus==3) {setbit(PORTB,5);}
if (newstatus==4) {setbit(PORTB,5);setbit(PORTC,0);}
if (newstatus==5) {setbit(PORTC,0);}
if (newstatus==6) {setbit(PORTC,0);setbit(PORTC,1);}
if (newstatus==7) {setbit(PORTC,1);}
if (newstatus==8) {setbit(PORTC,1);setbit(PORTB,4);}
oldstatus_motor2=newstatus;
}


void right_motor2(void)
{
unsigned char newstatus;
newstatus=workright(oldstatus_motor2);
clearbit(PORTB,4);
clearbit(PORTB,5);
clearbit(PORTC,0);
clearbit(PORTC,1);
if (newstatus==1) {setbit(PORTB,4);}
if (newstatus==2) {setbit(PORTB,4);setbit(PORTB,5);}
if (newstatus==3) {setbit(PORTB,5);}
if (newstatus==4) {setbit(PORTB,5);setbit(PORTC,0);}
if (newstatus==5) {setbit(PORTC,0);}
if (newstatus==6) {setbit(PORTC,0);setbit(PORTC,1);}
if (newstatus==7) {setbit(PORTC,1);}
if (newstatus==8) {setbit(PORTC,1);setbit(PORTB,4);}
oldstatus_motor2=newstatus;
}

#pragma vector =  INT0_vect// Сюда мы попадем, если вход INT0 установится в 0
__interrupt void  int0_handler(void)
{
//external interupt on INT0
wakeup_motor1();// все, как и для мотора3, только для первого
if (!testbit(PIND,0)>0) left_motor1();
  else right_motor1();
}




#pragma vector =  INT1_vect// Сюда мы попадем, если вход INT1 установится в 0
__interrupt void  int1_handler(void)
{
//external interupt on INT1
wakeup_motor2();// выше уже обьяснял.
if (!testbit(PIND,4)>0) left_motor2();
  else right_motor2();
}

void init_devices(void)
{
 //stop errant interrupts until set up
__disable_interrupt(); //disable all interrupts
 port_init();// вызываем процедуру инициализации портов
 timer0_init();// вызываем процедуру инициализации таймера
 comparator_init();// вызываем процедуру инициализации компаратора

 MCUCR = 0x0A;// INT0- Falling edge, INT1- Falling edge (interrupt from 1 to 0)
 GICR  = 0xC0;// Interrupt from INT0+INT1
 TIMSK = 0x01; //timer interrupt sources
 __enable_interrupt(); //re-enable interrupts
 //all peripherals are now initialized
}




main( void )
{
 worktime1=0; //обнуляем переменные, содержащие время неактивности двигателей
 worktime2=0;
 worktime3=0;
 oldstatus_motor1=1;// состояния портов двигателя 1.2.3.4
 oldstatus_motor2=1;//примем по умолчанию 1
 oldstatus_motor3=1;
 init_devices();// Думаю, это не вызывает затруднений для понимания....

__delay_cycles (300);
// В соответствии со статусом 1  установим соответствующие линии портов
clearbit(PORTB,2);//M1
clearbit(PORTB,3);
clearbit(PORTB,1);
setbit(PORTB,0);

clearbit(PORTC,0);//M2
clearbit(PORTC,1);
clearbit(PORTB,5);
setbit(PORTB,4);

clearbit(PORTC,4);//M3
clearbit(PORTC,5);
clearbit(PORTC,3);
setbit(PORTC,2);

 sleep_motor1();
 sleep_motor2();
 sleep_motor3();
 while(1){}// Все настроено. Дальше работа идет только при возникновении прерываний.
}
Freeman
Встал на лапы
Сообщения: 113
Зарегистрирован: Чт янв 17, 2008 23:40:37
Контактная информация:

Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр

Сообщение Freeman »

vitrix писал(а):Вечером, если Freeman будет не против.

Freeman не против, вот только эта ветка по конкретному устройству... так что если по вашей теме будет больше 1-2 сообщений, то стоит создать отдельную тему.

В свое время такой проектик не нашел и решил сделать свой. Кроме того он (для меня) избыточен.
Кстати, вместо биполярников лучше ставить полевики...

А вот с джойстиком, идея интересная, надо бы где-то найти и поиграться...

убивец писал(а):Но я не не понял как реализованы концевые выключатели нулевого положения осей х,у,z?

По схеме предусмотрена только кнопка Estop. Остальное - не разведено. Никто вам не мешает дополнить схему концевиками - благо входов в LPT хватает.

А на счет исходников - не выкладываю потому что разведется флуд по теме нерациональности и кривизны написания... Имею горький опыт... Сам я не считаю что прошивка плохо написана, просто, местами, не рационально...
Но ведь программисты, они как из гитаристы из анекдотов:

"- Сколько нужно гитаристов, чтобы вкрутить лампочку?
- 100!
- Почему так много?!
- Один будет вкручивать, а остальные 99 будут критиковать,
и говорить, что они бы это сделали значительно лучше."
Закрыто

Вернуться в «Статьи»