Tania frezarka

Maszyny wykonane z drewna, płyt meblowych itp.
Tu możesz również przedstawić się i opisać swoją maszynę

Celebrus
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 3
Rejestracja: 15 wrz 2010, 09:46
Lokalizacja: Gniezno

#31

Post napisał: Celebrus » 14 lis 2010, 12:44

Projekt prawie ukończony (drobne poprawki do zrobienia - programowe):

Obrazek

Jak widać kable 'uporządkowane' :lol:
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.

Obrazek

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); 
	}
Obsługa przerwań:

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;} 
	}
Obrazek

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;} 
		} 
	} 
Zjazd na bazę w oparciu o sekwencję załączania 4 kombinacji faz(szybciej):

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
		} 
	}
Obrazek

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 :wink:

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

Oto zrzut ekranu:

Obrazek

Pozdrawiam (efekty wkrótce) :wink:



Tagi:

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Frezarka - konstrukcja drewniana”