تعلم محرك السائر الصغير

تستخدم محركات السائر على نطاق واسع في الصناعة الحديثة والمنتجات محلية الصنع. يتم استخدامها حيثما يكون ذلك ضروريًا لضمان دقة تحديد موقع المكونات الميكانيكية ، دون اللجوء إلى التغذية المرتدة والقياسات الدقيقة.

اليوم أريد أن أتحدث عن نوع خاص من محركات السائر - محركات السائر المصغرة ، والتي تستخدم في بناء الأنظمة البصرية. سنلقي نظرة فاحصة على أجهزتهم وكيفية التحكم في مثل هذه المحركات الصغيرة.



محرك السائر هو محرك كهربائي بدون فرش (مع فرش) مع العديد من اللفات (المراحل) الموجودة على الجزء الثابت والمغناطيس (غالبًا ما يكون دائمًا) على الدوار. من خلال تطبيق الجهد على اللفات الساكنة ، يمكننا إصلاح موضع الدوار ، ومن خلال تطبيق الجهد على اللفات ، يمكننا الحصول على حركة الدوار على التوالي من موضع إلى آخر (خطوة) ، وهذه الخطوة لها قيمة زاوية ثابتة.

لن نتطرق إلى النظر في كل نوع من أنواع السائر. لقد كتب الكثير عن هذا على الشبكة ، وكذلك ، على سبيل المثال ، هنا .

أريد أن أتحدث عن نوع خاص من محركات السائر - محركات السائر المصغرة ، التي تستخدم في بناء الأنظمة البصرية. هؤلاء الأطفال متاحون للبيع. ولكن على الشبكة ، خاصة في الناطقين بالروسية ، هناك القليل جدًا من المعلومات حول هذه المحركات. لذلك ، عندما احتجت إلى استخدامها في مشروعي ، كان علي أن أبحث عن المعلومات وأن أجري تجربتين.

سأشارك نتائج عمليات البحث والتجارب في هذه المقالة.

سننظر في إدارة مثل هذه المحركات الصغيرة ، وهي:

  • سائق L293D + متحكم ATtiny44 ؛
  • سائق TMC2208 + متحكم ATtiny44 ؛
  • متحكم ATtiny44 (بدون سائق).

في الواقع ، فقط النقطة الأخيرة يمكن أن تسبب الأسئلة هنا. صدقوني ، لقد فوجئت أيضًا عندما صادفت مقطع فيديو ( هنا هو ) ، حيث يلتقط الرجل للتو ويربط محرك السائر مباشرة بدبابيس متحكم! ولكن دعونا نتحدث عن كل شيء بالترتيب.

معرفة


أولاً ، نظرة صغيرة على مظهر بطلنا:



إنه صغير جدًا حقًا! وفقًا للكتاب الذكي Petrenko S.F.
"المحركات الكهروإجهادية في الأجهزة" ، المحركات الكهرومغناطيسية الأصغر ، من حيث المبدأ ، من المستحيل إنشاء ... هذا ممكن ، ولكن مع انخفاض في قطر السلك الذي تصنع منه اللفات ، يتم تبديد المزيد والمزيد من الطاقة كحرارة في البيئة ، مما يؤدي إلى انخفاض في كفاءة المحرك ويجعل استخدامها غير عقلاني.

من الجدير بالملاحظة ، يمكن ملاحظة أن عمودها قصير جدًا ولديه أخدود خاص لتثبيت الترس أو الذراع.

يمكن رؤية ملفين بشكل واضح ، حتى أنهما مغطى بعزل بألوان مختلفة. لذا ، فإن محركنا ينتمي على الأرجح إلى فئة محركات السائر ثنائية القطب.
دعونا نرى كيف يعمل:



أعتقد أن معرفتنا بهذه المحركات لن يكتمل إذا لم نر ما بداخلها. من المثير للاهتمام دائما أن ننظر داخل الآلية! أليس ذلك؟

في الواقع ، لم نر أي شيء غير عادي. الدوار ممغنط. لا توجد محامل في أي مكان ، كل شيء على البطانات. يتم الضغط على المحور الخلفي في مبيت المحرك. لم يتم إصلاح الجبهة بأي شيء. من المثير للاهتمام ، تم تجميع جسم المحرك عن طريق اللحام النقطي. لذا كان لا بد من قطع الغطاء الأمامي.

