در این پست از سایت اِمیک, یک پروژه بسیار جالب به نام پروژه AVR صوت سنج قرار داده شده است. همانطور که از نام این پروژه مشخص است ما مقدار یا سطح صدای محیط را اندازه گیری می کنیم و روی یک LCD کاراکتری نمایش می دهیم. نمایش سطح صدای محیط به صورت درصدی انجام می شود یعنی با توجه به مقدار صدای محیط عددی بین 0 تا 100 درصد روی LCD نمایش داده می شود. این پروژه با استفاده از میکروکنترلر AVR انجام شده است. در زیر شماتیک این پروژه جالب را مشاهده می کنید:

همانطور که مشاهده می کنید, ما در این پروژه از میکروکنترلر ATmega16 استفاده کرده ایم. از یک LCD کاراکتری نیز استفاده کرده ایم که این LCD به پورت D میکروکنترلر متصل شده است. پتانسیومتر RV1 نیز برای تنظیم کنتراست یا میزان روشنایی LCD کاراکتری استفاده شده است.
در این پروژه از یک میکروفن خازنی برای اندازه گیری مقدار صدای محیط استفاده شده است. میکروفن خازنی را ما ابتدا باید توسط یک مدار ساده راه اندازی کنیم و خروجی ان را مقداری تقویت کنیم و سپس برای اندازه گیری به میکروکنترلر بدهیم. در شماتیک بالا قسمتی با عنوان “مدار اتصال میکروفن خازنی به میکروکنترلر” مشخص شده که در واقع همان مدار راه انداز و تقویت کننده میکروفن خازنی می باشد. قبلا من این مدار را در سایت منتشر کردم که برای مشاهده این مدار اینجا کلیک کنید.
پس از ساخت مدار معرفی شده کافی است که خروجی مثبت مدار را به پین 0 از پورت A میکرو (پایه 40) که یکی از ورودی های انالوگ میکرو می باشد متصل کنید و منفی مدار را نیز به منفی این پروژه (GND) متصل کنید.
میکروفن خازنی میزان صدای محیط را اندازه گیری می کند و خروجی میکروفن توسط مدار معرفی شده مقداری تقویت می شود و به میکروکنترلر اعمال می شود. میکروکنترلر نیز با اندازه گیری مقدار ولتاژ روی پایه 40 خود که مقدار این ولتاژ به مقدار صدای محیط بستگی دارد, سطح صدای محیط را محاسبه می کند. در نهایت مقدار صدای محیط اندازه گیری شده, به صورت عددی بین 0 تا 100 درصد روی ال سی دی کاراکتری نمایش داده می شود. در انتهای مطلب می توانید کلیپ تست عملی پروژه را مشاهده کنید.
توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید به تغذیه 5 ولت متصل کنید و همچنین پایه های 30 و 32 میکرو را هم بدلیل استفاده از ADC باید به مثبت تغذیه متصل کنیم.

برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
|
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 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> #include <alcd.h> #include <stdio.h> //sprintf براي استفاده از تابع stdio فراخواني کتابخانه// //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 7 تا 16 دستورات مربوط به// #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) unsigned int 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 ADCW; } void main(void) { long int adc=0; //از خط 20 تا 22 تعدادي متغير براي استفاده در برنامه تعريف شده است// int i=0, A=0, B=0; unsigned char lcd[16]; //ميکرو ورودي شده است A در زير پورت// 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); //ميکرو براي اتصال به ال سي دي کاراکتري خروجي شده است D در زير پورت// 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); //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 34 تا 36 رجيسترهاي مربوط به// // ADC initialization // ADC Clock frequency: 500/000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); lcd_clear(); while (1) { adc=0; A=0; B=0; //در شروع برنامه متغيرها صفر مي شوند// for(i=0;i<500;i++){ //روبرو 500 بار تکرار مي شود for حلقه// adc=adc+read_adc(0); //مي ريزد adc دستور روبرو از ولتاژ انالوگ روي پايه 40 ميکرو که مي تواند عددي بين 0 تا 1023 باشد 500 بار نمونه گيري مي کند و حاصل جمع 500 نمونه را در متغير// delay_ms(1); } A=adc/500; //با توجه به صداي محيط برابر عددي بين 0 تا 1023 است A مي ريزد. متغير A بر 500 ميانگين ان را بدست مي اورد و در متغير adc دستور روبرو با تقسيم مقادير// B=A/10.23; //مي ريزيم B را بر 10.23 تقسيم مي کنيم و حاصل که مقدار صداي محيط در بازه 0 تا 100 مي باشد را در متغير A از انجايي که مي خواهيم مقدار صداي محيط را بر حسب عددي بين 0 تا 100 نمايش دهيم متغير// lcd_clear(); //پاک کردن ال سي دي کاراکتري// lcd_gotoxy(0,0); //رفتن به ستون 0 و سطر 0 از ال سي دي کاراکتري// lcd_putsf("amount of Sound"); //روي ال سي دي کاراکتري amount of Sound نمايش عبارت// lcd_gotoxy(6,1); //رفتن به ستون 6 و سطر 1 از ال سي دي کاراکتري// sprintf(lcd,"%d",B); //براي نمايش روي ال سي دي کاراکتري lcd به رشته اي از کاراکتر و ذخيره ان در متغير B تبديل مقادير موجود در متغير// lcd_puts(lcd); //ذخيره کرده بوديم lcd نمايش مقدار صداي محيط (به درصد) که به صورت کاراکتر در متغير// lcd_putsf("%"); //نوشتن علامت درصد % بعد از مقدار صدا// } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می تونید در قسمت نظرات مطرح کنید. از انتهای مطلب نیز می توانید فایل برنامه این پروژه با نرم افزار کدویژن را دانلود کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…




