Belajar Mini Stepper Motor

Motor stepper banyak digunakan dalam industri modern dan produk buatan sendiri. Mereka digunakan jika perlu untuk memastikan keakuratan penentuan posisi komponen mekanik, tanpa menggunakan umpan balik dan pengukuran yang akurat.

Hari ini saya ingin berbicara tentang jenis motor stepper khusus - motor stepper miniatur, yang digunakan dalam pembangunan sistem optik. Kami akan melihat lebih dekat pada perangkat mereka dan bagaimana mengontrol motor sekecil itu.



Motor stepper adalah motor listrik brushless (tanpa sikat) dengan beberapa belitan (fase) yang terletak di stator dan magnet (sering permanen) pada rotor. Dengan memberikan tegangan pada belitan stator, kita dapat memperbaiki posisi rotor, dan dengan memberikan tegangan pada belitan, kita dapat secara berturut-turut mendapatkan pergerakan rotor dari satu posisi ke posisi lain (langkah), dan langkah ini memiliki nilai sudut tetap.

Kami tidak akan memikirkan pertimbangan masing-masing jenis motor stepper. Banyak yang telah ditulis tentang ini di jaringan dan, misalnya, di sini .

Saya ingin berbicara tentang jenis motor stepper khusus - motor stepper miniatur, yang digunakan dalam pembangunan sistem optik. Anak-anak ini tersedia untuk dijual. Tetapi pada jaringan, terutama dalam berbahasa Rusia, ada sangat sedikit informasi tentang motor tersebut. Karena itu, ketika saya perlu menggunakannya dalam proyek saya, saya harus cukup mencari informasi dan melakukan beberapa percobaan.

Saya akan membagikan hasil pencarian dan percobaan saya di artikel ini.

Kami akan mempertimbangkan manajemen motor kecil tersebut, yaitu:

  • driver L293D + mikrokontroler ATtiny44;
  • Driver TMC2208 + mikrokontroler ATtiny44;
  • mikrokontroler ATtiny44 (tanpa driver).

Sebenarnya, hanya poin terakhir yang dapat menimbulkan pertanyaan di sini. Percayalah, saya juga terkejut ketika saya menemukan klip video (ini dia ), di mana orang itu hanya mengambil dan langsung menghubungkan motor stepper ke pin mikrokontroler! Tapi mari kita bicara tentang semuanya secara berurutan.

Kenalan


Pertama, lihat sedikit penampilan pahlawan kita:



Dia benar-benar sangat kecil! Menurut buku pintar Petrenko S.F.
"Motor piezoelektrik dalam instrumentasi", motor elektromagnetik yang lebih kecil, pada prinsipnya, tidak mungkin untuk dibuat ... yaitu, itu mungkin, tetapi dengan penurunan diameter kawat dari mana gulungan dibuat, semakin banyak energi yang dihamburkan sebagai panas ke lingkungan, yang mengarah pada penurunan efisiensi motor dan membuat penggunaannya tidak rasional.

Dari yang luar biasa, dapat dicatat bahwa porosnya sangat pendek dan memiliki alur khusus untuk memasang gear atau tuas.

Dua belitan terlihat jelas, yang bahkan ditutupi dengan isolasi berbagai warna. Jadi, motor kita kemungkinan besar milik kelas motor stepper bipolar.
Mari kita lihat cara kerjanya:



Saya pikir kenalan kita dengan motor ini tidak akan lengkap jika kita tidak melihat apa yang ada di dalamnya. Itu selalu menarik untuk melihat ke dalam mekanisme! Bukan begitu?

Sebenarnya, kami tidak melihat sesuatu yang tidak biasa. Rotor bermagnet. Tidak ada bantalan di mana pun, semuanya ada di bushing. Hub belakang ditekan ke rumah engine. Bagian depan tidak diperbaiki oleh apa pun. Menariknya, bodi mesin itu dirakit dengan spot welding. Jadi sampul depan harus dipotong.

Sekarang kita beralih ke masalah koneksi dan karakteristik kelistrikannya.

Pastikan dia bipolar dengan membunyikan belitan. Benar-benar bipolar, seperti pada gambar di atas. Perlawanan berliku sekitar 26 ohm , meskipun penjual mengindikasikan 14 ohm.
Deskripsi mengatakan bahwa tegangan suplai 5V . Meskipun kita semua tahu bahwa untuk motor stepper, arus yang akan digunakan belitannya penting.
Kami mencoba terhubung.

