ساخت ماژول اولتراسونیک
در این بخش دانلود پروژه طراحی ماژول فاصله یاب اولتراسونیک با تراشه MAX232 و میکروکنترلر AVR, توسط تیم الکترونیک وبرنامه نویسی الکترونیک ۹۸ برای شما علاقه مندان به پروژه های میکروکنترلر AVR آماده شده است. در این پروژه با استفاده از مدارات فرستنده و گیرنده معرفی شده و میکروکنترلر ATtiny2313, یک فاصله یاب اولتراسونیک کامل می سازیم.
میکروکنترلر AVR باید موج اولتراسونیک را برای مدت معینی از طریق فرستنده ارسال کند و بازتاب موج ارسالی را پس از چند لحظه از طریق گیرنده دریافت نماید و با اندازه گیری زمان رفت و برگشت, فاصله را مشخص کند و روی LCD کاراکتری نشان دهد. در صورتی که مانعی وجود نداشته یا خیلی دور باشد, موج بازگشتی وجود نخواهد داشت و پیغام (Over Range) به معنای وجود نداشتن مانع روی, روی ال سی دی LCD ظاهر می شود.
نقشه شماتیک پروژه ساخت ماژول فاصله یاب اولتراسونیک با MAX232 و AVR
نقشه شماتیک کامل مدار پروژه در ادامه نشان داده شده است. در مدار فرستنده بر خلاف معمول, از تراشه MAX232 استفاده شده است. همان طور که می دانید, این تراشه به منظور تغییر سطوح منطقی برای برقراری ارتباط سریال استفاده شده است. همانطور که می دانید, این تراشه به منظور تغییر سطوح منطقی برای برقراری ارتباط سریال بین دو استاندارد TTL و RS232 ساخته شده و در این پروژه برای بالا بردن قدرت فرستنده به کار رفته است. توسط تراشه MAX232 می توان فرستنده اولتراسونیک را با ولتاژ Peak To Peak حدود 20V تحریک کرد.
در داخل تراشه max232, مداری برای تبدیل ولتاژ 5v به مثبت و منفی 10v وجود دارد که اصطلاخا Charge Pump نامیده می شود. از آنجا که ممکن است این مدار به دلیل ایجاد نویز, در عملکرد مدار گیرنده تاثیر منفی بگذارد, بهتر است تراشه max232 را پس از پایان ارسال امواج اولتراسونیک به طور کامل خاموش کنیم. برای انجام این کار همان طور که در نقشه شماتیک پروژه مشاهده می کنید از ترانزیستور BC327 استفاده شده است. به این ترتیب با صفر و یک شدن پایه PD3 یا همان TRIGER, تراشه MAX232 به ترتیب روشن و خاموش می شود.
توجه : زمان راه اندازی (Startup Time) برای تراشه MAX232 حدود 10ms میلی ثانیه است, بنابراین باید اول پس از صفر کردن پایه PD3, ده میلی ثانیه دست نگه داریم و پس از آن فرستنده اولتراسونیک را از طریق این تراشه راه اندازی کنیم.
پس از راه اندازی مدار, فرآیند فاصله یابی به طور مداوم و با فاصله زمانی مشخص صورت می گیرد. توسط دیپ سوئیچ (Dip Switch) نشان داده شده در شکل, می توان این فاصله زمانی را در 4 مقدار مختلف بین 200 تا 2000ms تنظیم کرد.
برنامه میکروکنترلر در محیط نرم افزار Bascom AVR
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
'Ultrasonic Range Finder '----------------------- $regfile = "attiny2313.dat" $crystal = 8000000 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = _ Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0 Config Lcd = 16 * 2 Config Timer0 = Timer , Prescale = 8 Config Timer1 = Timer , Prescale = 8 Config Int0 = Falling Config Pind.3 = Output Config Pind.4 = Output Config Pind.5 = Output Declare Sub Lcd_show(byval Hex_val As Integer) Enable Interrupts Disable Int0 Enable Ovf0 Enable Ovf1 On Int0 Ex0_rut On Ovf0 T0_rut On Ovf1 T1_rut Clkpr = &H80 Clkpr = &H00 Out1 Alias Portd.4 Out2 Alias Portd.5 Trigger Alias Portd.3 Dim Lcd_show_flag As Bit Dim Dip_switch As Byte Dim Timer_val As Integer Cursor Off : Cls : Lcd "start" : Waitms 1000 Out1 = 0 : Out2 = 0 '--------------------------- Do Disable Int0 Timer0 = &HF4 Timer1 = &H0000 Trigger = 0 Waitms 10 '----------------- Start Timer0 Start Timer1 Waitus 100 '100 Stop Timer0 Out1 = 0 Out2 = 0 Trigger = 1 Waitus 150 '150 '---------------- Enable Int0 Dip_switch = Pind And &H03 Select Case Dip_switch Case 0: Waitms 200 Case 1: Waitms 500 Case 2: Waitms 1000 Case 3: Waitms 2000 End Select If Lcd_show_flag = 1 Then Call Lcd_show(timer_val) Lcd_show_flag = 0 End If Loop End '--------------------------- Ex0_rut: Timer_val = Timer1 Waitus 20 If Pind.2 = 0 Then Disable Int0 Stop Timer1 Lcd_show_flag = 1 End If Return '--------------------------- T0_rut: Timer0 = &HF4 Out1 = Not Out1 Out2 = Not Out1 Return '--------------------------- T1_rut: Stop Timer1 Cls Lcd "Over range" Return '--------------------------- Sub Lcd_show(byval Hex_val As Integer) Dim D As Long Dim Distance As Integer D = Hex_val / 2 D = D * 343 D = D / 10000 Distance = D - 10 Cls Lcd "Range> " ; Distance ; "cm" End Sub |
برنامه میکروکنترلر در محیط نرم افزار Code Vision AVR
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
#include <tiny2313.h> #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.h> #include <delay.h> #define Trigger PORTD.3 #define Out1 PORTD.4 #define Out2 PORTD.5 unsigned int timer_val; char dip_switch; char s[]=" "; bit lcd_show_flag=0; //------------------------------------------ interrupt [EXT_INT0] void ext_int0_isr(void) { timer_val=TCNT1; delay_us(20); if (PIND.2==0) { GIMSK=0x00; // disable INT0 TCCR1B=0x00; lcd_show_flag=1; } } //------------------------------------------ interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0=0xF4; Out1=!Out1; Out2=!Out1; } //------------------------------------------ interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCCR1B=0x00; lcd_clear(); lcd_putsf("Over range"); } //------------------------------------------ void lcd_show(unsigned int hex_val); void main(void) { #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTD=0x00; DDRD=0x78; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 1000.000 kHz TCCR0A=0x00; TCCR0B=0x00; //stop timer0 TCNT0=0xF4; OCR0A=0x00; OCR0B=0x00; //--------------------------------------- TCCR1A=0x00; TCCR1B=0x00; //stop timer1 TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; //---------------------------------------- GIMSK=0x00; //disable INT0 MCUCR=0x02; EIFR=0x40; //---------------------------------------- TIMSK=0x82; ACSR=0x80; //---------------------------------------- lcd_init(16); #asm("sei") lcd_clear(); lcd_putsf("start"); delay_ms(1000); Out1=0; Out2=0; while (1) { GIMSK=0x00; //disable INT0 TCNT0=0xF4; TCNT1=0x0000; //--------------------------- Trigger=0; delay_ms(10); TCCR0B=0x02; //start timer0 TCCR1B=0x02; //start timer1 //--------------------------- delay_us(100); //--------------------------- TCCR0B=0x00; //stop timer0 Out1=0; Out2=0; Trigger=1; delay_us(150); GIMSK=0x40; // enable INT0 dip_switch=(PIND&0x03); switch (dip_switch) { case 0: delay_ms(200); break; case 1: delay_ms(500); break; case 2: delay_ms(1000); break; case 3: delay_ms(2000); break; }; //---------------------------- if(lcd_show_flag) { lcd_show(timer_val); lcd_show_flag=0; } }; } //------------------------------------------- void lcd_show(unsigned int hex_val) { unsigned int distance; unsigned long int d; char i; d=hex_val/2; d=d*343; d=d/10000; distance=d; for(i=2;i>=0;i--) { s[i]=(distance%10)+0x30; distance=distance/10; } lcd_clear(); lcd_putsf("Range> "); lcd_puts(s); lcd_putsf("cm"); } |
شرح برنامه میکروکنترلر به زبان بیسیک و زبان C
همانطور که در نقشه شماتیک این پروژه مشاهده می کنید، در این پروژه، نوسان ساز جداگانه ای برای تولید موج مربعی 40KHz استفاده نشده است و در حقیقت تولید این موج بر عهده میکروکنترلر می باشد و توسط تایمر صفر Timer0 انجام می گیرد. با فعال شدن تایمر صفر در زیر روال وقفه این تایمر، پایه های PD4 و PD5 پی در پی صفر و یک می شوند تا در نهایت موج مربعی با فرکانس 40KHz به دست آید. صفر و یک شدن PD4 و PD5 کاملا عکس یکدیگر است و باعث می شود موجع مربعی به دست آمده در خروجی تراشه Max232 بین 10V± نوسان کند. به عبارت دیگر، دامنه موج مربعی اعمال شده به فرستنده اولتراسونیک برابر با 20V پیک تا پیک خواهد بود.
نحوه ارسال موج اولتراسونیک
هر دو تایمر صفر و یک در هنگام راه اندازی، غیرفعالند. در شروع هر چرخه از حلقه اصلی این دو برنامه، ابتدا وقفه خارجی صفر غیر فعال می گردد تا هر گونه تغییر در وضعیت پایه INT0 نادیده گرفته شود. وقفه خارجی صفر تا زمانی که عمل ارسال تمام نشود، غیر فعال می ماند. در ادامه، تایمر صفر با مقدار F4H بار می شود تا برای تولید موج 40KHz آماده باشد. پس از آن تایمر 1 با مقدار 0000H بار می شود. تایمر 1 در این پروژه برای اندازه گیری مدت زمان رفت و برگشت موج اولتراسونیک استفاده شده و چون فرکانس کلاک تایمر یک 1MHz در نظر گرفته شده است، مقدار شمارش شده در این تایمر بر حسب میکروثانیه خواهد بود.
در این لحظه، همه چیز برای ارسال موج اولتراسونیک و شروع شمارش تایمر 1 آماده است. با صفر شدن پایه PD3 توسط دستور Trigger=0 تراشه Max232 روشن می شود. همانظور که اشاره شد برای پایدار شدن مبدل ولتاژ داخلی تراشه، زمانی حدود 10 میلی ثانیه لازم است و بنابراین عمل بعدی ایجاد تاخیر 10ms است. پس از آن، دو تایمر صفر و یک، همزمان راه اندازی می شوند. تایمر صفر پس از 100 میکروثانیه متوقف می گردد، در نتیجه بازه زمانی موج اولتراسونیک ارسالی، تنها 100 میکروثانیه یا 4 سیکل خواهد بود.
نحوه دریافت موج اولتراسونیک و محاسبه فاصله
پس از اتمام فرآیند ارسال موج اولتراسونیک، باید مدت زمانی کوتاه سپری شود و پس از آن، برنامه در مد دریافت قرار گیرد. با انجام اینکار، موج ارسالی به اندازه کافی از فرستنده فاصله می گیرد و به اشتباه به جای موج بازگشتی دریافت نخواهد شد. مقدار این تاخیر در این پروژه، 150 میکروثانیه در نظر گرفته شده است و وقفه خارجی پس از سپری شدن این زمان، فعال می شود و برنامه در مد دریافت قرار می گیرد.
خروجی تراشه LM567 با دریافت موج بازگشتی، وقفه خارجی صفر را فعال می کند و در زیر روال وقفه، مقدار شمارش شده در تایمر 1 خوانده می شود. این مقدار مدت زمان سپری شده از لحظه ارسال تا لحظه دریافت موج مربعی را بر حسب میکروثانیه در بر دارد. که می توان با توجه به آن فاصله را بدست آورد.
پس از محاسبه فاصله، مقدار بدست آمده بر حسب سانتی متر بر روی ال سی دی کاراکتری نشان داده می شود. چنانچه مانعی وجود نداشته باشد یا خیلی دور باشد، موج بازگشتی وجود نخواهد داشت و تایمر 1 پس از زمانی حدود 65 میلی ثانیه سر ریز می شود و پیغام Over range روی LCD نمایان می گردد.
2 دیدگاه
بازتاب ها: راه اندازی سنسور فاصله سنج آلتراسونیک UT با میکرو AVR | الکترونیک 98
بازتاب ها: پروژه ساخت فاصله سنج با ماژول حسگر اولتراسونیک و AVR | الکترونیک 98