
موتورهای DC از قطعات پرکاربرد در زمینه الکترونیک رباتیک و … هستند. افرادی که در زمینه ساخت ربات کار می کنند حتما با این مساله روبه رو شده اند که چگونه سرعت ربات خود را کنترل کنند و یا اینکه چگونه می توان جهت چرخش موتور را تغییر داد . فرض کنید یک موتور DC از بازار خریداری می کنید بر روی موتور مشخصات ولتاژ ، دور و … نوشته شده است . به عنوان مثال ولتاژ موتور 5V است . بعد از خرید برای تست این موتور ، آن را به یک منبع تغذیه 5ولت وصل می کنید و موتور با یک سرعت ثابت شروع به چرخیدن می کند و وقتی سیم های مثبت و منفی را برعکس به موتور وصل کنید جهت چرخش موتور برعکس می شود . اعمال ولتاژ کمتر از 5 ولت منجر به کاهش سرعت موتور و در نتیجه کاهش جریان مصرفی می شود. سه نکته مهم در اینجا قابل ذکر است :
۱-اگر قصد کاهش سرعت موتور را دارید باید ولتاژی کمتر از ولتاژ نامی به موتور اعمال کنید.
۲-اگر قصد تغییر جهت موتور را دارید باید جهت سیم های آن را برعکس کنید .
۳- ولتاژی که به موتور اعمال می کنید باید توانایی جریان دهی مناسب را برای راه اندازی موتور داشته باشد.

آیا استفاده از میکروکنترلر به تنهایی برای راه اندازی موتور کافی است؟
فرض کنید قصد کنترل موتور DC با استفاده از میکروکنترلر AVR برای کنترل بهتر ربات خود دارید . اگر بخواهید موتور را به طور مستقیم به پین های میکروکنترلر avr وصل کنید چه مشکلاتی به وجود خواهد آمد . میکروکنترلرهای avr مانند ATMEGA16 یا ATMEGA32 و … با ولتاژ ۵ ولت کار می کند پس درحالت عادی نمی توانند ولتاژی متفاوت از ۵ ولت تولید کنند .دیگر اینکه پایه های های میکروکنترلر توانایی محدودی در تامین جریان برای راه اندازی قطعات خارجی دارند . هر کدام از پایه های میکروکنترلرهای AVR حداکثر توانایی تامین جریان 20mA را دارند . خب راه حل چیست؟ به طور کلی میکروکنترلرهای avr قطعات کنترلری هستند به این معنا که برای به دلیل محدودیت ولتاژ و جریان به قطعات واسطی به نام درایور نیاز دارند . درایورها قطعاتی هستند که از یک طرف به سیگنال های کنترل و از سمت دیگر به مدار قدرت وصل می شوند.

تا اینجای کار متوجه شدید که برای راه اندازی و کنترل موتور DC با استفاده از میکروکنترلر AVR نمی توانید آن را مستقیما به میکروکنترلر وصل کنید. پس برای راه اندازی یک موتور باید از درایور آن استفاده کنید. آیسی های فراوانی در بازار وجود دارد که وظیفه درایو کردن موتورها را برعهده دارند. L293-l293d-l298و … از جمله این آیسی ها هستند.
کنترل دور موتور با استفاده از PWM :
فرض کنید برای راه اندازی و کنترل موتور DC با استفاده از AVR از یک درایور استفاده کنیم ، برای کنترل دور موتور باید چیکار کنیم . همانطور که در مقدمه گفتیم اگر ولتاژی کمتراز ولتاژ نامی یک موتور به موتور اعمال کنیم سرعت موتور نیز کاهش می یابد. برای تولید ولتاژ کمتر از 5 ولت در میکروکنترلرها از تکنیکی به نام مدولاسیون پهنای باند یا PWM (Pulse Width Modulation) استفاده می شود. میکروکنترلرها با تولید یک موج مربعی با فرکانس ثابت و پهنای پالس متغیر می توانند دور موتور را کنترل کنند. این موج همان موج PWM است.

شکل فوق نحوه عملکرد بک موج pwm را نشان می دهد . این موج دارای فرکانس ثابت است (t/1) . اما پهنای پالس یا duty cycle متغییر می کند . فرض کنید این پهنا ۱/۱۰ موج کامل باشد (قسمت اول شکل) در این حالت مقدار انرژی که به بار خوروجی می رسد بسیار ناچیز است . این مقدار درواقع نمایانگر ۱/۱۰ ولتاژ نامی نیز هست . به عنوان مثال اگر موتور با ولتاژ ۱۰ ولت کار می کند . پهنای پالس ۱/۱۰ تقریبا ولتاژی معادل ۱ ولت را به موتور منتقل می کند.
نکته : موتور در اینجا صرفا یک مثال است . بجای موتور هر قطعه یا وسیله ای دیگر مانند LED و … نیز می تواند باشد.
حال فرض کنید این پهنای پالس آرام آرام افزایش پیدا کند . با افزایش پهنای پالس انرژی منتقل شده به بار نیز افزایش می یابد تا چایی که موتور شروع به حرکت می کند . و با ۱۰۰ درصد شدن پهنای پالس ، دور موتور به مقدار نامی می رسد.
تغییر جهت موتور DC :
همانطور که می دانید اگر پلاریته یا قطب های منبع تغذیه اعمالی به موتور را برعکس کنیم ، جهت چرخش موتور نیز برعکس می شود. اما اگر با میکروکنترلر avr قصد انجام اینکار را داشته باشید راه حل چیست؟ در اینجا نیز باید عرض کنیم که راه حل همان آیسی های درایور یا راه انداز موتورهای dc هستند.در واقع استفاده از آیسی های راه انداز موتورهای dc تمام عملیات های لازم از جمله کنترل سرعت ، جهت چرخش و راه اندازی موتورهای با ولتاژ و جریان بالاتر از 5 ولت را انجام می دهند. شکل زیر مدار داخلی آیسی L293 است :

