[Atmega8][C] Program sterujący silnikiem

Rozmowy na temat układów elektronicznych sterowania obrabiarek CNC

Autor tematu
KonradM
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 4
Posty: 4
Rejestracja: 21 mar 2013, 19:15
Lokalizacja: Kraków

[Atmega8][C] Program sterujący silnikiem

#1

Post napisał: KonradM » 21 mar 2013, 19:25

Witam,

Dopiero raczkuje w temacie CNC i mikro-kontrolerów mimo to ostatnimi czasy porwałem się na to aby zbudować własny sterownik dla silników bipolarnych. Wyglądać ma to tak, że uC będzie posiadał 4 linie wyjścia służące do załączania odpowiednich tranzystorów, są to piny PC0-PC3, STEP/DIR na pinach PD0(int0)/PD2 , oraz zworka określająca tryb pracy półkrok/pełny krok na pinie PD1. Chciałbym aby ktoś mający doświadczenie praktyczne rzucił na to okiem i stwierdził jak bardzo źle jest :) Czy przerwanie wywoływane zboczem narastającym to dobry pomysł? Z góry dziękuje.


Kod: Zaznacz cały

/*
 *  Created: 2013-03-20 14:44:43
 *	uC: Atmega8
 *
 *	Impulsy kroków odbierane na INT0 :: 4
 *	Kierunek obrotów zależny od PD0 :: 2
 *	Tryb pracy pełny krok/półkrok zależny od PD1 :: 3
 *
 */ 

#include <avr/io.h> 
#include <avr/interrupt.h> 
#include <avr/delay.h> 

#define POLKROK	0
#define PELNYKROK	1

uint8_t licznik = 0, kroki[4], polkroki[8], tryb_pracy = 0; 

int main(void) { 
	DDRD = 0x00; 
	DDRC = 0x0f; 
		
	MCUCR |= (1<<ISC01) | (1<<ISC00) ; // INT0 reaguje na zbocze narastajace
	GICR |= 1 << INT0; // włączenie INT0
	
	kroki[0] = 0b1010; // 0xA
	kroki[1] = 0b0110; // 0x6
	kroki[2] = 0b0101; // 0x5
	kroki[3] = 0b1001; // 0x9
	
	polkroki[0] = 0b0001; 
	polkroki[1] = 0b1001; 
	polkroki[2] = 0b0101; 
	polkroki[3] = 0b0110; 
	polkroki[4] = 0b0100; 
	polkroki[5] = 0b1000; 
	polkroki[6] = 0b0000; 
	polkroki[7] = 0b0010; 
	
	// Pełny krok czy półkrok ? 
	if( PIND & 0x02 ) 
		tryb_pracy = POLKROK; 
	else
		tryb_pracy = PELNYKROK; 

	sei(); // włączenie przerwań
	
    while(1) { 
		
    } 
} 

void pelny_krok() { 
	if( PIND & 0x01 ) { 
		licznik = licznik < 3 ? licznik+1 : 0; 
	} else { 
		licznik = licznik > 0 ? licznik-1 : 3; 
	} 
	PORTC = kroki[licznik]; 
} 

void pol_krok() { 
	if( PIND & 0x01 ) { 
		licznik = licznik < 7 ? licznik+1 : 0; 
	} else { 
		licznik = licznik > 0 ? licznik-1 : 7; 
	} 
	PORTC = polkroki[licznik]; 
} 

ISR(INT0_vect) { // obsługa przerwania INT0
	if(tryb_pracy==POLKROK) 
		pol_krok(); 
	else
		pelny_krok(); 
} 



Tagi:

Awatar użytkownika

noel20
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 2
Posty: 1395
Rejestracja: 02 lip 2010, 07:15
Lokalizacja: Białystok

#2

Post napisał: noel20 » 22 mar 2013, 12:57

Na C to się nie znam wystarczająco, ale widzę, że w półkroku przez połowę czasu tylko jedna cewka jest zasilana.
Prawidłowym rozwiązaniem byłaby płynna zmiana prądu w cewkach. Zajrzyj do noty jakiegoś scalonego sterownika, to będziesz wiedział o co mi chodzi. Choć tam też ideału nie ma.

