Znaleziono 4 wyniki

autor: KonradM
24 mar 2013, 13:36
Forum: Elektronika CNC
Temat: [Atmega8][C] Program sterujący silnikiem
Odpowiedzi: 13
Odsłony: 2658

tuxcnc, masz racje ALE ja nie chce budować sterownika cudownego o Bóg wie jakich możliwościach ma być w miarę prosto EDUKACYJNIE, nie jestem elektronikiem na co dzień zajmuje sie programowaniem i to niestety nie niskopoziomowym a takim w którym juz zanikło pojęcie bitów :) Niektóre moje pytania mogą być bezsensu lub trywialne, musicie mi wybaczyć ale jeszcze raz coś wrzucę.

Trochę zmieniłem założenia, ma być jeszcze prościej. Praca w pełnym kroku przy nie za wysokich prędkościach.

"zredukowany program" z zaleceniami osób wczesniej :)

http://pastebin.com/NsAYSxy1

Kod: Zaznacz cały

/*
 *	Impulsy kroków odbierane na INT0 :: 4
 *	Kierunek obrotów zależny od PD0 :: 2
 */ 

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

#define F_CPU 1000000

volatile uint8_t licznik = 0; 
volatile uint8_t kroki[4]; 

int main(void) { 
	DDRD = 0x00; 
	DDRC = 0x0f; 
	
	PORTC = 0x00; 
		
	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
	
	sei(); // włączenie przerwań
	
    while(1) { 
		
    } 
} 

ISR(INT0_vect) { // obsługa przerwania INT0
	
		PORTC = 0x00; // krótkie wyłączenie wszystkich t.
		
		
		if( PIND & 0x01 ) { 
			licznik = licznik < 3 ? licznik+1 : 0; 
		} else { 
			licznik = licznik > 0 ? licznik-1 : 3; 
		} 
		
		PORTC = kroki[licznik]; 
} 



Schemat

Obrazek

Jakieś falsztady
link
autor: KonradM
23 mar 2013, 20:14
Forum: Elektronika CNC
Temat: [Atmega8][C] Program sterujący silnikiem
Odpowiedzi: 13
Odsłony: 2658

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"? :)
autor: KonradM
23 mar 2013, 15:57
Forum: Elektronika CNC
Temat: [Atmega8][C] Program sterujący silnikiem
Odpowiedzi: 13
Odsłony: 2658

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
autor: KonradM
21 mar 2013, 19:25
Forum: Elektronika CNC
Temat: [Atmega8][C] Program sterujący silnikiem
Odpowiedzi: 13
Odsłony: 2658

[Atmega8][C] Program sterujący silnikiem

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(); 
} 

Wróć do „[Atmega8][C] Program sterujący silnikiem”