ننتقل الآن إلى مسألة التوصيل وخصائصه الكهربائية.

تأكد من أنه ثنائي القطب من خلال رنين اللفات. حقا ثنائي القطب ، كما في الصورة أعلاه. تبلغ مقاومة اللف حوالي 26 أوم ، على الرغم من أن البائع أشار إلى 14 أوم.
يقول الوصف أن جهد الإمداد هو 5V . على الرغم من أننا نعلم جميعًا أنه بالنسبة لمحرك السائر ، فإن التيار الذي تستهلكه اللفات مهم.
نحن نحاول الاتصال.

التجربة رقم 1. L293D + ATtiny44


كما نعلم ، للتحكم في محرك السائر ثنائي القطب ، من الضروري ليس فقط تطبيق الجهد على اللفتين في التسلسل المطلوب ، ولكن أيضًا لتغيير اتجاه التيار في هذه اللفات ، والقيام بذلك بشكل مستقل عن بعضها البعض. لهذا ، كل ملف يحتاج إلى جسر H خاص به. من أجل عدم إبعاده عن الترانزستورات ، تم أخذ شريحة L293D الجاهزة. ميزة أخرى لها - الشريحة تحتوي على دبابيس خاصة Enable1 و Enable2 ، والتي تقوم بتشغيل وإيقاف كل جسر. يمكن استخدامها لتوفير إشارة PWM ، وبالتالي ، من الممكن التحكم في جهد الإمداد لكل جسر. لماذا قد تكون هناك حاجة لذلك ، سنرى المزيد.

بالإضافة إلى ذلك ، يمكن لـ L293D تبديل الفولتية حتى 36 فولت وإخراج يصل إلى 1.2 أمبير لكل قناة، والتي يجب أن تكون كافية لتشغيل اللفات لمحركنا.

لذا ، الرسم التخطيطي:



ترتبط مدخلات التحكم L293D بمخرجات OC0A و OC0B ، مما سيسمح لنا بإرسال إشارة PWM إليهم في المستقبل.

سنومض وحدة التحكم من خلال مبرمج الدائرة (غير موضح في الرسم التخطيطي).
إليك ما تبدو عليه الدائرة المجمعة على لوحة توصيل:



وهذه هي الطريقة التي يقع بها اختبارنا



التجريبي : الآن يمكنك البدء في التجربة.

نحن نحسب التيار الذي سيتدفق خلال اللفات الحركية عندما تكون متصلة بجهد 5V:

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

صغير جدًا. أتساءل كم من الوقت يمكنه أن يحتفظ بمثل هذا التيار ولا يسخن.

ندرج مقياس التيار والجهد في دائرة واحدة من اللفات ، وقياس القيم المقابلة عند توفير الطاقة لهذه اللف من خلال السائق.

عندما ينخفض ​​الجهد عبر لف 2.56V ، يظهر مقياس التيار تيارًا 150mA ، ومن الواضح بوضوح كيف يبدأ حجم التيار في الانخفاض أثناء تسخين اللفات. وتجدر الإشارة إلى أنها ليست ساخنة للغاية.

بعد التأكد من أن الجهد 5V للمحرك ليس خطيرًا ، حاول لفها في اتجاهات مختلفة. والآن بضع كلمات سنقولها عن أوضاع تشغيل محرك السائر.

يقال هذا بشكل جيد هنا .

لن نتكرر ، ولكن تذكر أن محرك السائر يمكن أن يعمل في ثلاثة أوضاع:

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

دعونا نحاول تطبيق أول وضعين على شريحة L293D ، وبالنسبة لوضع الخطوة الصغيرة ، سنترك برنامج تشغيل خاص من التجربة الثانية.

الكود المصدري للبرنامج هو كما يلي:

كود مصدر 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);
		  
    } 

} 


وضع الخطوة الكاملة. على مرحلة واحدة



يأخذ المحرك 16 خطوة لكل ثورة. علاوة على ذلك ، فإن خطوات المرحلتين ليس لها نفس القيمة الزاوية. لا أعرف ما الذي يرتبط به. ربما يكون تصميم المحرك هذا؟

لنلقِ نظرة على الحد الأقصى لعدد الخطوات التي يمكنه تقديمها في هذا الوضع دون فقدها.

