Re: Подскажите по элетронике
Добавлено: 25 сен 2012, 18:20
а четвертая ось для каких целей нужна, добавлять ее или не стоит. почти заканчиваю
Статьи, обзоры, цены на станки и комплектующие.
https://cnc-club.ru/forum/
фото чего получилось то?shurikss123 писал(а):а четвертая ось для каких целей нужна, добавлять ее или не стоит. почти заканчиваю
Код: Выделить всё
/*
* main.c
*
* Created on: 24.09.2012
* Author: shurik
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define a 0b1000
#define b 0b0100
#define c 0b0010
#define d 0b0001
#define z 0b0000
volatile uint8_t Control_Port = 0;
volatile int stepX = 0;
volatile int dirX = 0;
volatile int posX = 0;
volatile int stepY = 0;
volatile int dirY = 0;
volatile int posY = 0;
volatile int stepZ = 0;
volatile int dirZ = 0;
volatile int posZ = 0;
volatile int operation = 0;
volatile uint8_t Xcount[] =
{ a, b, c, d, z };
volatile uint8_t Ycount[] =
{ a, b, c, d, z };
volatile uint8_t Zcount[] =
{ a, b, c, d, z };
int main()
{
PORTA = 0xff;
while (1)
{
Control_Port = PINA;
// control start
// X
switch (!(Control_Port & (1 << PIN0)))
{
case 1:
{
dirX = 1;
break;
}
case 0:
{
dirX = 0;
break;
}
default:
break;
}
switch (!(Control_Port & (1 << PIN1)))
{
case 1:
{
if (stepX == 0)
{
stepX = 1;
}
break;
}
case 0:
{
if (stepX == 1)
{
stepX = 2;
}
break;
}
default:
break;
}
// Y
switch (!(Control_Port & (1 << PIN2)))
{
case 1:
{
dirY = 1;
break;
}
case 0:
{
dirY = 0;
break;
}
default:
break;
}
switch (!(Control_Port & (1 << PIN3)))
{
case 1:
{
if (stepY == 0)
{
stepY = 1;
}
break;
}
case 0:
{
if (stepY == 1)
{
stepY = 2;
}
break;
}
default:
break;
}
// Z
switch (!(Control_Port & (1 << PIN4)))
{
case 1:
{
dirZ = 1;
break;
}
case 0:
{
dirZ = 2;
break;
}
default:
break;
}
switch (!(Control_Port & (1 << PIN5)))
{
case 1:
{
if (stepZ == 0)
{
stepZ = 1;
}
break;
}
case 0:
{
if (stepZ == 1)
{
stepZ = 2;
}
break;
}
default:
break;
}
//X
if (stepX == 2)
{
if (dirX == 1)
{
if (posX < 3)
{
posX++;
}
else
{
posX = 0;
}
}
else
{
if (posX > 0)
{
posX--;
}
else
{
posX = 3;
}
}
operation = 1;
stepX = 0;
}
//Y
if (stepY == 2)
{
if (dirY == 1)
{
if (posY < 3)
{
posY++;
}
else
{
posY = 0;
}
}
else
{
if (posY > 0)
{
posY--;
}
else
{
posY = 3;
}
}
operation = 1;
stepY = 0;
}
//Z
if (stepZ == 2)
{
if (dirZ == 1)
{
if (posZ < 3)
{
posZ++;
}
else
{
posZ = 0;
}
}
else
{
if (posZ > 0)
{
posZ--;
}
else
{
posZ = 3;
}
}
operation = 1;
stepZ = 0;
}
if (operation == 1)
{
DDRD = (Xcount[posX]) | (Ycount[posY] << 4);
DDRC = Zcount[posZ];
operation = 0;
_delay_ms(20); //тут можно откалибровать под двигатель
}
else
{
DDRD = (Xcount[4]) | (Ycount[4] << 4);
DDRC = Zcount[4];
}
}
}
Это исходник чего?shurikss123 писал(а):Там по проводам пока не понятно, вид ужасает, но исходник такой
контроллера (atmega16)Bender писал(а):Это исходник чего?shurikss123 писал(а):Там по проводам пока не понятно, вид ужасает, но исходник такой
Код: Выделить всё
*
* main.c
*
* Created on: 24.09.2012
* Author: shurik
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define a 0b1000
#define b 0b0100
#define c 0b0010
#define d 0b0001
#define z 0b0000
volatile uint8_t Control_Port = 0;
volatile int stepX = 0;
volatile int dirX = 0;
volatile int posX = 0;
volatile int stepY = 0;
volatile int dirY = 0;
volatile int posY = 0;
volatile int stepZ = 0;
volatile int dirZ = 0;
volatile int posZ = 0;
volatile int operation = 0;
volatile uint8_t Xcount[] =
{ a, b, c, d, z };
volatile uint8_t Ycount[] =
{ a, b, c, d, z };
volatile uint8_t Zcount[] =
{ a, b, c, d, z };
int main()
{
PORTA = 0xff;
while (1)
{
Control_Port = PINA;
// control start
// X
dirX=!(Control_Port & (1 << PIN0)))
switch (!(Control_Port & (1 << PIN1)))
{
case 1: if (stepX == 0) stepX = 1; break;
case 0: if (stepX == 1) stepX = 2; break;
}
// Y
dirY=!(Control_Port & (1 << PIN2)))
switch (!(Control_Port & (1 << PIN3)))
{
case 1: if (stepY == 0) stepY = 1; break;
case 0: if (stepY == 1) stepY = 2; break;
}
// Z
dirZ=!(Control_Port & (1 << PIN4)))
switch (!(Control_Port & (1 << PIN5)))
{
case 1: if (stepZ == 0) stepZ = 1;break;
case 0: if (stepZ == 1) stepZ = 2;break;
}
//X
if (stepX == 2)
{
if (dirX == 1)
if (posX < 3) posX++; else posX = 0;
else
if (posX > 0) posX--; else posX = 3;
operation = 1;
stepX = 0;
}
//Y
if (stepY == 2)
{
if (dirY == 1)
if (posY < 3) posY++; else posY = 0;
else
if (posY > 0) posY--; else posY = 3;
operation = 1;
stepY = 0;
}
//Z
if (stepZ == 2)
{
if (dirZ == 1)
if (posZ < 3) posZ++; else posZ = 0;
else
if (posZ > 0) posZ--; else posZ = 3;
operation = 1;
stepZ = 0;
}
if (operation == 1)
{
DDRD = (Xcount[posX]) | (Ycount[posY] << 4);
DDRC = Zcount[posZ];
operation = 0;
_delay_ms(20); //тут можно откалибровать под двигатель
}
else
{
DDRD = (Xcount[4]) | (Ycount[4] << 4);
DDRC = Zcount[4];
}
}
}А мне наоборот удобней и ясней.Bender писал(а):Тяжко читать ваш исходник...((
Бросается в глаза. да.Bender писал(а):Оч. много лишних "{ }"
Почему кнопки? я не считаю, шаги он их делает в зависимости от направления и сигнала степ.Bender писал(а):Так вы просто по нажатию кнопки делаете шаг? И считаете его?
Это оч. просто...shurikss123 писал(а):Почему кнопки? я не считаю, шаги он их делает в зависимости от направления и сигнала степ.
Чего делал?shurikss123 писал(а):чтоб он делал 10 шагов + после 5 шагов назад, чтоб соответствовала двигателя и контроллера
чтоб первый шаг соответствовал позиции двигателя.Nick писал(а):Чего делал?
А это имхо не так важно, все равно, при любом перемещении произойдет тоже самое.shurikss123 писал(а):чтоб первый шаг соответствовал позиции двигателя.
не до конца нет нормального кабеля(LPT), так что тока один двигатель тестил, вроде работает как надо,будем тестить в конце недели.2cme писал(а):В железе (hardware) что-то воплотилось? Прошивку (firmware) для авр отладили?.
???shurikss123 писал(а):будем тестить в конце недели.
Лесенки не будет, насколько я понимаю микрошаг в основном делают для более плавной работы двигателей.Rafiq писал(а):Не будет ли заметной "лесенки"
Если я не ошибаюсь: Микрошаг делают для того чтобы получить большую разрешающую способность, избавится от резонанса и т.д.Nick писал(а):Лесенки не будет, насколько я понимаю микрошаг в основном делают для более плавной работы двигателей.