Uživatel:Krehnkar

Z MAM wiki

Přejít na: navigace, hledání

[editovat] Semestrální práce - Třída funkcí pro ovládání krokových motorů

[1] [2]

[editovat] Karel Křehnáč, Tomáš Lukeš

Existuje celá řada různých realizací krokových motorů. Rozlišujeme například aktivní, pasivní, unipolární nebo bipolární krokové motory. Pro naše účely jsme uvažovali použití bipolárního krokového motoru. Jeho výhodou jsou jednoduchá vinutí, ale je nutné měnit jejich polaritu, což může mít za následek složitější řídící obvody. K řízení bipolárních krokových motorů se často používá "H-můstek", který je na následujícím prvním obrázku znázorněn principielně, na vedlejšímo obrázku je poté uvedeno konkrétní možné zapojení.

Soubor:mustek.gifSoubor:dualhbridge.jpg

Celý tento řídící obvod může být nahrazen integrovaným obvodem A3966SLB-T, který lze koupit například v GMe za 50 Kč. K tomuto obvodu se následně připojí pouze externí zdroj ss napětí, obě vinutí krokového motoru , a mikroprocesor. http://www.gme.cz/cz/a3966slb-t-p955-138.html.

Na následujícím obrázku je vidět finální schéma, spolu s řídící sekvencí motorku a s pravdivostní tabulkou A3966 pro jednu fázi (vinutí) motorku. Přes porty PB0 až PB3 mikroprocesoru Atmega168 se krokový motorek ovládá. Na napájecí svorku je možno připojit až 30V (pro krokové motorky s velkým odběrem), pro motorky z disketové mechaniky by mělo stačit mnohem méně (3,5V).

Soubor:SchemaKrokMotor.jpg

Z uvedené pravdivostní tabulky a požadované sekvence pro otáčení motorku vyplývá následujcí nastavení portů PB0 - PB3:

čas ---->

PB0 ... Enable 1 ... 0 1 0 1

PB1 ... Phase 1 ... 1 x 0 x

PB2 ... Enable 2 ... 1 0 1 0

PB3 ... Phase 2 ... x 1 x 0


Řešení - program v jazyce C

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

#define F_CPU 1000000UL
#include <util/delay.h> 
    // Initial stepping 
const int sequence[] = {6,9,4,1};  // posloupnost stavu vinuti motoru
int sequencePointer = 0;           // ukazatel na misto v posloupnosti stavu motoru

int main (void){                   
   
   // Initial port I/O
   DDRB=0xFF;                      // nastaveni PORTB na vystup
   
   //Stepping parameters
int stepsNumber = 60;				//pocet kroku 
int direction = 1;					//doleva=0;doprava=1;
int stepTime = 1000;				//cas jednoho kroku v ms
	                         
stepping(stepsNumber,direction,stepTime);
   
} // end main

int stepping(int stepsNumber,int direction, int stepTime){ 

      while(stepsNumber > 0){
          if(direction==1) rightRotation();
          else leftRotation();
          wait(stepTime);
          stepsNumber--;
      }
      return 0;
} //end stepping

int wait(int loops){    //ceka zadany pocet ms
      
      while(loops>0){    
         _delay_ms(1);   
         loops--;        
      }
      return 0;
}//end wait
int rightRotation(void){       // pootoceni rotoru o jeden krok vpravo
      
      PORTB= sequence[sequencePointer];
      if(sequencePointer==3) sequencePointer = 0;   // navrat na zacatek sekvence
      else  sequencePointer++;
      return 0;    
}//end rightRotation
int leftRotation(void){        // pootoceni rotoru o jeden krok vlevo
      
      if(sequencePointer==0) sequencePointer = 3;
      else  sequencePointer--;   
      PORTB= sequence[sequencePointer];
      return 0;
}//end leftRotation
Osobní nástroje