Krokový motor
Z MAM wiki
(kategorie) |
|||
(Není zobrazeno 7 mezilehlých verzí.) | |||
Řádka 7: | Řádka 7: | ||
=== Analýza problému === | === Analýza problému === | ||
- | + | ||
[[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í. |
- | + | [[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í === | ||
+ | |||
+ | Semestrální práce programována v jazyce C: | ||
/* main.c */ | /* main.c */ | ||
Řádka 20: | Řádka 27: | ||
#define F_CPU 1000000UL | #define F_CPU 1000000UL | ||
- | #include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms() | + | #include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms() |
- | int | + | 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); | |
- | + | } | |
- | + | ||
- | + | ||
- | + | [[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 | + | === '''Hardware''' === |
+ | Krokový motor z disketové mechaniky, | ||
AVR Dragon, | AVR Dragon, | ||
ATmega168, | ATmega168, | ||
2x invertor TC4424, | 2x invertor TC4424, | ||
- | + | 8x dioda 1N5819, | |
- | + | 4x LED 2barevná, | |
+ | 4x rezistor | ||
- | + | === '''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
Obsah |
[editovat] Zadání
Ovládání krokového motoru
[editovat] Analýza problému
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í.
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); }
[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