همان طور که در شکل فوق می بینید این آیسی توانایی راه اندازی دو موتور DC را دارد. برای هر موتور ۳ پین کنترلی وجود دارد که ۲ پین برای تغییر جهت و یک پین PWM برای کنترل سرعت. یکی دیگر از آیسی های درایور موتورهای DC و استپر موتورها آیسی L298N است که کارکردی مانند آیسی فوق دارد.در شکل زیر ماژول این آیسی را می بینید که به دو موتور وصل شده است . در این آیسی نیز برای کنترل هر موتور ۳ چین وجود دارد. ۲ پین برای تغییر جهت و یک پین برای کنترل دور .

نکته : تفاوت اصلی آیسی های درایور موتورهای DC در مقدار جریان دهی برای راه اندازی موتور است . به عنوان مثال آیسی L298N قابلیت جریان دهی به موتور با حداکثر جریان ۳ آمپر را دارد . به این معنی که شما از این درایور نمی توانید برای راه اندازی موتورهای بزرگ با جریان مصرفی بیشتر استفاده کنید.
شرح پروژه کنترل موتور DC با استفاده از میکروکنترلر AVR :
بعد از تمام توضیحات لازم در خصوص مبانی تئوری کنترل و جهت دور موتور های DC بهتره به صورت عملی با نحوه این کار آشنا بشویم .در پروژه زیر قصد کنترل یک موتور DC با استفاده از میکروکنترلر ATMEGA32 یا ATMEGA16 را در محیط نرم افزار کدویژن codevision داریم.
قطعات مورد نیاز :
- یک عدد میکروکنترلر ATMEGA16 یا ATMEGA32
- یک عدد آیسی درایور یا ماژول L293
- بٍرد بُرد .
- مقداری سیم
- یک عدد موتور DC ۱۲ولت
- تعدادی کلید برای کنترل
نقشه مدار

کدهای برنامه:
یک پروژه با تنظیمات زیر در محیط کدویژن بسازید:


#include <mega16a.h>
#include <delay.h>
void main(void)
{
int PWM=1;
PORTB=0x00;
DDRB=0x03;
PORTC=0x07;
DDRC=0x00;
PORTD=0x00;
DDRD=0x20;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=0x03FF
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x83;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x01;
OCR1BH=0x00;
OCR1BL=0x00;
// Global enable interrupts
#asm("sei")
PWM=1;
PORTB.0=1;
PORTB.1=0;
while (1)
{
if(!PINC.0)
{
PWM+=20;
while(!PINC.0){};
}
if(!PINC.1)
{
PWM-=20;
while(!PINC.1){};
}
if(!PINC.2)
{
PORTB.0=~PORTB.0;
PORTB.1=~PORTB.1;
while(!PINC.2){};
}
if(PWM>1024)
PWM=1023;
if(PWM<0)
PWM=0;
OCR1A=PWM;
}
}
#include <mega16a.h>
#include <delay.h>
void main(void)
{
int PWM=1;
PORTB=0x00;
DDRB=0x03;
PORTC=0x07;
DDRC=0x00;
PORTD=0x00;
DDRD=0x20;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=0x03FF
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x83;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x01;
OCR1BH=0x00;
OCR1BL=0x00;
// Global enable interrupts
#asm("sei")
PWM=1;
PORTB.0=1;
PORTB.1=0;
while (1)
{
if(!PINC.0)
{
PWM+=20;
while(!PINC.0){};
}
if(!PINC.1)
{
PWM-=20;
while(!PINC.1){};
}
if(!PINC.2)
{
PORTB.0=~PORTB.0;
PORTB.1=~PORTB.1;
while(!PINC.2){};
}
if(PWM>1024)
PWM=1023;
if(PWM<0)
PWM=0;
OCR1A=PWM;
}
}همانطور که در شکل مدار می بینید سه کلید فشاری برای کنترل موتور وجود دارد . دو کلید برای نغییر سرعت موتور و یک کلید برای تغییر جهت موتور. بعد از برنامه ریزی میکروکنترلر با استفاده از ۳ کلید کنترل می توانید سرعت موتور را کم ، زیاد و یا جهت موتور را تغییر دهید.
مطلب خوبی بود
سلام ممنون از اموزشتون میخواستم ببینم میشه همین کارو طوری انجام داد که نیازی به کلید نباشه یعنی اتوماتیک سرعت و جهت چرخش موتور تغییر کنه؟
سلام
بله میشه باید یه مقدار کد بنویسید.
سلام میشه فیلم اموزششو به طور کامل با تمام کد نویسی و… واسم اماده کنید هزینشم تقدیم میکنم
بله میشه من یک همچین پروژه ای دارم که با صدا کا میکنه به عنوان کنترل و…
باید برنامه نویسی بلد باشی
این کار من با پایتون انجام میشه
بله امکانش هست.
اگر تو این برنامه نخوایم از تایمرها استفاده کنیم برنامه چه فرمی میشه؟
برای کنترل دور باید حتما از تایمر استفاده کنید.بدون تایمر هم میشه راه اندازی کرد اما امکان کنترل دور وجود ندارد.
سلام
میشه همین اموزشو بدون استفاده از دکمه انجام بدید و در سایت قرار بدید
سلام
انشالا به زودی.