Krokový motor
Z MAM wiki
Krokový motor
Obsah |
Zadání
Ovládání krokového motoru
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.
Ř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); }
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.
Hardware
Krokový motor z disketové mechaniky, AVR Dragon, ATmega168, 2x invertor TC4424, 8x dioda 1N5819, 4x LED 2barevná, 4x rezistor