الحد الأدنى للتأخير بين الدرجات هو 2 مللي ثانية ، مما يعني 500 خطوة / ثانية. ليس سيئًا ، إنها 31 دورة في الدقيقة = 1850 دورة في الدقيقة.

وضع الخطوة الكاملة. مرحلتان



يرجى ملاحظة أنه في هذه الحالة تكون الخطوات أكثر سلاسة ، فهي بنفس الحجم (على أي حال ، هي نفسها أكثر من الحالة السابقة).

بطبيعة الحال ، في هذه الحالة ، يتم تنشيط ملفين في وقت واحد ويزداد انتقال الحرارة. بعد بضع ثوانٍ ، يسخن المحرك بقوة ، لذا أوقفت التجربة.

ماذا بأقصى عدد من الخطوات؟ 500 خطوة / ثانية ؛ 31 دورة في الدقيقة = 1875 دورة في الدقيقة.
يجب أن يقال أنه بالنسبة لمحرك السائر فهو أنيق للغاية. هذا يرجع إلى قلة عدد الأقطاب المغناطيسية على الدوار.

نواصل ...

التجربة رقم 2. TMC2208 + ATtiny44


TMC2208 هو اسم شريحة سائق للتحكم في محركات السائر ثنائية القطب ، وتسمى أيضًا وحدة تعتمد على ذلك ، والتي يتم إنتاجها للتثبيت في طابعات ثلاثية الأبعاد محلية الصنع (وليس فقط) ولها تخطيط دبوس موحد.
قال الكثير والوضوح عن هذه الوحدة هنا .

تمت كتابة الكثير على الإنترنت حول كيفية تثبيته في طابعتك ثلاثية الأبعاد ، لكننا مهتمون بكيفية توصيل الوحدة بوحدة التحكم الدقيقة ، لذا دعنا نفهم.

خصائص الشريحة مثيرة للإعجاب (فقط الأشخاص المتأثرين):

  • توريد الجهد من الجزء المنطقي: 3-5V ؛
  • محرك تزويد الجهد 5.5-36 فولت.
  • الذروة الحالية 2A ؛
  • ضبط التيار الحركي الأقصى ؛
  • دعم واجهة UART لإدارة السجلات الداخلية وتكوينها ؛
  • إيقاف التشغيل التلقائي
  • دعم وضع التنقيط الدقيق للتحكم في المحرك حتى 1/16 من الخطوة.



من السهل جدًا إدارة ، في الواقع ، أنت بحاجة إلى دبابيس فقط من وحدة التحكم الدقيقة. أحدهما متصل بـ DIR - نشير إلى اتجاه دوران المحرك ، والآخر متصل بالخطوة - عند تطبيق النبض ، تقوم الدائرة المصغرة بإجراء المعالجات اللازمة بالتيارات والجهود على اللفات الحركية وتستغرق خطوة واحدة.

سيبدو مخطط الاتصال على



النحو التالي : بالإضافة إلى ذلك ، استخدمت دبوس EN لإيقاف تشغيل المحرك ولمدة طويلة لعدم الحفاظ على تنشيط اللفات.

كود مصدر 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);
	
	   
	} 

}  


قبل بدء كل شيء ، تحتاج إلى تكوين الوحدة مسبقًا. أولاً ، قم بتعيين وضع microstep المطلوب. ثانيًا ، قم بتعيين الحد الأقصى المطلوب لتيار المحرك.

مع microstep ، كل شيء بسيط. دبابيس MS1 و MS2 هي المسؤولة عن ذلك.



ألاحظ أن الدائرة المصغرة لا تغير الجهد التدريجي ، لكنها تفعل ذلك "بسلاسة" ، ولكن بما أن الدائرة المصغرة رقمية ، فإن الإخراج ليس إشارة سلسة ، بل إشارة بخطوة صغيرة ، وفقًا للوثائق ، فإنها تقسم كل خطوة إلى 256 خطوة صغيرة. تم ذلك لزيادة سلاسة الركوب ، وتقليل الضوضاء من المحرك ، ومن الناحية النظرية ، لا ينبغي أن يسمح للهيكل الذي يتم ثنيه بدخول الرنين. باختصار ، كل ذلك لجعل الطابعة ثلاثية الأبعاد أكثر هدوءًا.

