در این پروژه ما توسط ای سی L298 و میکروکنترلر atmega16 جهت چرخش (چپ گرد و راست گرد) و سرعت چرخش یک موتور dc را کنترل می کنیم. کنترل سرعت موتور با استفاده از pwm میکرو انجام می شود, بنابراین در این پروژه شما با نحوه راه اندازی و استفاده از pwm در میکرو avr اشنا می شوید.
PWM چیست؟ PWM یا Pulse Width Modulation ( مدولاسیون عرض پالس ) یک موج مربعی است که به طور متناوب 0 و 1 می شود. دامنه این موج می تواند بر حسب نیاز ما متغیر باشد, که با تغییر Duty Cycle (نسبت سطح 1 در یک دوره تناوب) می توان برای کنترل موتور و… از ان استفاده کرد. به تصویر زیر دقت کنید بهتر متوجه می شوید :
با اعمال موج های PWM بالا به درایور L298 می توانید توان یک موتور DC را بین ۰ تا ۱۰۰% تغییر دهید که این تغییر توان تاثیر مستقیمی بر سرعت موتور خواهد گذاشت.
ای سی درایور L298 :
همانطور که می دانید جریان خروجی پین های میکروکنترلرها محدود است و نمیتوان قطعاتی که نیاز به جریان زیادی برای راه اندازی دارند را مستقیما به میکرو وصل کرد. بنابراین ما نیاز به یک قطعه واسط داریم تا جریان مورد نیاز را ایجاد کند که به ان قطعه درایور می گویند.
درایور L298 یکی از قطعات مناسب جهت راه اندازی موتور است که با توجه به جریان دهی مناسب ( تا یک آمپر در هر کانال ) می تواند نیاز بسیاری از پروژه ها را مرتفع سازد. این قطعه می تواند دو موتور را به صورت مجزا راه اندازی کرده و جهت گردش و سرعت آنها را کنترل نماید. که این کنترل توسط اعمال ولتاژ به چهار ورودی منطقی این قطعه صورت می گیرد( برای هر موتور دو ورودی ) که می توان خروجی میکروکنترلر یا مدارات حسگر را به صورت مستقیم به این چهار ورودی متصل نمود و به راحتی موتور را کنترل کرد.
پین 1 : CURRENT SENSING A
- از این پایه جهت کنترل جریان موتور A استفاده می گردد. همچنین می توان این پایه را به صورت مستقیم به خط منفی مدار GND اتصال داد که در این صورت کنترلی بر روی جریان وجود ندارد
پین 2 : OUTPUT 1
- این پایه به یکی از ترمینالهای موتور A متصل می گردد
پین 3 : OUTPUT 2
- این پین به ترمینال دیگر موتور A متصل شده
پین 4 : (SUPPLY VOLTAGE (VS
- به پایه باید ولتاژ مورد نظر خود جهت اعمال به موتورها را متصل نمایید. این ولتاژ با توجه به موتورهای مورد استفاده شما حداکثر تا 46 ولت می تواند افزایش یابد. برای ساخت رباتهای کوچک به طور معمول بین 6 تا 12 ولت است
پین 5 : INPUT 1 TTL Compatible Inputs 1 to drive Motor A
- این پایه باید به صفر یا پنج ولت متصل گردد که همراه با پین 7 می توانند جهت گردش موتور را مشخص نمایند
پین 6 : ENABLE A TTL Compatible Enable Input for Motor A
- این پایه جهت روشن و خاموش کردن موتور A و در بیشتر مواقع جهت اعمل فرکانس PWM به موتور استفاده می گردد. پنج ولت موتور را روشن و صفر موتور را خاموش می کند
پین 7 : INPUT 2 TTL Compatible Inputs 2 to drive Motor A
- این پایه باید به صفر یا پنج ولت متصل گردد که همراه با پین 5 می توانند جهت گردش موتور را مشخص نمایند
پین 8 : GND
- اتصال به خط منفی مدار GND
پین 9 : (LOGIC SUPPLY VOLTAGE (VSS
- اتصال به 5 تا 7 ولت
پین 10 : INPUT 3 TTL Compatible Inputs 1 to drive Motor B
- این پایه باید به صفر یا پنج ولت متصل گردد که همراه با پین 12 می توانند جهت گردش موتور B را مشخص نمایند
پین 11 : ENABLE B TTL Compatible Enable Input for Motor B
- این پایه جهت روشن و خاموش کردن موتور B و در بیشتر مواقع جهت اعمل فرکانس PWM به موتور استفاده می گردد. پنج ولت موتور را روشن و صفر موتور را خاموش می کند
پین 12 : INPUT 4 TTL Compatible Inputs 2 to drive Motor B
- این پایه باید به صفر یا پنج ولت متصل گردد که همراه با پین 10 می توانند جهت گردش موتور B را مشخص نمایند
پین 13 : OUTPUT 3
- این پایه به یکی از ترمینالهای موتور B متصل می گردد
پین 14 : OUTPUT 4
- این پین به ترمینال دیگر موتور B متصل می گردد
پین 15 : CURRENT SENSING B
- از این پایه جهت کنترل جریان موتور B استفاده می گردد. همچنین می توان این پایه را به صورت مستقیم به خط منفی مدار GND اتصال داد که در این صورت کنترلی بر روی جریان وجود ندارد.
شماتیک پروژه :
همانطور که در شماتیک بالا می بینید, سه کلید برای راست گرد , چپ گرد و توقف موتور قرار داده شده و یک پتانسیومتر که با تغییر ان سرعت موتور تغییر خواهد کرد . کلیدها توسط سه مقاومت Pull up شده اند و درنتیجه زمانی که کلید وصل نیست پین های میکرو یک هستند و زمانی که کلید فشار داده شود پینی که کلید به ان متصل است صفر می شود.
در این پروژه ما فقط از یک موتور استفاده کردیم, بنابراین پین های مربوط به موتور B در ای سی L298 را نیاز نداریم .
برای حفاظت از قطعات مدار لازم است که پین های خروجی L298 که به دو سر موتور متصل می شوند (OUT1 و OUT2) را مانند شماتیک بالا به 4 دیود و خازن متصل کنیم .
توجه کنید که پین 9 ای سی L298 به 5 ولت متصل شده و پین 4 باید به ولتاژ مورد نیاز موتور ما (تا حداکثر 46 ولت) متصل شود که ما در شماتیک بالا به 12 ولت متصل کرده ایم .
پین شماره 21 میکروکنترلر خروجی موج PWM ما هست (OC2) که به پین 6 یا ENA متصل شده است و با تولید موج های PWM مختلف سرعت موتور تغییر می کند.
تصویر بزرگتر و واضح تر از مدار در فایل هایی که در انتها قرار داده شده وجود دارد که می توانید دانلود کنید
برنامه این پروژه با کدویژن :
در نرم افزار کدویژن یک پروژه جدید ایجاد کنید و در محیط کدویزارد میکروکنترلر را ATmega16 انتخاب کرده و فرکانس را 1 مگاهرتز تنظیم کنید. پین های 0 و 1 از پورت C را خروجی کنید و پین 7 از پورت D که برای تولید موج PWM ما می باشد را هم خروجی کنید. پین های پورت B که به کلیدها متصل هستند, خودشان ورودی هستند و لازم نیست در انها تغییری ایجاد کنید.
در این پروژه با اندازه گیری ولتاژ انالوگی که به پین 40 میکرو یا ADC0 توسط پتانسیوتر اعمال می شود, موج PWM متناسب با ان تولید می کنیم. بنابراین لازم است که ADC میکرو را هم فعال کنیم, تنظیمات ADC در کدویزارد به صورت زیر باشد:
توجه کنید که حتما تیک Use 8 bits را فعال کنید .
میکرو ATMEGA16 دارای سه تایمر می باشد که از انها می توان برای تولید موج PWM استفاده کرد. خروجی PWM تایمر 0 پایه 4 می باشد و با نام OC0 نامگذاری شده است . تایمر 1 این میکرو از انجایی که 16 بیتی است 2 خروجی با نام های OC1A-OC1B دارد (پین های 18 و 19 میکرو) و تایمر 2 که 8 بیتی است و یک خروجی به نام OC2 دارد (پین 21) .
ما در این پروژه از تایمر 2 میکرو یا OC2 برای ایجاد موج PWM استفاده می کنیم, که تنظیمات کدویزارد برای فعال شدن ان به صورت زیر است :
برنامه نهایی این پروژه به صورت زیر می باشد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
////////www.emic.ir//////// #include <mega16.h> #include <delay.h> #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (1<<ADLAR)) // که توسط خود کدويژن ايجاد مي شود adc از خط 5 تا 14 توابع مربوط به // unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCH; } void main(void) { DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (1<<DDC0); PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); DDRD=(1<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); ASSR=0<<AS2; // از خط 31 تا 34 رجيسترهاي مربوط به تايمر2 هستند که توسط خود کدويژن ايجاد مي شوند // TCCR2=(1<<PWM2) | (1<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (1<<CS21) | (0<<CS20); TCNT2=0x00; OCR2=0x00; ADMUX=ADC_VREF_TYPE; // هستند که توسط خود کدويژن ايجاد مي شوند adc از خط 36 تا 38 رجيسترهاي مربوط به // ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); OCR2=0; // فعال کرديم و مقدار ان مي تواند از 0 تا 255 باشد PWM يکي از رجيسترهاي تايمر2 هست که براي توليد موج OCR2 // //ما حداکثر مقدار خود باشد PWM ما حداقل و اگر 255 باشد يعني مقدار ولتاژ دي سي موج PWM برابر با 0 باشد يعني مقدار ولتاژ دي سي موج OCR2 اگر // while (1) { OCR2=read_adc(0); // قرار داده ايم ADC0 را برابر با مقدار خوانده شده از OCR2 در اين دستور ما مقدار رجيستر // // را فعال کرده ايم بازه اندازه گيري ما از 0 تا 255 مي باشد Use 8 bits در کدويزارد تيک adc از انجايي که در تنظيمات // // قرار داده شده OCR2 از 0 تا 255 تغيير مي کند که برابر با رجيستر read_adc(0) بنابراين با تغيير پتانسيومتر مقدار خوانده شده توسط دستور // if(PINB.0==0) // اجرا مي شود IF که به کليد راست گرد ما متصل است فشرده شود دستورات درون PINB.0 درصورتي که // { PORTC.0=0; PORTC.1=1; } if(PINB.1==0) // اجرا مي شود IF که به کليد چپ گرد ما متصل است فشرده شود دستورات درون PINB.1 درصورتي که // { PORTC.0=1; PORTC.1=0; } if(PINB.2==0) // اجرا مي شود IF که به کليد توقف ما متصل است فشرده شود دستورات درون PINB.2 درصورتي که // { PORTC.0=0; PORTC.1=0; } } } |
توابع و دستورات استفاده شده در برنامه بطور کامل توضیح داده شده است و نیاز به توضیح دیگری نیست ولی اگر در مورد هر قسمت از این پروژه سوالی داشتید می تونید در نظرات مطرح کنید. موفق باشید…
کلیپ شبیه سازی :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره …
سلام و وقت بخیر
برای اجرای این کد در atmel studio کد و تنظیمات را چگونه باید تغییر دهم؟
سلام.خسته نباشید.اگر بخوایم این پروژه رو با صفحه ال سی دی هم راه بندازیم که سرعت رو بهمون نشون بده باید چیکار کنیم؟
سلام آقای رازانی برای تنظیم کردن سرعت های دلخواه مثل 15 RPM یا 30 RPM بجای استفاده از پتاسیومتر چه دستوراتی لازم است؟
سلام, در برنامه رجیستر OCR2 را برابر با مقدار مورد نظر خود قرار دهید
باید تایمر ۱ رو هم فعال کنیم ،که تایمر 1 این میکرو از انجایی که 16 بیتی است 2 خروجی با نام های OC1A-OC1B دارد. میشه از رجیسترOC1A استفاده کرد، مابقی کد ها مانند انچه برای تایمر۲ نوشتیم رو برای تایمر ۱ هم می نویسیم. از پین های B3و B4و B5 برای چپ گرد و راست گرد موتور دوم استفاده می کنیم،از پین A1برای تغییر سرعت موتور دوم که به پتانسومتر متصل است استفاده می کنیم. D6 میکرو را به ENB ای سی l298 متصل می کنیم که پایه 11 درایور هست برای روشن و خاموشن کردن و pwm و پین های C2 وC3 میکرو را به پایه های به پایه های 11و 12 درایور برای تغییر گردش موتور استفاده می کنیم.
سلام ممنون بابت توضیحات عالی و کاملتون
فقط ی سوال داشتم اگر بخوایم موتور دوم رو هم تو این برنامه کنترل کنیم توی کد نویسی و پین ها و رجیستر ها نیاز هست چه تغییراتی ایجاد کنیم؟ممنون
سلام مهندس. برای راه انداز پنج موتور به روش زیر چگونه می توانیم پیاده سازی کنیم؟قصد داریم 5 موتور DC را به وسیله PWM و میکروکنترلر ATMEGA16 کنترل کنیم ، همانگونه که میدانید این
میکرو دارای 2 خط PWM هست . برنامه ای بنویسید که در آن با استفاده از تابعی به نام
PWM_Generat(m1_pwm,m2_pwm,m3_pwm,m4_pwm,m5_pwm) امکان ایجاد 5 خط
PWM وجود داشته باشد ، پارامتر های m_pwm duty cycle سیگنال های pwm را بر حسب درصد تعیین می
کند ، مثلا PWM_Generat(100,50,10,20,70) سیگنال PWM موتور 1 را با duty cycle 100 درصد و
موتور 2 را با 50 درصد و … درایو می کند
سلام. در مورده استفاده از خازن گفتید که برای محافظت هست. میشه لطفا بیشتر در مورد نقش خازن و بود و نبودش در مدار توضیح بدید و اینکه چرا 100نانو فاراد انتخاب کردید؟
برای حذف جریان های هارمونیک.
سلام وقت بخیر
عرض کنم اگه بجای موتور dc از استپ موتور استفاده کنیم چون از هر 4 تا خوروجی درایو استفاده میکنیم ایا باید دوتا pwm با اختلاف 180 درجه به پایه های درایو بدیم یا همون یدونه pwm رو مشترک به هردوتاش بدیم کار میکنه و میشه سرعت رو کنترل کرد قسمت چپگرد راست گرد رو میخواهم حذف کنم .
با تشکر
سلام, پست “راه اندازی استپر موتور با L298 و میکرو AVR” را بررسی کنید
سلام واقعا عالی بود. ساده روان با جزئیات کامل دقیق مخصوصا پایه درایور و برنامه نویسی. دست گلتون درد نکنه. وقتی این وبسایتو باز میکنم کیف میکنم. perfect
damet garm
با سلام
اگه ممکنه همین اموزشو بدون استفاده از کلید توضیح بدید که جهت و سرعت چرخش موتور فقط از طریق کد نویسی کنترل بشه
ممنون
سلام, سوالتون را درست متوجه نشدم. منظورتون اینه که یک سرعت و جهت پیش فرض بهش بدیم و کلیدها را حذف کنیم و فقط با همون سرعت و جهت مورد نظر بچرخه؟ یا چیز دیگه ای منظورتون بوده
فرکانس کاری میکروکنترلر روی چه مقداری باید تنظیم بشه؟
در توضیحات گفته شده, 1 مگاهرتز
سلام ببخشید من ک پروژه رو ران میکنم کلید راستگرد رو ک مثلا میزنم یدور میچرخه و بعد متوقف میشه شما میدونین دلیلش چیه ک بطور مداوم نمیچرخه؟
با سلام برنامه بسکامشو کجا باید ببینم؛کد ویژن ن؟
سلام, برنامه به زبان C و با استفاده از کدویژن نوشته شد. برنامه بسکام پروژه را ندارم
خوب بود ممنون
سلام .
خیلی ممنون
با همین یه صفحه ی شما کارم حل شد .
خیلی کامل و خوب
با تشکرر.
کد های مربوط به سرعت کدامند
خط 44 برنامه که بوسیله ADC و تایمر سرعت موتور کنترل میشه
سلام داداش… دمت گرم که این تایمر کانتر و ای دی سی رو با تصویر توضیح دادی من یه کم متوجه شدم… چون مبتدی هستم… تازه امروز یه ال ای دی چشمک زن رو تونستم راه اندازی کنم… داداش یه چیزی رو خواهشا” اگه میتونی با تصویر برام توضیح بده خیلی کلافم کرده… ببین الان تو این پروژه … میکرو 10 و 11 صفر و پنج ولت هستش.. حالا ال 298 هم شماره چهارش 12 تا 46 ولت… باز شماره ی 9 این ال298 پنج ولت…. خوب اینا چه جوری میشه؟ یعنی باید 12ولت بدم به پایه ی چهارمه 298 و بعد 5ولت جداگانه بدم به پایه ی دهم میکرو … بعدش 5ولت جداگانه بدم به پایه ی نهم ال298 و زمینهارو یکی کنم با هم… یکی اینو متوجه نمیشم…. دیگه اینکه مثلا” پتانسیومتر دو قطب مثبت منفیش به کجا وصل شده… یا اینکه اون یکی سره کلیدهای راست و چپگرد و توقف به کجا وصل شده… مقاومتها اون یه سرشون به کجا وصل شده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
ممنون میشم راهنماییم کنی.
سلام, اگه موتوری که استفاده می کنید 12 ولت است باید به پین 4 ای سی l298 دوازده ولت اعمال کنید و همین 12 ولت رو هم با یک ای سی رگولاتور 7805 به 5 ولت تبدیل کنید و برای میکرو و تغذیه l298 (پین 9) استفاده کنید. در مورد پتانسیومتر هم دو سرش به مثبت 5 ولت و زمین متصل شده (اون مثلث که به پایه بالایی متصل شده نماد 5 ولت است و پایه پایین هم به نماد زمین متصل هست). برای کلیدها و مقاومت ها هم همینطور است, یعنی یک سر کلیدها و مقاومت ها به میکرو متصل هست و سر دیگر کلیدها به زمین و سر دیگه مقاومت ها به مثبت 5 ولت متصل هست
واقع دستتون درد نکنه عااااااالی بود چسسسسسسبید
من نه می دونستم pwm چیه نهadc ولی با همین یه صفحه کیلت داستان دستم اومد و دیگه برام گنگ نیستن
کاش همه اموزشها اینجوری بود
انقد که خوب بود من قشنگ از روش جزوه نوشتم می خونم و می فهمم
بازم تشششششششکر