Eksperimen No. 1. L293D + ATtiny44


Seperti yang kita ketahui, untuk mengendalikan motor stepper bipolar, perlu tidak hanya untuk memberi tegangan pada dua belitan dalam urutan yang diinginkan, tetapi juga untuk mengubah arah arus dalam belitan ini, dan untuk melakukan hal ini secara independen satu sama lain. Untuk ini, setiap belitan membutuhkan jembatan-H sendiri. Agar tidak menghalanginya dari transistor, chip L293D yang sudah jadi diambil. Keunggulan lainnya - chip ini memiliki pin khusus Enable1 dan Enable2, yang menghidupkan dan mematikan setiap jembatan. Mereka dapat digunakan untuk memberikan sinyal PWM, dengan demikian, dimungkinkan untuk mengontrol tegangan suplai setiap jembatan. Mengapa ini diperlukan, kita akan melihat lebih jauh.

Selain itu, L293D dapat mengganti tegangan hingga 36V dan menghasilkan hingga 1,2A per saluran, yang seharusnya cukup untuk menyalakan belitan motor kami.

Jadi, diagram:



Input kontrol L293D terhubung ke output OC0A dan OC0B, yang akan memungkinkan kita untuk mengirim sinyal PWM kepada mereka di masa depan.

Kami akan mem-flash controller melalui in-circuit programmer (tidak ditampilkan dalam diagram).
Inilah yang terlihat seperti rangkaian rakitan di papan tempat memotong roti:



Dan inilah bagaimana uji



coba kami berada: Sekarang Anda dapat mulai bereksperimen.

Kami menghitung arus yang akan mengalir melalui belitan motor ketika mereka terhubung ke tegangan 5V:

I = U / R = 5V / 26Ohm = 190mA

Sangat kecil. Saya ingin tahu berapa lama dia bisa menahan arus dan tidak terlalu panas.

Kami menyertakan ammeter dan voltmeter di sirkuit salah satu belitan, dan mengukur nilai yang sesuai ketika daya disuplai ke belitan ini melalui pengemudi.

Ketika tegangan turun di belitan 2.56V, ammeter menunjukkan arus 150mA , dan jelas terlihat bagaimana besarnya arus mulai turun selama pemanasan belitan. Perlu dicatat bahwa tidak begitu panas.

Setelah memastikan bahwa tegangan 5V untuk motor tidak berbahaya, coba putar mereka ke arah yang berbeda. Dan sekarang beberapa kata yang akan kita katakan tentang mode operasi motor stepper.

Ini cukup baik dikatakan di sini .

Kami tidak akan mengulangi, tetapi ingat bahwa motor stepper dapat beroperasi dalam tiga mode:

  • , , .
  • , , , .
  • , , , ( ) . , , ( , , ). .

Mari kita coba untuk mengimplementasikan dua mode pertama pada chip L293D, dan untuk mode micro-step, kita akan meninggalkan driver khusus dari percobaan kedua.

Kode sumber program adalah sebagai berikut:

Kode sumber WinAVR
#define F_CPU 8000000UL  //    

//    L: E2; H:DF; Ex:FF; 
//    8         (     8)

#include <avr/io.h> //   

#include <util/delay.h> //   

#include <avr/interrupt.h> //   

//   

#define LED_pin PA5

#define LED_ON PORTA |=(1<<LED_pin)

#define LED_OFF PORTA &=(~(1<<LED_pin))

//     L293DD

#define PWM_1 PB2 // OC0A (EN1)

#define PWM_2 PA7 // OC0B (EN2)

#define PWM_1_value OCR0A

#define PWM_2_value OCR0B

//       L293D

#define IN1 PA0 //  PORTA

#define IN2 PA1

#define IN3 PB1 //  PORTB

#define IN4 PB0

void delay_microsecond (unsigned int delay_time) { //     
    
	//      

    for(unsigned int delay_us = 0; delay_us<delay_time; delay_us++) {
	
	    _delay_us(1);
	
	}

}

void delay_millisecond (unsigned int delay_time) { //     

    for(unsigned int delay_ms = 0; delay_ms<delay_time; delay_ms++) {
	
	    _delay_ms(1);
	
	}

}