لتعيين تيار المحرك ، من الضروري قياس الجهد عند جهة الاتصال Vref ، الموضحة في الشكل. يمكن تغيير قيمة الجهد باستخدام مقياس جهد مثبت بجانب جهة الاتصال. سيكون الجهد عند الاتصال متناسبًا مع تيار المحرك ، وسيكون الاعتماد على الشكل التالي:

Vref = I * 1.44 ؛

لدينا احتياجات السيارات حول 150MA، لأن VREF = 0.216V . نقوم بتثبيت ...

ومن المفهوم أن زيادة التيار يوفر الدائرة الدقيقة عن طريق زيادة الجهد عبر اللف. لذلك ، تحتاج إلى التأكد من أن هذا التوتر كافٍ. لكن ، أعتقد ، 5V يجب أن يكون كافيًا لهذا المحرك الصغير.

سنقوم باختبار تشغيل المحرك بأوضاع مختلفة للميكروستيب ونرى ما سيحدث (فترة التوقف بين الميكروستيب هي 10 مللي ثانية):


يمكنك ملاحظة أن حركات المحرك أصبحت أكثر سلاسة (مقارنة بالتجربة السابقة) ، ومع ذلك ، لا تزال الخطوات المميزة الـ 16 مميزة بوضوح. حسنًا ... يبدو أن هذه ميزة لمحركات السائر ذات الدوار المغناطيسي الدائم .
وتجدر الإشارة أيضًا إلى أن المحرك في هذا الوضع يسخن تقريبًا كما هو الحال في وضع الخطوة الكاملة مع مرحلتين. إنه أمر مفهوم ، يتم تنشيط اللفات باستمرار ، ويتم توليد الحرارة باستمرار.

أعتقد أنه بالنسبة إلى هذه المحركات ، لا يُنصح باستخدام مثل هذا السائق ، بل وأنماط microstep في الواقع.

التجربة رقم 3. سائق ATtiny44


دعونا نعود بإيجاز إلى التجربة الأولى ونذكر أن المدخلات EN1 و EN2 لشريحة السائق متصلة بدبابيس OC0A و OC0B لوحدة التحكم الدقيقة. هذا يعني أننا يمكن أن نرسل هناك إشارة PWM التي تم إنشاؤها باستخدام جهاز ضبط الوقت TIMER0 وبالتالي تغيير الجهد المطبق على لفات المحرك وبالتالي تنظيم التيار الذي سيتدفق عبرها.

وفقًا لورقة البيانات الموجودة على وحدة التحكم الدقيقة ATtiny44 ، فإن الحد الأقصى للتيار الذي يمكن أن يعطيه دبوس واحد هو 40 مللي أمبير فقط. علاوة على ذلك ، لا يُشار إلى نوع التيار (النابض أو الثابت) لهذه الخاصية. إنها موجودة فقط ، وهي كذلك ...

يجب أن أقول أنني كنت على دراية بأجهزة التحكم الدقيقة في ATMEL لأكثر من 7 سنوات. ولم أكن أرغب أبدًا في التحقق من هذا السطر من ورقة البيانات.



ربما تكون الشركة المصنعة آمنة تمامًا وفي الواقع يمكنها أن تقدم المزيد ، أو ربما يكون الحد الأقصى الذي يمكن أن يعطي دبوسًا واحدًا.

سوف نجد. ولكن عليك أولاً معرفة الحد الأدنى للتيار الذي يمكن للمحرك عمومًا تدويره.

باستخدام الدائرة من التجربة الأولى ، نقوم بتعديل قيمة التيار من خلال اللفات تساوي 40 مللي أمبير. نبدأ في وضع الخطوة الكاملة بمرحلتين (حيث سيكون عزم الدوران أعلى):

ممتاز! في 40mA ، بدأ المحرك بنجاح! تم الكشف أيضًا عن الحد الأدنى لقيمة اللف اللازمة للتشغيل المستقر للمحرك ، وهو يساوي 30mA.

بالطبع ، سيكون عزم الدوران أقل بكثير ، ولكن حقيقة أننا تمكنا من تشغيل المحرك بمثل هذا الاستهلاك القليل من الطاقة أمر مهم بالنسبة لنا.

سيكون مخطط توصيل محرك السائر إلى وحدة التحكم الدقيقة على النحو التالي:



