در این پست از سایت اِمیک, با استفاده از میکروکنترلر AVR یک مولد یا ژنراتور موج مربعی خواهیم ساخت که دارای قابلیت تغییر فرکانس نیز می باشد. ما با استفاده از تایمر در میکروکنترلر AVR این پروژه را طراحی کرده ایم که در این پروژه از میکروکنترلر ATmega16 و تایمر 0 ان استفاده خواهیم کرد. شما می توانید از هر میکروکنترلر AVR که دارای تایمر می باشد استفاده کنید.
دامنه ولتاژ خروجی موج مربعی ما 5 ولت خواهد بود و فرکانس ان نیز از حدود 250 هرتز تا 62500 هرتز (62.5Khz) قابل تنظیم است. در ادامه شماتیک این پروژه را مشاهده می کنید و با این پروژه بیشتر اشنا خواهید شد.
پروژه AVR مولد موج مربعی با قابلیت تغییر فرکانس:
شماتیک این پروژه را در بالا مشاهده می کنید که بسیار ساده می باشد. همانطور که مشاهده می کنید خروجی موج مربعی ما پایه 4 میکرو (پین 3 از پورت B) می باشد و با عبارت OUTPUT مشخص شده است, که این پایه خروجی تایمر 0 میکروکنترلر ATmega16 می باشد. برای نمایش مقدار فرکانس خروجی از یک LCD کاراکتری استفاده شده که بصورت دائم فرکانس خروجی را نمایش می دهد.
پتانسیومتر RV1 برای تنظیم فرکانس خروجی استفاده شده که با تغییر ان می توانید فرکانس موج مربعی را از 250Hz هرتز تا 62.5KHz تغییر دهید. همانطور که مشاهده می کنید دو سر این پتانسیومتر به مثبت و منفی تغذیه (VCC و GND) متصل شده و با تغییر ان, ولتاژ پایه وسط ان که به پین 40 میکرو متصل است از 0 تا 5 ولت تغییر می کند. پایه 40 میکروکنترلر ATmega16 پایه ی ADC0 می باشد و ما این ولتاژ پایه وسط پتانسیومتر را توسط ADC میکرو اندازه گیری می کنیم و با توجه به مقدار این ولتاژ فرکانس موج مربعی توسط میکرو تنظیم می شود.
پتانسیومتر RV1 برای تنظیم کنتراست یا روشنایی LCD کاراکتری استفاده شده, در صورتی که نخواستید استفاده کنید باید پایه 3 ال سی دی را به زمین (GND) متصل کنید.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید به تغذیه 5 ولت متصل کنید و همچنین پایه های 30 و 32 میکروکنترلر ATmega16 را هم به دلیل استفاده از ADC باید به مثبت تغذیه متصل کنیم.
برنامه کدویژن :
برنامه این پروژه به زبان C و با استفاده از کامپایلر کدویژن نوشته شده است. فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده و همانطور که گفته شد از ADC0 میکرو برای اندازه گیری ولتاژ پایه وسط پتانسیومتر استفاده شده که این ولتاژ را برابر تایمر 0 میکرو قرار داده ایم تا از این طریق بتوانیم فرکانس خروجی موج مربعی را تغییر دهیم. تایمر 0 میکرو نیز در مد CTC و مقسم فرکانسی 8 استفاده شده (در کدویزارد مقدار فرکانس تایمر 125KHz انتخاب شده) در زیر برنامه پروژه را مشاهده می کنید:
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 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> #include <alcd.h> #include <stdlib.h> // ltoa براي استفاده از تابع stdlib فراخواني کتابخانه // #define Fclk 1000000 //Fclk برابر قرار دادن فرکانس کاري ميکرو که 1 مگاهرتز است با عبارت// #define N 8 //قرار داده ايم N مقسم تايمر را که 8 انتخاب کرده ايم برابر با حرف// //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 10 تا 19 دستورات مربوط به// #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (1<<ADLAR)) 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) { char LCD[16]; //کاراکتري نمايش دهيم lcd براي تبديل مقادير فرکانس به رشته اي از کاراکتر تا بتوانيم ان را روي char تعريف متغير از نوع// unsigned long int F; //تعريف متغير براي ريختن مقادير فرکانس محاسبه شده در ان// 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) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); //از خط 35 تا 37 رجيسترهاي مربوط به فعالسازي تايمر0 که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند// TCCR0=(0<<WGM00) | (0<<COM01) | (1<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (0<<CS00); TCNT0=0x00; OCR0=0x00; /* که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 39 تا 41 رجيسترهاي مربوط به */ ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); while (1) { OCR0=read_adc(0); //قرار داده ايم ADC0 را برابر با مقدار خوانده شده از OCR0 در اين دستور ما مقدار رجيستر// //را فعال کرده ايم بازه اندازه گيري ما از 0 تا 255 مي باشد Use 8 bits در کدويزارد تيک adc از انجايي که در تنظيمات// //قرار داده شده OCR0 از 0 تا 255 تغيير مي کند که برابر با رجيستر read_adc(0) بنابراين با تغيير پتانسيومتر مقدار خوانده شده توسط دستور// F=Fclk/(2*N*(OCR0+1)); //دستور روبرو فرکانس را براي نمايش روي ال سي دي محاسبه مي کند// ltoa(F, LCD); //ذخيره ميکند LCD دستور روبرو فرکانس محاسبه شده در بالا را به رشته اي از کاراکتر تبديل مي کند و درون متغير// lcd_clear(); //پاک کردن ال سي دي// lcd_gotoxy(2,0); //رفتن به ستون 2 و سطر 0 از ال سي دي// lcd_putsf("F="); //روي ال سي دي F= نمايش متن// lcd_puts(LCD); //ذخيره شده اند LCD نمايش مقادير فرکانس که به صورت کاراکتر در متغير// lcd_putsf(" Hz"); //بعد از فرکانس Hz نمايش عبارت// lcd_gotoxy(2,1); lcd_putsf("WWW.EMIC.IR"); delay_ms(300); } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید.
نکات:
- در صورتی که با ADC در میکروکنترلر AVR و نحوه راه اندازی ان اشنا نیستید این پست را مطالعه کنید
- برای اشنایی با LCD کاراکتری و نحوه راه اندازی ان این پست را مطالعه کنید
- توجه کنید که در کدویزارد در زمان فعالسازی ADC باید حتما تیک Use 8 bits را فعال کنید
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
بسیار آموزنده.
ممنون از زحمتی که کشیدید
سلام
فرمول زیر از کجا آوردید؟ ممنون
F=Fclk/(2*N*(OCR0+1)); //دستور روبرو فرکانس را برای نمایش روی ال سی دی محاسبه می کند//
سلام
امکانش هست که برنامه ای قرار بدید که فرکانس خروجی توسط کیپد انجام بشه
یا میتونی توضیح بدید که باید چیکار کنم
سلام وقت شما بخیر
من متاسفانه خیلی در زمینه میکرو تازه کار هستم . اگر همین برنامه رو در atmega8au بخواهیم داشته باشیم چه تغییراتی لازمه؟
سلام من یک پروژه داشتم که در اون یک کد هگز رو از کیپد اسکن میکنه و با استفاده از مدولاسیون FSK مدوله میکنه کسی میتونه انجام بده این پروژؤ< ؟
سلام وقت بخیر این پروژه رو بخوام با atmega 8 راه اندازی کنم کدوم قسمت بای تغییر کنه .ممنون میشم راهنمایی کنید.
برادر این که خروجی نمیده فقط رو ال سی دی نشون میده
خروجی با OUTPUT مشخص شده
سلام با تشکر از سایت خوبتون. من میخواستم بازه تغییرات طول موج رو با تغییر مقدار پیش تقسیم کننده و مقدار تایمر به
صورتی تنظیم کنم که فرکانس خروجی از یک هرتز تا 500 کیلوهرتز تغییر کند.، کدوم قسمت کد رو باید تغییر بدم؟؟؟ مقدار فرکانس تایمر و مقدار پیش تقسم کننده رو باید تغییر بدم؟
سلام, متاسفانه این پروژه را چندین ماه پیش انجام دادم و الان حضور ذهن ندارم ولی تا اونجایی که یادم هست فکر نمیکنم بشه این محدوده مورد نظر شما را یعنی تا 500 کیلو را ایجاد کرد. حالا اگر خواستید هم سعی کنید از کریستال خارجی برای میکرو با فرکانس حداقل 8 مگ استفاده کنید
سلام مهندس اگه امکان داره یک برنامه هم برای خواندن فرکانس و دیوتی سایکل بنویسید