STEP/DIR контроллер 3-х шаговых двигателей на микроконтролле
STEP/DIR контроллер 3-х шаговых двигателей на микроконтролле
станок интересный,
http://radiokot.ru/circuit/digital/automat/25/
но откуда найти деталировку механики и печатную плату, по моему проект не докончен, и что можно в роли бор
машини использовать
http://radiokot.ru/circuit/digital/automat/25/
но откуда найти деталировку механики и печатную плату, по моему проект не докончен, и что можно в роли бор
машини использовать
- Sailanser
- Друг Кота
- Сообщения: 3121
- Зарегистрирован: Ср фев 01, 2006 22:29:02
- Откуда: г.Ростов-на-Дону
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Проект требует реальной доводки до ума, даже если попытаться фрезеровать на нем фанерку скажем 4-5 мм конструкция начнет по швам сыпаться. Ось Z выглядит таким образом что ее делали на очень скорую руку.
- kiahack
- Прорезались зубы
- Сообщения: 224
- Зарегистрирован: Пт мар 19, 2010 16:52:19
- Откуда: Челябинск
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Этот STEP/DIR контроллер работает под Kcam4? 
-
Freeman
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Чт янв 17, 2008 23:40:37
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Ну конструкция далеко по швам не сыплется, она крепче чем кажется на первый взгляд. Фрезеровал алюминий, делал узор на дубовой доске глубиной до 8 мм V-образной 30 градусной фрезой. Прекрасно фрезирует акрил, контуры плат. Единственное нехватает вертикальной жесткости по оси У... т.е. если кривой винт, стол подпрыгивает при повороте винта. Планирую заменить эти мебельные направляющие...
И еще одно... грабли... В качестве стола не берите фанетру. Я пару недель назад поменял на 20 мм. МДФ от столешницы.
Печатку могу выложить, но она на ОООЧЕНь скорую руку... но работает...
Под Kcam4 не проверял, но должно работать...
И еще одно... грабли... В качестве стола не берите фанетру. Я пару недель назад поменял на 20 мм. МДФ от столешницы.
Печатку могу выложить, но она на ОООЧЕНь скорую руку... но работает...
Под Kcam4 не проверял, но должно работать...
- kiahack
- Прорезались зубы
- Сообщения: 224
- Зарегистрирован: Пт мар 19, 2010 16:52:19
- Откуда: Челябинск
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Freeman писал(а): Печатку могу выложить, но она на ОООЧЕНь скорую руку... но работает...
Можно глянуть печатку?
-
Freeman
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Чт янв 17, 2008 23:40:37
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
kiahack писал(а):Можно глянуть печатку?
Да, пожалуйста.
Во вложении платы в формате орла...
- Вложения
-
- Stepper Driver.rar
- (16.28 КБ) 2636 скачиваний
- kiahack
- Прорезались зубы
- Сообщения: 224
- Зарегистрирован: Пт мар 19, 2010 16:52:19
- Откуда: Челябинск
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Freeman писал(а):Да, пожалуйста.
Во вложении платы в формате орла...
Спасибо!
-
Lighter
- Родился
- Сообщения: 11
- Зарегистрирован: Пн авг 30, 2010 17:51:22
- Откуда: Нижнекамск
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Freeman писал(а):kiahack писал(а):Можно глянуть печатку?
Да, пожалуйста.
Во вложении платы в формате орла...
А исходники с целью анализа, тренировки в программировании и похищения идей можно посмотреть?
-
Freeman
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Чт янв 17, 2008 23:40:37
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
низя, уж извините...
там и идей-то никаких новых нету, и писать нечего... все предельно просто...
там и идей-то никаких новых нету, и писать нечего... все предельно просто...
- kiahack
- Прорезались зубы
- Сообщения: 224
- Зарегистрирован: Пт мар 19, 2010 16:52:19
- Откуда: Челябинск
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Куда это питание идёт?

