Krokový motor

Z MAM wiki

Verze z 21. 2. 2011, 08:59; Hanzl (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

Krokový motor

Jiří Janecký, Martin Chvála

Obsah

[editovat] Zadání

Ovládání krokového motoru

[editovat] Analýza problému

Soubor:Signaly-Bipolarni_s_polovicnim_krokem.gif Naznačení principu krokoveho motoru - Bipolární řízení s polovičním krokem

Ukázka signálu je pouze pro pravotočivý směr otáčení motoru - generována posloupnost 8,10,2,6,4,5,1,9. Pro otáčení směrem opačným stačí generovat číselnou posloupnost v opačném pořadí.

Schéma zapojení krokového motoru

Princip výkonového oddělení cívky motoru a signálové části

Princip výkonového oddělení cívky motoru a signálové části z procesoru. Na vstupy invertoru jsou přivedeny řídící signály z procesoru.

[editovat] Řešení

Semestrální práce programována v jazyce C:

 /* main.c */
 #include <avr/io.h> // zde je definovan napr. PORTB
 #include <avr/iom168.h> // konstanty pro konkretni typ mikrokontroleru
 
 #define F_CPU 1000000UL
 #include <util/delay.h>                 // toto potrebuji pro pouziti funkce _delay_ms()
 
 int index = 7;                          // ukazatel na předpokládaný stav rotoru
 const int pole[] = {8,10,2,6,4,5,1,9};  // jednotlivé stavy rotoru
 
 int main (void){                        // hlavni funkce programu
 
    /* init */
 
    DDRB=0xFF;                           // Data Direction Register PORTB: kazda nozicka bude vystup
 
    ini();                               // nastavení do předem známého stavu
 
    while(1){                            // periodický pohyb krokového motoru
       kroky(260,0,2);
       kroky(260,1,2);
    }
 }                                       // konec main
 
 int cekej(int cykly){    // Tato funkce vznikla z důvodu špatně implementovaného skriptu _delay_ms(1);
       while(cykly>0){    
          _delay_ms(1);   // po vložení proměnné do teto funkce AVR studio požaduje načíst chybějící soubory
          cykly--;        // toto byl způsob jak se tohoto problému zbavit.
       }
 }
 
 int doleva(void){        // Pootočení rotoru o jeden krok vlevo
       if(index==0) index = 7;   // Ošetření "přetečení"
       else  index--;
       PORTB= pole[index];
       return 0;
 }
 
 int doprava(void){       // Pootočení rotoru o jeden krok vpravo
       if(index==7) index = 0;   // Ošetření přetečení
       else  index++;
       PORTB= pole[index];
       return 0;
 }
 
 int kroky(int pocet,int smer, int cas){ // doleva=0;doprava=1;cas=cas jednoho kroku v ms;pocet=pocet kroku
       while(pocet > 0){
           if(smer==1) doprava();
           else doleva();
           cekej(cas);
           pocet--;
       }
 }
 
 int ini(void){ // inicializace motoru do zakladni polohy
       kroky(7,0,50);
 }


Reálné zapojení krokového motoru

[editovat] Závěr

Podařilo se nám úspěšně rozpohybovat krokový motor disketové mechaniky ve dvou směrech. Naimplementované funkce ovládají motor definováním přesného počtu kroků daným směrem s přednastavenou délkou doby zachování stavu. Ukázka motoru v chodu Video krokový motor. Maximální rychlosti, které se nám podařilo s tímto krokovým motorem docílit bylo 500 kroků za vteřinu. Napájecí napětí invertorů bylo 3,5V při proudové ochraně 130mA. Při zkrácení doby jednoho kroku na 1/1000s se již motor přestal hýbat, dosáhli jsme tak jeho hranice.


[editovat] Hardware

Krokový motor z disketové mechaniky, AVR Dragon, ATmega168, 2x invertor TC4424, 8x dioda 1N5819, 4x LED 2barevná, 4x rezistor

[editovat] Zdroje

invertor TC4424

Krokové motory z robotika.cz

Osobní nástroje