//      

void step_1_one_phase (void) {

    PORTB &=(~((1<<IN3)|(1<<IN4)));
	
	PORTA &=(~(1<<IN2)); //   
  
    PORTA |=(1<<IN1); //    
}

void step_2_one_phase (void) {

    PORTA &=(~((1<<IN1)|(1<<IN2)));
	
	PORTB &=(~(1<<IN3));
  
    PORTB |=(1<<IN4);
  
}

void step_3_one_phase (void) {

    PORTB &=(~((1<<IN3)|(1<<IN4))); 
	 
	PORTA &=(~(1<<IN1));
  
    PORTA |=(1<<IN2);
  
	
}

void step_4_one_phase (void) {

    PORTA &=(~((1<<IN1)|(1<<IN2))); 
	
	PORTB &=(~(1<<IN4));
    
    PORTB |=(1<<IN3);
  
}

//      

void step_1_two_phase (void) {

    PORTB |=(1<<IN4);  
  
    PORTB &=(~(1<<IN3));
  
    PORTA |=(1<<IN1);
  
    PORTA &=(~(1<<IN2));
}

void step_2_two_phase (void) {

    PORTA &=(~(1<<IN2));//2
	
	PORTA |=(1<<IN1);
  
    PORTB |=(1<<IN3);
  
    PORTB &=(~(1<<IN4));
  
}

void step_3_two_phase (void) {

    PORTB |=(1<<IN3);//3
  
    PORTB &=(~(1<<IN4));
	
	PORTA &=(~(1<<IN1));
  
    PORTA |=(1<<IN2);
  
	
}

void step_4_two_phase (void) {

    PORTA |=(1<<IN2);//4
  
    PORTA &=(~(1<<IN1));
    
    PORTB |=(1<<IN4);
  
    PORTB &=(~(1<<IN3));
  
}

void stepper_OFF (void) { //   

	//    ,       ,    
	
	PORTA &=(~((1<<IN1)|(1<<IN2)));
	
	PORTB &=(~((1<<IN3)|(1<<IN4)));
	
}

unsigned char step_counter = 0; 

//      