- Вложения
-
- 123.jpg
- 123
- (42.09 КБ) 12409 скачиваний
-
Freeman
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Чт янв 17, 2008 23:40:37
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
kiahack писал(а):Куда это питание идёт?
+12 на колодку J1
И вообще, я ж писал, разъем XD - резервный, на него, кажется, в этой версии прошивки ничего не идет. Потом планирую добавить управление реле всякими... но пока времени нету.
- kiahack
- Прорезались зубы
- Сообщения: 224
- Зарегистрирован: Пт мар 19, 2010 16:52:19
- Откуда: Челябинск
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Freeman писал(а):+12 на колодку J1
И вообще, я ж писал, разъем XD - резервный, на него, кажется, в этой версии прошивки ничего не идет. Потом планирую добавить управление реле всякими... но пока времени нету.
Спасибо! )
-
ViP
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вт дек 19, 2006 16:44:13
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
не подскажете какая мега подойдет? в магазине мег16 кучка небольшая
mega16-16AU
mega16-16PU
mega16A-AU
mega16A-PU
mega16L-8PU
спасибо
пысы: развитие контроллера будет и как скоро?
mega16-16AU
mega16-16PU
mega16A-AU
mega16A-PU
mega16L-8PU
спасибо
пысы: развитие контроллера будет и как скоро?
-
Freeman
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Чт янв 17, 2008 23:40:37
- Контактная информация:
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
ViP писал(а):не подскажете какая мега подойдет? в магазине мег16 кучка небольшая
Впринципи любая...
mega16L-8PU будет работать с небольшим оверклокингом.
У меня вроди atmega16-16PU стоит, хотя хз, завтра буду дома, гляну...
ViP писал(а):пысы: развитие контроллера будет и как скоро?
На счет развития - планирую, но как скоро, не знаю... пока дел много...
А чего там вообще развивать? ну кроме реле управления шпинделем... Мож пожелания какие будут?
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Freeman мне понравился ваш проект довольно простое и практичное решение. Давно уже обдумываю постройку чпу но все в поисках надежной и недорогой конструкции электроники , ваш проект то что надо дешево и практично... Но я не не понял как реализованы концевые выключатели нулевого положения осей х,у,z?
Я думаю что кроме реле управления шпинделем, не помешало бы управление для пылесоса или какой нибудь небольшой вытяжки...
Я думаю что кроме реле управления шпинделем, не помешало бы управление для пылесоса или какой нибудь небольшой вытяжки...
- vitrix
- Нашел транзистор. Понюхал.
- Сообщения: 176
- Зарегистрирован: Пн май 31, 2010 16:50:37
- Откуда: Тольятти
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Вот подобный агрегат:
Freeman - извини, что влез в тему твоей статьи.
Просто как вариант для развития.
Freeman - извини, что влез в тему твоей статьи.
Просто как вариант для развития.
Это ВАМ не Это...
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
vitrix писал(а):Вот подобный агрегат:
Freeman - извини, что влез в тему твоей статьи.
Просто как вариант для развития.
класс! Вот это уже то, что надо, а можно по подробнее ? печатная плата, пошивка.
- vitrix
- Нашел транзистор. Понюхал.
- Сообщения: 176
- Зарегистрирован: Пн май 31, 2010 16:50:37
- Откуда: Тольятти
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
vahoo писал(а): а можно по подробнее ? печатная плата, пошивка.
Вечером, если Freeman будет не против.
Уже и не помню - откуда скачал.
Есть прошивки на мегу16,32,8535.
Это ВАМ не Это...
- aleksey_gregul
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Ср дек 29, 2010 17:30:34
Re: STEP/DIR контроллер 3-х шаговых двигателей на микроконтр
Когда-то для друга, который хотел начать программировать авр_ки, делал подобное.
Упор делал не на оптимальность работы прошивки, а на максимальность понимания процессов,
происходящих в контроллере на примере понятного ему (другу) задания.
Но тем не менее, оно хоть и учебное, но работало.
Сделано в ИАР_е под МЕГУ8
3 step-dir с режимом "сна"
Поскольку у этого контроллера только 2 внешних прерывания, третьим выбран вход компаратора.
Упор делал не на оптимальность работы прошивки, а на максимальность понимания процессов,
происходящих в контроллере на примере понятного ему (другу) задания.
Но тем не менее, оно хоть и учебное, но работало.
Сделано в ИАР_е под МЕГУ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-х шаговых двигателей на микроконтр
vitrix писал(а):Вечером, если Freeman будет не против.
Freeman не против, вот только эта ветка по конкретному устройству... так что если по вашей теме будет больше 1-2 сообщений, то стоит создать отдельную тему.
В свое время такой проектик не нашел и решил сделать свой. Кроме того он (для меня) избыточен.
Кстати, вместо биполярников лучше ставить полевики...
А вот с джойстиком, идея интересная, надо бы где-то найти и поиграться...
убивец писал(а):Но я не не понял как реализованы концевые выключатели нулевого положения осей х,у,z?
По схеме предусмотрена только кнопка Estop. Остальное - не разведено. Никто вам не мешает дополнить схему концевиками - благо входов в LPT хватает.
А на счет исходников - не выкладываю потому что разведется флуд по теме нерациональности и кривизны написания... Имею горький опыт... Сам я не считаю что прошивка плохо написана, просто, местами, не рационально...
Но ведь программисты, они как из гитаристы из анекдотов:
"- Сколько нужно гитаристов, чтобы вкрутить лампочку?
- 100!
- Почему так много?!
- Один будет вкручивать, а остальные 99 будут критиковать,
и говорить, что они бы это сделали значительно лучше."
