
Jak widać kable 'uporządkowane'

Na dole zasilacz, wykorzystuje 5V do zasilenia sterowników, silników oraz wyświetlacza LCD.
Silniki mają prąd maksymalny 1,2 A. LCD to oparty o sterownik HD44780 wyświetlacz o 2 wierszach (każdy po 16 znaków). Sterowniki każdy ma po 4 tranzystory. Wszystkie 12 na jednym radiatorze (podkładki mikowe). Drugie napięcie które wykorzystuje ma wartość 12 V, służy do zasilenia 3 wentylatorów.

Konstrukcja zaopatrzona jest w 4 procesory, 3 do sterowania silnikami (atmega8) oraz jeden do wysterowania wyświetlacza (atmega16). Dlaczego atmega16, otóż dlatego, że posiada ona 3 zewnętrzne przerwania INT0, INT1, INT2, każda z osi podaje sygnał na wybrany INT i tym samym wyświetlacz pokazuje aktualną pozycję każdej z osi oraz czy nowy ruch jest cofający do bazy czy też oddalającym go (+ lub -). Duża częstotliwość kroków i potrzebny czas na wyświetlenie zmusił mnie do odświeżania LCD co 10 przerwań (np INT1 - 4, INT0 - 4, INT2 - 2). Każda z sterowników wykorzystuje 3 wejścia Atmegi16 (krok, kierunek, czy jesteś już na bazie - stan początkowy nie aktywowane przerwania).
Stan początkowy:
Kod: Zaznacz cały
void waitFM(void)
{
char poczatekNapis0[32] = {'Z','J','A','Z','D',' ','N','A',' ','B','A','Z','E','.',' ',' '
,'P','W','S','Z','-','6','9','3','-','2','0','1','1',' ',' ',' '};
char poczatekNapis1[32] = {'Z','J','A','Z','D',' ','N','A',' ','B','A','Z','E','.','.',' '
,'P','W','S','Z','-','6','9','3','-','2','0','1','1',' ',' ',' '};
char poczatekNapis2[32] = {'Z','J','A','Z','D',' ','N','A',' ','B','A','Z','E','.','.','.'
,'P','W','S','Z','-','6','9','3','-','2','0','1','1',' ',' ',' '};
WlaczLCD();
while(bit_is_clear(PINB,0) || bit_is_clear(PINB,1) || bit_is_clear(PINB,3))
{
/* oczekiwanie az osie osiagna baze */
UstawKursor(1, 1);
WyswietlLCD(poczatekNapis0, 16);
UstawKursor(2, 1);
WyswietlLCD(poczatekNapis0+16,16);
_delay_ms(500);
UstawKursor(1, 1);
WyswietlLCD(poczatekNapis1, 16);
UstawKursor(2, 1);
WyswietlLCD(poczatekNapis1+16,16);
_delay_ms(500);
UstawKursor(1, 1);
WyswietlLCD(poczatekNapis2, 16);
UstawKursor(2, 1);
WyswietlLCD(poczatekNapis2+16,16);
_delay_ms(500);
}
Kod: Zaznacz cały
ISR(INT0_vect)
{
if(bit_is_set(PINC,2)){zmienna_x+=1;}
if(bit_is_clear(PINC,2)){zmienna_x-=1;}
p+=1;
if(p==10){refresh();p=0;}
}
ISR(INT1_vect)
{
if(bit_is_set(PINC,1)){zmienna_y+=1;}
if(bit_is_clear(PINC,1)){zmienna_y-=1;}
p+=1;
if(p==10){refresh();p=0;}
}
ISR(INT2_vect)
{
if(bit_is_set(PIND,7)){zmienna_z+=1;}
if(bit_is_clear(PIND,7)){zmienna_z-=1;}
p+=1;
if(p==10){refresh();p=0;}
}

Sterowanie ręczne odbywa się przy pomocy przycisków wyboru kierunku i ruchu w oparciu o sterowanie pół krokowe:
Kod: Zaznacz cały
void polkroklewy(void)
{
switch(x1pol)
{
case 0: {x1pol = 1;x2pol = 0;PORTC = 0x04; x1 = 1; x2 = 0;
_delay_ms(2);break;}//pj
case 1: {x1pol = 2;x2pol = 1;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x0C; x1 = 1; x2 = 0;
_delay_ms(2);
PORTB &= ~_BV(1);
break;}
case 2: {x1pol = 3;x2pol = 2;PORTC = 0x08; x1 = 2; x2 = 1;
_delay_ms(2);break;}//pj
case 3: {x1pol = 4;x2pol = 3;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x18; x1 = 2; x2 = 1;
_delay_ms(2);
PORTB &= ~_BV(1);
break;}
case 4: {x1pol = 5;x2pol = 4;PORTC = 0x10; x1 = 3; x2 = 2;
_delay_ms(2);break;}//pj
case 5: {x1pol = 6;x2pol = 5;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x30; x1 = 3; x2 = 2;
_delay_ms(2);
PORTB &= ~_BV(1);
break;}
case 6: {x1pol = 7;x2pol = 6;PORTC = 0x20; x1 = 0; x2 = 3;
_delay_ms(2);break;}//pj
case 7: {x1pol = 0;x2pol = 7;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x24; x1 = 0; x2 = 3;
_delay_ms(2);
PORTB &= ~_BV(1);
break;}
}
}
Kod: Zaznacz cały
void obrot2(void)
{
switch(x2)
{
case 0: {x2 = 1; x1 = 0; x2pol = 3;x1pol = 2;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x18; _delay_ms(2);
PORTB &= ~_BV(1);
break;}//1 i 4
case 1: {x2 = 2; x1 = 1; x2pol = 5;x1pol = 4;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x30; _delay_ms(2);
PORTB &= ~_BV(1);
break;}//2 i 4
case 2: {x2 = 3; x1 = 2; x2pol = 7;x1pol = 6;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x24; _delay_ms(2);
PORTB &= ~_BV(1);
break;}//2 i 3
case 3: {x2 = 0; x1 = 3; x2pol = 1;x1pol = 0;
PORTB |= _BV(1); PORTB &= ~_BV(2);
PORTC = 0x0C; _delay_ms(2);
PORTB &= ~_BV(1);
break;}//1 i 3
}
}

Wszystkie przerwania reagują na zbocze narastające. Całość wygląda tak jak to widać na załączonych obrazkach. Problemem są oscylacje powstające na końcówce frezującej, ale to już kwestia wiertarki. Pozdrawiam. Tymczasem

[ Dodano: 2010-11-15, 11:00 ]
PS. Piszę również swój program do sterowania (język C#):
Oto zrzut ekranu:

Pozdrawiam (efekty wkrótce)