Chodzi w sumie o to, że w pracy półkrokowej silnik będzie znacznie słabszy.

Awatar użytkownika

grg12
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 3
Posty: 1670
Rejestracja: 03 sty 2007, 14:27
Lokalizacja: Wiedeń

#3

Post napisał: grg12 » 22 mar 2013, 13:27

Co do programu - zmienne globalne używane przez przerywanie prawdopodbnie (a te wspólne dla przerywania i pętli głownej jak np. tryb_pracy - napewno) powinny zostać oznaczone jako "volatile". Bez tego kompilator - zależnie od ustawień i szczęścia - może je "zoptymalizować" w dość nieprzewidziany sposób (ten błąd kosztował mnie kiedyś kilka godzin debugowania).
Co do reszty - " 4 linie wyjścia służące do załączania odpowiednich tranzystorów" nie napisałeś jak te tranzystory są połączone więc na wszelki wypadek zapytam czy mierzyłeś jak długo trwa zamykanie tranzystorów. W twoim programie przejścia pomiędzy "krokami" są robione bez faz całkowicie niektywnych - przy odrobinie pecha w chwili przejścia będziesz miał krótki okres kiedy wszystkie tranzystory mostka jeszcze przewodzą na tyle dobrze że popłynie przez nie prąd wystarczający do ich zniszczenia. Osobiście przed przejściem do następnego kroku dałbym króciutką faze (może nawet wystrczy jeden cykl procesora) kiedy wszystkie wyjscia są wyłączone.
Koljena sprawa - kto/co ogranicza prąd w cewkach? No i co dzieje się z prądem samoindukcji po odłączeniu cewki?
Pozdrawiam
Grzesiek

Awatar użytkownika

ursus_arctos
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 2083
Rejestracja: 11 cze 2011, 18:29
Lokalizacja: Warszawa / Lublin

#4

Post napisał: ursus_arctos » 22 mar 2013, 14:39

W ogóle, to jest słaby pomysł, żeby sterować "tranzystorami". Chyba, że sterujesz gałęziami mostka - to ok.
Silnik krokowy sterowany na zasadzie włącz/wyłącz musiałby chodzić na napięcie "nominalne", czyli jakieś 3-5V, zależnie od modelu. Przy takim sterowaniu nie wyciągniesz więcej niż 1 obrót na sekundę. Jeżeli chcesz sterować z wyższego napięcia, to musi być ograniczenie prądowe, realizowane przez jakiś komparator.
Poza tym, sterowanie tranzystorami musi się odbywać przez odpowiedni driver mostka.

Wydaje mi się, że znacznie mniej zachodu będzie z użyciem układu A4989 (pojawiły się na TME, kosztują 23zł/szt), który realizuje pełne sterowanie 8 tranzystorami, daje mikrokrok 1/16 ma całą masę zabezpieczeń. Jedyną wadą jest niewygodna obudowa TSSOP38.

Awatar użytkownika

noel20
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 2
Posty: 1395
Rejestracja: 02 lip 2010, 07:15
Lokalizacja: Białystok

#5

Post napisał: noel20 » 22 mar 2013, 19:52

Ja kiedyś też chciałem popełnić taki sterownik.

Na każdy silnik dać po atmedze, 8 tranzystorów na mostek H i jeszcze zasilanie każdego mostka puścić przez dodatkowy tranzystor kontrolowany przez atmegę. Miał to być chopper a jednocześnie chciałem w ten sposób realizować mikrokrok, bo po zabawach z eliminacją rezonansu silnika doszedłem do wniosku, że bez mikrokroku to nie ma szans działać stabilnie i poprawnie w całym zakresie prędkości. Do tego potencjometr do płynnego ustalania znamionowego prądu cewek silnika.

Zacząłem nawet pisać program i z obliczeń wyszło, że adc i cały program powinien się wyrobić bez problemu i ma to na prawdę dusze szanse działać.

Ale po podliczeniu kosztów: 8 atmeg, 30 transystorów i kupa drobnicy, przeszła mi chęć.


Autor tematu
KonradM
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 4
Posty: 4
Rejestracja: 21 mar 2013, 19:15
Lokalizacja: Kraków

