//============================================ // Ovladani krokoveho motoru pomoci napetoveho vstupu // verze 1 // (2.5.2016) //============================================ // // // Zapojeni: //============= // ATtiny13 // +-\_/-+ // nezapojeno (RESET) - PB5 1| |8 Vcc // vystup D = civka 2 - PB3 2| |7 PB2 vystup C = civka 2 // vstup ovladaciho napeti - (ADC2) PB4 3| |6 PB1 vystup B = civka 1 // GND 4| |5 PB0 vystup A = civka 1 // +-----+ // // // Vystupy ATtiny13 (A az D) ovladaji vstupy siloveho H-mustku (L298). // Vystupy H-mustku pousti napeti v potrebne polarite do civek motoru // // nastaveni FUSE bajtu: //======================== // LowFUSE : 0x7A // HighFUSE : 0xFF // // velikost prelozeneho programu 412 Bajtu (vyuzito 40% pameti) // //============================================================================================================= byte sekvence[9]; // definice jednotlivych kroku byte i = 0 ; // index aktualniho kroku byte vstup; // zmerene napeti na A/D prevodniku int pauza; // pauza mezi jednotivymi kroky // **************** P O D P R O G R A M Y ****************** // podprogram pro cteni analogove hodnoty z nastaveneho A/D prevodniku byte adc_read (byte kanal) { ADMUX = 0b00100000 | kanal; // zakladni nastaveni A/D prevodniku - ADLAR na "1" (=nejvyssich 8 bitu je pohromade) a nastaveni prislusneho vstupu ADCSRA |= 0b01000000; // Start bit se nastavi do "1" while (ADCSRA & 0b01000000); // cekani na ukonceni prevodu (bit ADSC v registru ADSRA padne do "0") return ADCH; // V ADCH je 8 nejvyssich bitu z namerene hodnoty } // **************** Z A C A T E K P R O G R A M U ****************** void setup (void) { delay(50); // chvilku pauza po zapnuti napajeni DDRB = 0b00001111; // nastaveni smeru signalu na portu B ("1" = vystup ; "0" = vstup) PORTB = 0b00000000; // vsechny vystupy do "0" a vstup bez Pull-Upu // definice jednotlivych kroku (stridani polarity napajeni na civkach) // krokovani po polovicnich krocich // civka 2 civka 1 // PB3 PB2 PB1 PB0 sekvence[1] = 0b00001000; // + 0 sekvence[2] = 0b00001010; // + + sekvence[3] = 0b00000010; // 0 + sekvence[4] = 0b00000110; // - + sekvence[5] = 0b00000100; // - 0 sekvence[6] = 0b00000101; // - - sekvence[7] = 0b00000001; // 0 - sekvence[8] = 0b00001001; // + - } // **************** N E K O N E C N A S M Y C K A ****************** void loop() { vstup = adc_read(2); // zjisteni 8-bitove hodnoty z A/D prevodniku na pinu PB4 (=ADC2) pauza = 1; if (vstup < 121) // potenciometr natocen v dolni polovine => jeden smer otaceni { i++ ; // index jednotlivych kroku se zvetsuje if (i > 8) i = 1; pauza = (vstup * 4) + 2; // prepocet ze vstupniho napeti 0 az 120 digitu na pauzu 2 az 482ms } if (vstup > 135) // potenciometr natocen v horni polovine => druhy smer otaceni { i-- ; // index jednotlivych kroku se zmensuje if (i < 1) i = 8; pauza = (vstup * -4) + 1022; // prepocet ze vstupniho napeti 135 az 255 digitu na pauzu 482 az 2ms } // v oblasti kolem poloviny rozsahu potenciometru (mezi 121 a 135 digity) // se index kroku nemeni (motor stoji) PORTB = sekvence[i]; // odeslani pozadovanych logickych stavu na vystup delay(pauza); // pauza udava rychlost prepinani mezi jednotlivymi kroky }