Skocz do zawartości

Silnik krokowy + sterownik , dzialanie


ferwus

Pomocna odpowiedź

Witam.

Posiadam silnik: SILNIK KROKOWY SM60/86-3008B oraz sterownik do niego SSK-B03 - 4.2A, 50V,1/128 kroku. Sterownik jest zasilany przez napiecie 40V a prad pracy silnika ustawilem na 3,76A czyli (SW1-On,SW2,SW3-OFF). Sygnaly PUL+ i DIR+ na stale podlaczone do +5V zaś sygnaly PUL- i DIR- sa sterowane przez porty procesora np. PB0,PB1( Atmega128 i zegar zewnentrzny 16.000MHz).

PUL - krok

DIR - kierunek

W parametrach sygnalu sterujacego sterownika SSK-B03 jest np. opisane ze sygnal kierunek DIR jest zalaczany 5 μs przed sygnalem krok PUL. PUL jest sygnalem prostokatnym o dlugosci, ktora nie moze byc mniejsza niz 1,5 μs. Po zmianie kierunku znow musi minac 5μs przed PUL ( opis i rysunek jest w instrukcji do sterownika).

Problem mam w tym jak zrealizowac taki schemat dzialania w jezyku C. Czy mam to realizowac na przerwaniach? czy w jakis inny sposob? Moze ma ktos jakis pomysl lub fragment programu jak zrobic zeby sygnal DIR zalacza sie 5 μs przed sygnalem PUL a PUL ma 1.5 μs i zmiana kierunku nastepuje 5 μs przed sygnalem kroku.

Link do komentarza
Share on other sites

Witam.

Zrobilem programik do obslugi tego sterownika i silnika. Jednak mam problem z dopracowaniem tego do warunkow jakie musze uzyskac. Potrzebuje aby silnik robil 173 kroki w jednym kierunku i zmienial kierunek na przeciwny i rownierz robil 173 kroki czyli tak jakby powracal do kroku 0. I ma tak latac tam i z powrotem. Moj program robi tak ze zmiana kierunku nastepuje tak samo szybko jak sygnal kroku. Chcialem rownierz uzyskac czestotliwosc 1000Hz (1000 krokow na sekunde czyli 5 oborotow na sekunde bo silnik jest 200krokowy) poniewarz wyczytalem ze ten silnik przy takiej czestotliwosci ma najwiekszy moment. A w momencie sprawdzania miernikiem czestotliwosci jaka jest na wyjsciu mam skazania 2 MHz.

#define F_CPU 16000000
#include <avr/io.h>
#include <avr/interrupt.h>

#define KEY1_PIN (1<<PF1)
#define PUL (1<<PA0)
#define DIR (1<<PA1)
#define RUCH PORTA

#define KEY_DOWN1 !(PINF & KEY1_PIN)

uint8_t temp=0, kier=0;
uint16_t licz=0;


void pin_init(void)
{
   DDRA |= 0xFF;

DDRF = 0b00000001;
PORTF= 0b11011110;

//silnik 1000Hz
TCCR0 |= (1<<WGM01);         //tryb TCT
TCCR0 |= (1<<CS01 )|(1<<CS00); //preskaler 64 
OCR0 = 250;                                //rejestr porownania zeby uzyskac 1000Hz
TIMSK |= (1<<OCIE0);

}

ISR(TIMER0_COMP_vect)
{

	if(licz)
		{	

			licz=0;
			licz++;
			PORTA&=~0x01;
			if(licz++==173) {licz = 0;}

           }
	else 
		{
			PORTA|=0x01;
			licz=1;
		}


}


int main (void)
{
   pin_init();



   sei();   //wlaczenie globalnego zezwolenia na przerwania


   while(1)     //glowna petla programu
   {
	if(licz==0){
			if(kier)
			{
				kier=0;
				PORTA&=~0x03;
			}
			else
			{
				kier=1;
				PORTA|=0x03;

			}

				}


}

}
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.