#6

Post napisał: KonradM » 23 mar 2013, 15:57

Wielkie dzięki za odpowiedzi na pewno skorzystam ze wskazówek. Co do sposobu podłączenia uC do mostków H to uproszczony schemat prezentuje sie tak, póki co pusciłem to na jakimś symulatorze i w wersji wirtualnej zdawało się działać dobrze, tranzystory nie zostały uszkodzone :)

Obrazek

Awatar użytkownika

grg12
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 3
Posty: 1670
Rejestracja: 03 sty 2007, 14:27
Lokalizacja: Wiedeń

#7

Post napisał: grg12 » 23 mar 2013, 17:52

Brakuje diód przeciwprzepięciowych (popatrz na notę aplikacyjną L298). Prąd cewek jest ograniczony tylko napięciem zasilania i rezystancją cewki (będzie albo wolno albo "z dymem"). Nie podałeś typu tranzystorów (ani wartości elementów) - sterujesz MOSFETy bezpośrednio z wyjść procesora o małej wydajności prądowej, czas przełączania będzie spory - tranzystory będą się grzały.
Ogólnie - całkiem fajny projekt do nauki ale raczej używaj tanich elementów :)


Autor tematu
KonradM
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 4
Posty: 4
Rejestracja: 21 mar 2013, 19:15
Lokalizacja: Kraków

#8

Post napisał: KonradM » 23 mar 2013, 20:14

Wcześniejszy schemacik jest tylko ideowy chodziło mi o sam pomysł rozwiązania ale tak czy siak jeszcze raz dzięki za uwagi :)
Czy gdybym do sterowania MOSFETami użył układu ULN2803 pomiędzy uC a mostkami to byłby lepiej, czy to dobry trop? czy raczej "droga nie tędy"? :)

Awatar użytkownika

tuxcnc
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 7861
Rejestracja: 26 lut 2011, 23:24
Lokalizacja: mazowieckie

#9

Post napisał: tuxcnc » 23 mar 2013, 22:30

KonradM pisze:Wcześniejszy schemacik jest tylko ideowy
Nie bardzo rozumiem o co Ci chodzi.
Jak to "tylko ideowy" ?
Po cholerę robisz coś co nie ma prawa działać ?
Czasu Ci nie szkoda ?

Takie układy albo się palą, albo do niczego nie nadają.
Bramkę górnego mosfeta podłączasz do masy, jakie zasilanie to wytrzyma ?
Sterowanie dolnych tranzystorów bezpośrednio z procesora to też głupi pomysł.
A pomiar prądu jak zrobisz ?

Nie takie układy na nie takich procesorach lądowały na śmietniku.
Daj sobie spokój.

.

Awatar użytkownika

ursus_arctos
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 2083
Rejestracja: 11 cze 2011, 18:29
Lokalizacja: Warszawa / Lublin

#10

Post napisał: ursus_arctos » 24 mar 2013, 10:37

Tux jak zwykle musi odpowiedzieć tak, żeby obrazić maksymalną liczbę osób w otoczeniu :P

Wracając do meritum: ten układ nie zadziała - chociażby dlatego, że P-mosfet na górze jest do góry nogami. MOSFET zawiera diodę przeciwrównoległą, jak go podłączysz odwrotnie, to będzie przez nią płynął prąd niezależnie od stanu bramki.
Aby zrealizować półkrokowy driver silnika potrzebowałbyś jeszcze rezystora do pomiaru napięcia (typowo - 0.1...0.3 Ω), komparatora i potencjometru do regulacji napięcia odniesienia. Komparator z otwartym kolektorem można połączyć z wyjściem ATMegi (jeżeli te również będą w trybie OC), dorobić niewielką pętlę sprzężenia dodatniego (lub użyć komparatora z przerzutnikiem Schmitta, jeżeli w ogóle takie są) i powinno hulać. ATMega w ogóle nie musi się zajmować prądem.
Dać się da. Ale czy to będzie opłacalne? Przy seryjnej produkcji pewnie tak; przy 1 sztuce (na 3 osie) - zdecydowanie nie. Lepiej użyć A4989.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Elektronika CNC”