نظرًا لأن كل دبوس من وحدة التحكم الدقيقة يعمل كجسر نصف جسر (يمكنه تبديل إخراج الدائرة الدقيقة إلى Vcc أو GND) ، نحتاج إلى 4 دبابيس من وحدة التحكم الدقيقة للتحكم في محرك السائر ثنائي القطب.

كود البرنامج:

كود مصدر 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);
		
	
	   
	} 

} 


اسمحوا لي أن أشرح قليلا كيف يعمل هذا البرنامج. هذا هو كود معدل من التجربة الأولى. كما قلت أعلاه ، سيتم استخدام TIMER0 8 بت لتوليد إشارة PWM عند المخرجات OC0A و OC0B. تم ضبط المؤقت على وضع FastPWM باستخدام مقياس مسبق سابق 8 (تردد الإشارة عند 8 ميجاهرتز من ساعة وحدة التحكم الدقيقة هو 3906 هرتز).

لتغيير قطبية الإشارات على اللفات ، يتم تبديل دبوس وحدة التحكم الدقيقة من Vcc إلى GND عن طريق تغيير البت المقابل في سجل PORTx وتغيير دورة عمل PWM من خلال كتابة القيم إلى سجلات OCR0A و OCR0B (تم اختيار القيم تجريبيًا).

و حينئذ:


تشير دورة الدوائر التي تم أخذها في السنة الأولى من المعهد إلى أن جهاز القياس المتعدد يوضح قيمة جذر متوسط ​​التربيع للجهد والتيار في المحرك.

يدور محرك السائر من دبابيس وحدة التحكم الدقيقة بدون سائق!

لكن هنا لا نتجاوز قدرات وحدة التحكم الدقيقة ، على الأقل ، وفقًا لما هو مكتوب في الوثائق. في هذا الوضع ، يمكن أن يعمل المتحكم الدقيق والمحرك لفترة طويلة. والواقع أن التجربة استمرت 20 دقيقة. خلال هذا الوقت ، لم تكن هناك خطوات تخطي ، أو إعادة تعيين وحدة تحكم ، أو ارتفاع درجة الحرارة (لا المحرك ولا وحدة التحكم).

ضع جميع الاحتياطات جانباً


نقوم بإزالة PWM من التجربة وسوف نتحكم بشكل مباشر في دبابيس وحدة التحكم الدقيقة باستخدام سجلات PORTx. دعنا نرى ما يحدث لوحدة التحكم الدقيقة بعد ذلك.

يعمل ... بحد أقصى 51mA ... حسنا ... بشكل غير متوقع ، يبدو أن هذا هو أقصى تيار يمكن أن يعطي دبوسًا واحدًا من وحدة التحكم الدقيقة؟ إذا كنت مخطئا ، صحح لي.

على أي حال ، لم يتم خداع الفيديو من يوتيوب. في الواقع ، يمكنك التحكم في هذا المحرك دون أي سائق .

الموجودات


لقد درسنا بالتفصيل محركات السائر ثنائية القطب المصغرة ، وتصميمها وكيفية التحكم فيها ، لاستخدامها في تطبيقاتنا الخاصة.

1. إن محرك السائر المصغر ثنائي القطب مع دوار مغناطيسي دائم هو بالفعل مصغر.

ميزاته الرئيسية:

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

2. يمكن التحكم في محرك السائر المصغر عن طريق أي سائق مناسب للعمل مع محركات السائر ثنائية القطب ، ما عليك سوى تحديد معلمات تيار اللف.

3. يعد استخدام برنامج تشغيل TMC2208 متخصص مشكلة مثيرة للجدل ، حيث لا يدعم المحرك نفسه وضع microstep ، على الرغم من أن الانتقال بين الخطوات يتم بشكل أكثر سلاسة.

4. من الممكن توصيل محرك السائر مباشرة بمنافذ وحدة التحكم الدقيقة. لكن هذا فقط في إطار التجربة ، حيث أن عزم الدوران في هذه الحالة غير مهم للغاية ، وحتى التيار الصغير لا يسمح باتخاذ الخطوات بسرعة عالية.

في المرة القادمة سأخبرك لماذا كنا بحاجة إلى مثل هذه المحركات الصغيرة.

All Articles