void L293D_step (unsigned int step_quantity, unsigned char direction, unsigned int step_delay, unsigned char phase) { //      

    while(step_quantity>0) { //  ,      

        switch(direction) { //           
	
			case 'F':
				if(step_counter<3) { step_counter++; } else { step_counter=0; }
			break;
		
			case 'B':
				if(step_counter>0) { step_counter--; } else { step_counter=3; }
			break;
		
		}
		
		switch(phase) { //     
		
		    case 1: 
			
				switch(step_counter) { //   
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
			
			case 2:
			
				switch(step_counter) { //   
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
		
		}
		
    delay_millisecond(step_delay); //       
	
	step_quantity--; 
	
	} 

}


void PWM_init (void) { //   

    DDRB |=(1<<PWM_1);

    DDRA |=(1<<PWM_2);

    TCCR0A = (1<<WGM01)|(1<<WGM00)|(1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0); //  FAST PWM,   
	
    TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); //   8
	
    OCR0A = 255; //    (0-255)

    OCR0B = 255;

} //    

int main (void) { 

    DDRA |=(1<<LED_pin);
	
    DDRA |=(1<<IN1)|(1<<IN2);

    DDRB |=(1<<IN3)|(1<<IN4);
	
    PWM_init(); //  
	
    delay_millisecond(2000);
	
    while(1==1) { 
	   
	LED_ON;
		
        L293D_step(16,'F',100,2); //step( ,  F/B,   , / )
		
	//stepper_OFF();
		
	delay_millisecond(2000);
		
	LED_OFF;
		
	L293D_step(16,'B',100,2);
		
	//stepper_OFF();
		
	delay_millisecond(2000);
		  
    } 

} 


Mode langkah penuh. Fase tunggal



Mesin mengambil 16 langkah per revolusi. Selain itu, langkah-langkah untuk dua fase tidak memiliki nilai sudut yang sama. Saya tidak tahu terhubung dengan apa. Mungkin desain mesinnya ini?

Mari kita lihat frekuensi maksimum langkah-langkah yang dapat dia berikan dalam mode ini tanpa melewatkannya.

Penundaan minimum antara langkah adalah 2 ms, yang berarti 500 langkah / detik. Tidak buruk, itu 31 rpm = 1850 rpm.

Mode langkah penuh. Dua fase



Harap dicatat bahwa dalam hal ini langkah-langkahnya lebih mulus, ukurannya sama (dalam hal apa pun, lebih sama dari pada kasus sebelumnya).

Secara alami, dalam hal ini, dua belitan diberi energi secara simultan dan perpindahan panas meningkat. Setelah beberapa detik, mesin memanas cukup kuat, jadi saya menghentikan percobaan.

Apa dengan frekuensi maksimum langkah? 500 langkah / detik; 31 rpm = 1875 rpm.
Harus dikatakan bahwa untuk motor stepper cukup gesit. Hal ini disebabkan oleh sejumlah kecil kutub magnet pada rotor.

Kita lanjutkan ...

Nomor percobaan 2. TMC2208 + ATtiny44


TMC2208 adalah nama chip driver untuk mengendalikan motor stepper bipolar, juga disebut modul, yang diproduksi untuk pemasangan di printer 3D buatan rumah (dan tidak hanya) dan memiliki tata letak pin terpadu.
Banyak dan jelas mengatakan tentang modul ini di sini .

Banyak yang telah ditulis di Internet tentang cara memasangnya di printer 3D Anda, tetapi kami tertarik pada cara menghubungkan modul ke mikrokontroler, jadi mari kita mengerti.

Karakteristik chip sangat mengesankan (hanya orang yang mudah dipengaruhi):

  • tegangan suplai dari bagian logis: 3-5V;
  • tegangan suplai motor 5.5-36V;
  • 2A arus puncak;
  • pengaturan arus motor maksimum;
  • Dukungan antarmuka UART untuk mengelola dan mengkonfigurasi register internal;
  • matikan otomatis;
  • dukungan untuk mode langkah mikro kontrol engine hingga 1/16 langkah.



Ini sangat sederhana untuk dikelola, pada kenyataannya, Anda hanya perlu dua pin mikrokontroler. Satu terhubung ke DIR - kami menunjukkan arah putaran motor, yang lain terhubung ke LANGKAH - ketika pulsa diterapkan, sirkuit mikro melakukan manipulasi yang diperlukan dengan arus dan tegangan pada belitan motor dan dibutuhkan satu langkah.

Diagram koneksi akan terlihat seperti ini:



Selain itu, saya menggunakan pin EN untuk mematikan motor dan untuk waktu yang lama tidak membuat gulungan berliku.

Kode sumber WinAVR
#define F_CPU 8000000UL  //    

//    L: E2; H:DF; Ex:FF; 
//    8         (     8)

#include <avr/io.h> //   

#include <util/delay.h> //   

#include <avr/interrupt.h> //   

//   

#define LED_pin PA5

#define LED_ON PORTA |=(1<<LED_pin)

#define LED_OFF PORTA &=(~(1<<LED_pin))

//     TMC2208

#define DIR PB2

#define EN PA6

#define STP PA7

#define EN_OFF PORTA |=(1<<EN)

#define EN_ON PORTA &=(~(1<<EN))

#define DIR_FOR PORTB |=(1<<DIR)

#define DIR_BACK PORTB &=(~(1<<DIR))

#define STP_ON PORTA |=(1<<STP)

#define STP_OFF PORTA &=(~(1<<STP))

void delay_microsecond (unsigned int delay_time) { //     
    
	//      

    for(unsigned int delay_us = 0; delay_us<delay_time; delay_us++) {
	
	    _delay_us(1);
	
	}

}

void delay_millisecond (unsigned int delay_time) { //     

    for(unsigned int delay_ms = 0; delay_ms<delay_time; delay_ms++) {
	
	    _delay_ms(1);
	
	}

}

void TMS2208_STEP (unsigned int step_quantity, unsigned char direction, unsigned int step_delay) {

    switch(direction) { //  
	
		case 'F':
			DIR_FOR;	
		break;
		
		case 'B':
			DIR_BACK;	
		break;
		
	}

    while(step_quantity>0) { //      
	
		STP_ON; //   
		
		delay_microsecond(100); //   100
		
		STP_OFF;
		
		delay_millisecond(step_delay);//   
	
	    step_quantity--;
	
	}

}

int main (void) {

        DDRA |=(1<<LED_pin);

        DDRB |=(1<<DIR);

        DDRA |=(1<<EN);

        DDRA |=(1<<STP);
	
	PWM_init(); //  
	
	delay_millisecond(2000);
	
	while(1==1) { 
	   
	   LED_ON;
	   
	   EN_ON;
	
	   TMS2208_STEP(32,'F',10); // TMS2208_STEP ( ,  F/B,   )
	   
	   delay_millisecond(2000);
	   
	   LED_OFF;
	   
	   TMS2208_STEP(32,'B',10);
	   
	   delay_millisecond(2000);
	
	   
	} 

}  


Sebelum memulai semuanya, Anda perlu melakukan pra-konfigurasi modul. Pertama, atur mode microstep yang diinginkan. Kedua, atur arus motor maksimum yang diinginkan.

Dengan microstep, semuanya sederhana. Pin MS1 ​​dan MS2 bertanggung jawab untuk ini.



Saya perhatikan bahwa rangkaian mikro tidak mengubah tegangan secara bertahap, tetapi melakukannya “dengan lancar”, tetapi karena rangkaian mikro adalah digital, outputnya bukan sinyal yang halus, tetapi sinyal dengan langkah kecil, menurut dokumentasi, itu memecah setiap langkah menjadi 256 langkah mikro. Hal ini dilakukan untuk meningkatkan kelancaran pengendaraan, mengurangi kebisingan dari mesin dan, secara teori, tidak boleh membiarkan desain yang dibautnya masuk ke resonansi. Singkatnya, semua agar printer 3D lebih tenang.

Untuk mengatur arus motor, perlu untuk mengukur tegangan pada kontak Vref, yang ditunjukkan pada gambar. Nilai tegangan dapat diubah menggunakan potensiometer yang dipasang di sebelah kontak. Tegangan pada kontak akan sebanding dengan arus motor, dan ketergantungan akan memiliki bentuk berikut:

Vref = I * 1,44; Motor

kami membutuhkan sekitar 150mA, karena Vref = 0,216V . Kami memasang ...

Dipahami bahwa peningkatan arus menyediakan sirkuit mikro dengan meningkatkan tegangan pada belitan. Karena itu, Anda perlu memastikan bahwa ketegangan ini sudah cukup. Tapi, saya percaya, 5V seharusnya cukup untuk motor kecil itu.

Kami akan menguji operasi motor dengan berbagai mode langkah mikro dan melihat apa yang terjadi (jeda antara langkah mikro adalah 10 ms):


Anda dapat melihat bahwa gerakan motor menjadi lebih halus (dibandingkan dengan percobaan sebelumnya), namun 16 langkah karakteristik masih cukup jelas diamati. Yah ... ternyata ini adalah fitur motor stepper dengan rotor magnet permanen .
Perlu juga dicatat bahwa motor dalam mode ini memanas hampir sebanyak dalam mode langkah penuh dengan dua fase. Dapat dimengerti, belitan terus-menerus diberi energi, panas terus-menerus dihasilkan.

Saya percaya bahwa untuk motor seperti penggunaan driver seperti itu, dan memang mode microstep, sangat tidak dianjurkan.

Nomor percobaan 3. Driver ATtiny44


Mari kita kembali sebentar ke percobaan pertama dan ingat bahwa input EN1 dan EN2 dari chip driver terhubung ke pin OC0A dan OC0B dari mikrokontroler. Ini berarti bahwa kita dapat mengirim sinyal PWM yang dihasilkan menggunakan timer TIMER0 dan dengan demikian mengubah tegangan yang diterapkan pada belitan motor dan dengan demikian mengatur arus yang akan mengalir melaluinya.

Menurut datasheet pada mikrokontroler ATtiny44, arus maksimum yang dapat diberikan oleh satu pin hanya 40mA. Selain itu, tidak diindikasikan untuk tipe arus apa (denyut atau konstan) karakteristik ini. Itu hanya di sana dan itu seperti itu ... Saya

harus mengatakan bahwa saya telah akrab dengan mikrokontroler ATMEL selama lebih dari 7 tahun. Dan tidak pernah sekalipun saya memiliki keinginan untuk memeriksa baris ini dari lembar data.



Mungkin pabrikannya aman dan bahkan dapat memberikan lebih banyak, atau mungkin itu benar-benar maksimal yang dapat memberikan satu pin.

Kami akan mencari tahu. Tetapi pertama-tama Anda perlu mencari tahu berapa arus minimum motor yang umumnya dapat berputar.

Menggunakan sirkuit dari percobaan pertama, kami menyesuaikan nilai arus melalui belitan sama dengan 40 mA. Kita mulai dalam mode langkah penuh dengan dua fase (karena torsi akan lebih tinggi):

Luar biasa! Pada 40mA, mesin mulai berhasil! Nilai minimum dari arus belitan yang diperlukan untuk operasi motor yang stabil juga terdeteksi, dan itu sama dengan 30mA.

Tentu saja, torsi akan jauh lebih rendah, tetapi kenyataan bahwa kami berhasil menghidupkan motor dengan konsumsi daya yang kecil sangat penting bagi kami.

Diagram koneksi motor stepper ke mikrokontroler adalah sebagai berikut:



Karena setiap pin mikrokontroler berfungsi sebagai setengah-jembatan (dapat mengubah output sirkuit mikro ke Vcc atau GND), untuk mengontrol motor stepper bipolar, kita memerlukan 4 pin mikrokontroler.

Kode program:

Kode sumber WinAVR
#define F_CPU 8000000UL  //    

//    L: E2; H:DF; Ex:FF; 
//    8         (     8)

#include <avr/io.h> //   

#include <util/delay.h> //   

#include <avr/interrupt.h> //   

//   

#define LED_pin PA5

#define LED_ON PORTA |=(1<<LED_pin)

#define LED_OFF PORTA &=(~(1<<LED_pin))

//     L293DD

#define PWM_1 PB2 // OC0A (EN1)

#define PWM_2 PA7 // OC0B (EN2)

#define PWM_1_value OCR0A

#define PWM_2_value OCR0B

//       L293D

#define IN1 PA0 //  PORTA

#define IN2 PA1

#define IN3 PB1 //  PORTB

#define IN4 PB0


void delay_microsecond (unsigned int delay_time) { //     
    
	//      

    for(unsigned int delay_us = 0; delay_us<delay_time; delay_us++) {
	
	    _delay_us(1);
	
	}

}

void delay_millisecond (unsigned int delay_time) { //     

    for(unsigned int delay_ms = 0; delay_ms<delay_time; delay_ms++) {
	
	    _delay_ms(1);
	
	}

}

//        

void step_1_two_phase_DL (void) { // DL - driver less
   
   //  
   OCR0A = 160;
   PORTB &=(~(1<<IN4)); 
   
   //  
   OCR0B = 160;
   PORTB &=(~(1<<IN3)); 
    
}

void step_2_two_phase_DL (void) { 
   
   //  
   OCR0A = 160;
   PORTB &=(~(1<<IN4)); 
   
   //  
   OCR0B = 95;
   PORTB |=(1<<IN3); 
    
}

void step_3_two_phase_DL (void) { 
   
   //  
   OCR0A = 95;
   PORTB |=(1<<IN4); 
   
   //  
   OCR0B = 95;
   PORTB |=(1<<IN3); 
    
}

void step_4_two_phase_DL (void) { 
   
   //  
   OCR0A = 95;
   PORTB |=(1<<IN4); 
   
   //  
   OCR0B = 160;
   PORTB &=(~(1<<IN3)); 
    
}

unsigned char step_counter = 0; 

//      

void L293D_step (unsigned int step_quantity, unsigned char direction, unsigned int step_delay, unsigned char phase) { //      

    while(step_quantity>0) { //  ,      

        switch(direction) { //           
	
			case 'F':
				if(step_counter<3) { step_counter++; } else { step_counter=0; }
			break;
		
			case 'B':
				if(step_counter>0) { step_counter--; } else { step_counter=3; }
			break;
		
		}
		
		switch(phase) { //     
		
		    case 1: 
			
				switch(step_counter) { //   
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
			
			case 2:
			
				switch(step_counter) { //   
	
					case 0:
						step_1_two_phase_DL();
					break;
		
					case 1:
						step_2_two_phase_DL();
					break;
		
					case 2:
						step_3_two_phase_DL();
					break;
		
					case 3:
						step_4_two_phase_DL();
					break;
	
				}
			
			break;
		
		}
		
    delay_millisecond(step_delay); //       
	
	step_quantity--; 
	
	} 

}


void PWM_init (void) { //   

    DDRB |=(1<<PWM_1); 
	
    DDRA |=(1<<PWM_2);

    TCCR0A = (1<<WGM01)|(1<<WGM00)|(1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0); //  FAST PWM,   
	
    TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); //   8
	
    OCR0A = 160; 
	
    OCR0B = 160;

} //    

int main (void) { //  

    DDRA |=(1<<LED_pin);
	
	DDRA |=(1<<IN1)|(1<<IN2);
	
	DDRB |=(1<<IN3)|(1<<IN4);
	
	PWM_init(); //  
	
	delay_millisecond(2000);
	
	while(1==1) { //  

	    LED_ON;
		
	    L293D_step(16,'F',100,2); //step( ,  F/B,   , / )
		
            delay_millisecond(2000);
		
	    LED_OFF;
		
	    L293D_step(16,'B',100,2);
		
	    delay_millisecond(2000);
		
	
	   
	} 

} 


Izinkan saya menjelaskan sedikit cara kerja program ini. Ini adalah kode yang dimodifikasi dari percobaan pertama. Seperti yang saya katakan di atas, TIMER0 8-bit akan digunakan untuk menghasilkan sinyal PWM pada output OC0A dan OC0B. Timer diatur ke mode FastPWM dengan prescaler 8 (frekuensi sinyal pada 8 MHz dari jam mikrokontroler adalah 3906 Hz).

Untuk mengubah polaritas sinyal pada belitan, pin mikrokontroler beralih dari Vcc ke GND dengan mengubah bit yang sesuai dalam register PORTx dan mengubah siklus tugas PWM dengan menuliskan nilai ke register OCR0A dan OCR0B (nilai-nilai tersebut dipilih secara eksperimental).

Dan sebagainya:


Kursus sirkuit yang diambil pada tahun pertama institut menunjukkan bahwa multimeter menunjukkan nilai rms dari tegangan dan arus pada motor.

Motor stepper berputar dari pin mikrokontroler tanpa driver!

Namun di sini kita tidak melampaui kemampuan mikrokontroler, setidaknya, sesuai dengan apa yang tertulis dalam dokumentasi. Dalam mode ini, mikrokontroler dan motor dapat bekerja untuk waktu yang lama. Memang, percobaan berlangsung 20 menit. Selama waktu ini, tidak ada langkah skipping, tidak ada pengaturan ulang controller, atau overheating (baik mesin maupun controller)

Singkirkan semua tindakan pencegahan


Kami menghapus PWM dari percobaan dan kami akan langsung mengendalikan pin mikrokontroler menggunakan register PORTx. Mari kita lihat apa yang terjadi pada mikrokontroler setelah itu.

Ini berfungsi ... dengan arus maksimum 51mA ... Ya ... tanpa diduga, tampaknya ini adalah arus maksimum yang dapat memberikan satu pin mikrokontroler? Jika saya salah, koreksi saya.

Bagaimanapun, video dari YouTube tidak tertipu. Memang, Anda dapat mengendalikan motor ini tanpa driver .

temuan


Kami mempelajari secara rinci motor miniatur bipolar stepper, desainnya dan cara mengendalikannya, untuk digunakan dalam aplikasi kami sendiri.

1. Miniatur motor stepper bipolar dengan rotor magnet permanen benar-benar miniatur.

Fitur utamanya:

  • , , ( , , 16);
  • ( ), 1875 /;
  • ( );

2. Motor stepper miniatur dapat dikontrol oleh driver yang cocok untuk bekerja dengan motor stepper bipolar, Anda hanya perlu memilih parameter arus berliku.

3. Menggunakan driver TMC2208 khusus adalah masalah yang kontroversial, karena mode microstep tidak didukung oleh mesin itu sendiri, meskipun transisi antar langkah dilakukan lebih lancar.

4. Dimungkinkan untuk menghubungkan motor stepper langsung ke port-port mikrokontroler. Tapi ini hanya dalam kerangka percobaan, karena torsi dalam kasus ini sangat tidak signifikan, dan bahkan arus kecil tidak memungkinkan langkah-langkah yang harus diambil dengan kecepatan tinggi.

Lain kali saya akan memberi tahu Anda mengapa kami membutuhkan motor stepper kecil.

All Articles