Krokový motor

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Uprava formatovani C kodu)
(kategorie)
 
(Není zobrazeno 9 mezilehlých verzí.)
Řádka 7: Řádka 7:
=== Analýza problému ===
=== Analýza problému ===
-
[[Soubor:KrokovyMotor.gif|Naznačení principu krokoveho motoru]]
+
 
[[Soubor:Signaly-Bipolarni_s_polovicnim_krokem.gif]]
[[Soubor:Signaly-Bipolarni_s_polovicnim_krokem.gif]]
 +
[[Soubor:KrokovyMotor.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.
+
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í.
-
Bipolární řízení s polovičním krokem
+
[[Soubor:Schema_krokovy_motor.png|thumb|left|Schéma zapojení krokového motoru]]
-
+
[[Soubor:Zapojeni_vinuti_civky_motoru.gif| 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.
 +
=== Řešení ===
-
   int main (void){ // hlavni funkce programu
+
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
    
    
-
    //unsigned char a=0; // pomocna promenna
+
  #define F_CPU 1000000UL
-
    unsigned char t=100;
+
  #include <util/delay.h>                // toto potrebuji pro pouziti funkce _delay_ms()
-
    unsigned char dopredu = 0;
+
    
    
-
    /* init */
+
  int index = 7;                          // ukazatel na předpokládaný stav rotoru
 +
  const int pole[] = {8,10,2,6,4,5,1,9};  // jednotlivé stavy rotoru
    
    
-
    DDRB=0xFF; // Data Direction Register PORTB: kazda nozicka bude vystup
+
  int main (void){                        // hlavni funkce programu
    
    
 +
    /* init */
    
    
 +
    DDRB=0xFF;                          // Data Direction Register PORTB: kazda nozicka bude vystup
    
    
-
    /* hlavni smycka */
+
    ini();                              // nastavení do předem známého stavu
    
    
-
    while(dopredu){ // nekonecna smycka
+
    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);
-
  PORTB= 0x08;
+
        while(cykly>0){   
-
  _delay_ms(t);
+
          _delay_ms(1);   // po vložení proměnné do teto funkce AVR studio požaduje načíst chybějící soubory
-
  PORTB= 0x0c;
+
          cykly--;       // toto byl způsob jak se tohoto problému zbavit.
-
  _delay_ms(t);
+
        }
-
  PORTB= 0x02;
+
  }
-
  _delay_ms(t);
+
-
  PORTB= 0x06;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x04;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x05;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x01;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x09;
+
-
  _delay_ms(t);
+
-
     
+
-
   
+
-
     
+
-
    // vystup na nozicky portu B
+
    
    
-
    // pockam nejakou postrehnutelnou dobu
+
  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;
 +
  }
    
    
-
  } // konec nekonecne smycky
+
  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;
 +
  }
    
    
-
  while(!dopredu){
+
  int kroky(int pocet,int smer, int cas){ // doleva=0;doprava=1;cas=cas jednoho kroku v ms;pocet=pocet kroku
-
 
+
        while(pocet > 0){
-
  PORTB= 0x09;
+
            if(smer==1) doprava();
-
  _delay_ms(t);
+
            else doleva();
-
  PORTB= 0x01;
+
            cekej(cas);
-
  _delay_ms(t);
+
            pocet--;
-
  PORTB= 0x05;
+
        }
-
  _delay_ms(t);
+
   }
-
  PORTB= 0x04;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x06;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x02;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x0c;
+
-
  _delay_ms(t);
+
-
  PORTB= 0x08;
+
-
  _delay_ms(t);
+
-
  }
+
-
   } // konec main
+
    
    
-
'''Hardware:'''
+
  int ini(void){ // inicializace motoru do zakladni polohy
 +
        kroky(7,0,50);
 +
  }
 +
 +
[[Soubor:Krokovy_motor_realne_zapojeni.jpg|thumb|left|Reálné zapojení krokového motoru]]
 +
=== '''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 [http://www.youtube.com/watch?v=JnuQ_1EAJYw 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.
 +
 +
 
 +
=== '''Hardware''' ===
 +
 +
Krokový motor z disketové mechaniky,
AVR Dragon,
AVR Dragon,
ATmega168,
ATmega168,
2x invertor TC4424,
2x invertor TC4424,
-
Krokový motor optické mechaniky.
+
8x dioda 1N5819,
-
+
4x LED 2barevná,
 +
4x rezistor
-
==== '''Zdroje:''' ====
+
=== '''Zdroje''' ===
[http://lib.store.yahoo.net/lib/e-clec-tech/tc4424.pdf invertor TC4424]
[http://lib.store.yahoo.net/lib/e-clec-tech/tc4424.pdf invertor TC4424]
[http://robotika.cz/articles/steppers/cs Krokové motory z robotika.cz]
[http://robotika.cz/articles/steppers/cs Krokové motory z robotika.cz]
 +
 +
 +
[[Category:Kód v C]]

Aktuální verze z 21. 2. 2011, 08:59

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