• ¡Welcome to Square Theme!
  • This news are in header template.
  • Please ignore this message.
مهمان عزیز خوش‌آمدید. ورود عضــویت


امتیاز موضوع:
  • 17 رای - 2.12 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Title: آموزش کامل بسکام به همراه مثال
حالت خطی
#15
فصل پنجم : ورودی آنالوگ و وقفه
مبدل آنالوگ به ديجتال(ADC) :
گاهي نياز است که يک کميت بيروني (مانند دما و شدت صدا و شدت نور و... ) اندازه گيري شود ، براي اينکار از وسيله اي به نام سنسور استفاده مي شود. سنسور ها مقدار يک کميت آنالوگ را به ولتاژ يا جريان تبديل مي کند ، سپس اين ولتاژ انالوگ به مبدل انالوگ به ديجتال ميکرو داده مي شود و مبدل انالوگ به ديجتال مقدار ولتاژ را به کميت ديجتال متناظر تبديل ميکند ، سپس اين مقدار ديجتال با اعمال رياضي به مقدارعددي متناظر تبديل مي شود و روي LCD يا سون سگمنت نمايش داده مي شود .
حداکثر ولتاژي که مبدل انالوگ به ديجتال ،که از اين به بعد به آن Adcمي گوييم ميتواند اندازه بگيرد برابر با VCC است و اگر ولتاژ اعمالي از VCC بيشتر شود ممکن است مبدل انالوگ به ديجتال آسيب ببيند (معمولا بيشرين ولتاژ ورودي که به ADC اعمال ميکنند 4.5 ولت است) و کمترين ولتاژ اعمالي برابر با GND است .ADC به ازاي ولتاژ 5 ولت عدد 1023 و به ازاي صفر ولت عدد صفر را در متغيير مربوطه قرارمي دهد .
Adcبا دستور زير راه اندازي مي شود :
Config Adc = Single/Free , Prescaler = Auto , Reference = Opt
گزينه هاي single/free : در حالتي که Single انتخاب شود مقدار ديجتال سيگنال انالوگ توسط دستور Getadc در يک متغيير از جنس Word ريخته مي شودو در حالتي که Free انتخاب شود مقدار ديجتال سيگنال انالوگ کانال صفر در ريجيستر مربوط به Adc ريخته مي شود .
Prescaler : اين گزينه فرکانس ADC را مشخص ميکند و در حالتي که Autoانتخاب شود کامپاير با توجه به کريستال انتخاب شده بهترين کلاک را در نظر مي گيرد ، موارد ديگر براي کلاک عبارتند از 2 و 4 و 8 و 15 و 32 و 64 يا 128 است که يه جاي گزينه Auto نوشته مي شود .
هر چه عدد کمتری وارد شود فرکانس فوق بیشتر است .
Reference : در صورتي که بخواهيد از يک ولتاژ مرجع استفاده کنيد اين گزينه را بنويسيد (در صورت عدم استفاده از اين دستور ولتاژ مرجع زمين است و نيازي به نوشتن اين دستور نيست) .
(اين امکان فقط در بعضي از ميکرو ها وجود دارد ) Opt ميتواند يکي از موارد زير باشد :
Off : در اين حالت ولتاژمرجع داخلي خاموش شده و از ولتاژ مرجع بر روي پايه Aref استفاده مي شود.
Avcc : در اين حالت ولتاژ پايه Avcc به عنوان ولتاژ مرجع در نظر گرفته مي شود .
Internal : در اين حالت از ولتاژ مر جع داخلي 2.65 ولت استفاده مي شود .
بعد از راه اندازي Adc نوبت به استفاده از آن است براي اينکار با دستور Start Adc ، ADC روشن شده و شروع به نمونه برداري از سيگنال انالوگ موجود بر روي پايه اش مي کند و آن را به مقدار ديجتال تغيير مي دهد ، اين مقدار ديجتال با دستور زير در يک متغيير از جنس Word ريخته مي شود
Var = Getadc (Channel)
Var يک متغيير از جنس Word ميباشد
Channel : شماره : شماره Adc است که سيگنال انالوگ به آن اعمال شده . مانند :
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinb.2 , Db5 = Pinb.3 , Db6 = Pinb.4 , Db7 = Pinb.5 , Rs = Pinb.0 , E = Pinb.1
Config Adc = Single , Prescaler = Auto
Dim A As Word
Start adc
Q:
A = Getadc(1)
Locate 1 , 1
Lcd A
Goto Q
End
در خط هاي اول LCD و ADC پيکر بندي شده است در خط دهم مقدار انالوگ داده شده به پايه 24 ميکرو (PORTC.1) بعد از تبديل به مقدار ديجتال در متغيير A ريخته مي شود وسپس اين متغيير در سطر اول وستون اول LCD به نمايش در مي آيد .
مثال :
$regfile = "m16def.dat"
$crystal = 12000000
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.4 , Rs = Portd.5
Config Adc = Single , Prescaler = Auto
Dim A As Word , B As Word , C As Word , D As Word , E As Word , F As Word , G As Word , H As Word
Cls
Q:
A = Getadc(0) : Locate 1 , 1 : Lcd A
B = Getadc(1) : Locate 1 , 8 : Lcd B
C = Getadc(2) : Locate 2 , 1 : Lcd C
D = Getadc(3) : Locate 2 , 8 : Lcd D
E = Getadc(4) : Locate 3 , 1 : Lcd E
F = Getadc(5) : Locate 3 , 8 : Lcd F
G = Getadc(6) : Locate 4 , 1 : Lcd G
H = Getadc(7) : Locate 4 , 8 : Lcd H
Goto Q
End
در اين مثال از ميکرو مگا 16 و LCD 16*4 استفاده شده است ، ميکرو مگا 16 داراي 8 کانال ADC ميباشد ، که در اين مثال از همه ADC هاي اين ميکرو استفاده شده است .
ممکن است اين سوال براي شما پيش بيايد که : ADC نمي تواند بيشتر از 5 ولت را اندازه گيري کند ، ما ولتاژ هاي بالا تر را چگونه اندازه بگيريم؟ براي اندازه گيري ولتاژ هاي زياد شما بايد آن را با مقاومت کم کنيد ، فرض کنيد يک ولتاژ از 0 تا 200 ولت متغيير داريد و ميخواهيد آن را با ميکرو اندازه بگيريد ، شما بايد اين ولتاژ متغيير را به 0 تا 5 ولت تبديل کنيد ...
اين موارد در بخش پروژه ها آورده شده است.

مقايسه کننده انالوگ :
مقايسه کننده آنالوگ مقادير ولتاژ آنالوگ موجود بر روي دو پايه خود را ( پايه مثبت (AIN0) و پايه منفي (AIN1) ) با هم مقايسه مي کند . (مانند OP-AMP ) زماني که ولتاژ موجود در ورودي مثبت بيشتر از ولتاژ موجود در ورودي منفي باشد ، خروجي مقايسه کننده (AC0) يک مي شود . مقايسه کننده داراي يک پرچم وقفه مجزا است . خروجي مقايسه کننده مي تواند به عنوان تريگر ورودي CAPTURE تايمر/ کانتر يک نيز استفاده شود .
دستور پيکره بندي مقايسه کننده آنالوگ
Config Aci = On/Off , Compare = On/Off , Triggle = Toggle/Rising/Falling
Config Aci = On/Off : در زمان استفاده از مقايسه کننده بايد يک باشد . (در صورت استفاده از صفر مقايسه کننده کار نخواهد کرد).
Compare = On/Off: در صورت انتخاب On ، AC0 مستقيما به ورودي Capture تايمر/کانتر يک وصل مي شود.
Triggle = Toggle/Rising/Fallingl : نحوه روي دادن وقفه مقايسه کننده را نشان مي دهد.
Falling : يک لبه پايين رونده در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
Rising : يک لبه بالا رونده در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
Toggle : يک به صفر يا يک صفر به يک در خروجي مقايسه کننده باعث يک شدن پرچم وقفه مقايسه کننده و اجرا شدن برنامه وقفه خواهد شد.
مثال :
$regfile = "m8def.dat"
$crystal = 16000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portc.0
Config Portd = Input
Config Aci = On , Compare = On , Trigger = Falling
Config Timer1 = Timer , Capture Edge = Falling , Noise Cancel = 1 , Prescale = 1024
Enable Interrupts
Enable Icp1
Enable Aci
On Aci Q
Dim A As Byte
Do
Locate 1 , 1
Lcd Timer1
Loop
End
Q:
Locate 2 , 1
Lcd Capture1
Stop Timer1
Return
در مثال بالا تايمر يک در مد Capture راه اندازي شده است ، در اين مد در صورتي که يک لبه به پايه ICP (پايه 14 مگا 8 ) اعمال شود ،مقدار شمرده شده توسط تايمر 1 در ريجستر Capture1 ريخته مي شود و شما ميتوانيد از اين مقدار استفاده کنيد . در مثال به جاي لبه بالا رونده از وقفه مقايسه گر استفاده شده است ، هنگامي مقدار ولتاژ پايه مثبت مقايسه گر از ولتاژ پايه منفي بيشتر شود وقفه فعال شده و مقدار شمرده شده توسط تايمر در ريجستر Capture1 ريخته مي شود و سپس در موقعيت 2و1 روي LCD به نمايش در ميايد ، شما ميتوانيد در زير روال وقفه از هر دستور ديگري نيز استفاده کنيد ، با اسفاده از اين روش ميتوان زمان تناوب پالس رو اندازه گرفت.
کار با تایمر ها را در بخش های بعدی یاد خواهید گرفت .

راه اندازي وقفه هاي خارجي :
با استفاده از دستور زير ميتوان منابع وقفه خارجي را راه اندازي کرد :
Config IntX = State
intX : X نام پايه وقفه است که در اکثر ميکرو ها به نام INT0 و INT1 و در بعضي از ميکرو ها مانند مگا 64 به نام INT0 تا INT7 موجود است .
State : نوع پالس اعمالي براي فعال شده وقفه را معين ميکند ، State ميتواند يکي از موارد زير باشد:
Falling : با اعمال يک پالس پايين روند ( يک به صفر ) به پايه مورد نظر وقفه فعال مي شود .
Rising : با اعمال يک پالس بالا رونده( صفر به يک ) به پايه مورد نظر وقفه فعال مي شود.
Low Level : با اعمال سطح صفر به پايه مورد نظر وقفه فعال مي شود.
سپس با دستور Enable Interrupts وقفه سراسري و بادستور Enable IntX وقفه پيکر بندي شده فعال مي شود.و در نهايت شما ميتوانيد با دستور On IntX Lable ، به هنگام اعمال پالس به Lable مورد نظر پرش کنيد .با فعال شدن وقفه ، پايه هاي ورودي وقفه در همه حالت ها چک مي شود و نيازي به اوردن دستورات در حلقه اصلي وديگر حلقه ها نيست . باز گشت از زير بزنامه با دستور Return انجام مي شود .
مانند:
$regfile = "m16def.dat" : $crystal = 8000000
Config Porta = Output
Config Int0 = Falling
Config Int1 = Rising
Enable Int0
Enable Int1
Enable Interrupts
On Int0 Q
On Int1 W
Do
Set Porta.2 : Waitms 500 : Reset Porta.2 : Waitms 500
Loop
End
Q:
If Porta.0 = 0 Then : Set Porta.0 : Else : Reset Porta.0 : End If
Return
W:
If Porta.1 = 0 Then : Set Porta.1 : Else : Reset Porta.1 : End If
Return

در برنامه بالا از دو منبع وقفه INT0 و INT1 استفاده شده است ، همانگونه که ميبينيد به يکي از پايه ها يک پالس بالا رودنده و به ديگري پالس پايين رونده اعمال مي شود.
در حلقه ي اصلي مدام يکي از پايه ها خاموش وروشن مي شود ، درو منبع وقفه مدام چک ميشوند ، هنگامي که پالس مشخص شده به پايه وقفه اعمل شد به زير برنامه تعريف شده (Q براي منبع وقفه صفر و W براي منبع وقفه یک) پرش مي شود و وضعيت دو LED تغيير ميکند . مدار مورداستفاده را مشاهده مي فرماييد . (اين ميکرو داراي منبع وقفه خارجي سوم نيز ميباشد که در اينجا استفاده نشده (INT2 پايه B.3) ميتوانند واردشود .

WATCHDOG:
WATCHDOG يکي از تايمر هاي ميکرو است که ميتواند تا يک زمان خاص بشمارد و ميکرو را ريست کند ، اين تايمر ميتواند تا 8 زمان 16 ، 32، 64 ، 128 ، 256 ، 512 ، 1024 و 2048 و در بعضي از ميکروها 4096 , 8192 ميلي ثانيه بشمارد ، بعد از سپري شدن زمان ميکرو ريست مي شود و برنامه دوباره از ابتدا اجرا مي شود ، راه اندازي WATCHDOG به فرم زير است :
Config Watchdog = Time
Time : يکي از زمان هاي گفته شده در بالا ميباشد ( 16 ، 32، 64 ، 128 ، 256 ، 512 ، 1024 و 2048 و در بعضي از ميکروها 4096 , 8192 ميلي ثانيه) . با دستور Start Watchdog تايمر شروع به شمارش مي کند و پس از سپري شدن زمان ميکرو ريست مي شود.
مانند :
$regfile = "m16def.dat"
$crystal = 8000000
Config Porta.0 = Input
Config Porta.1 = Output
Config Watchdog = 1024
Do
If Pina.0 = 0 Then
Set Porta.1
Else
Start Watchdog
End If
Loop
End
در مثال بالا پايه A.0 ( که در حالت عادي 1 است) مدام چک مي شود و در صورتي که پايه 0 شود ميکرو بعد از 1024 ميلي ثانيه ريست مي شود.
[عکس: bnk.png]

برای ورود بر روی تصویر کلیک کنید.
www.avrprj.ir
 
پاسخ
  


پیام‌های این موضوع
RE: آموزش کامل بسکام به همراه مثال - توسط a.mehran - 09-26-2014، 04:21 PM

موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش اصطلاحات میکرو AVR a.mehran 1 4,820 09-26-2014، 04:45 PM
آخرین ارسال: a.mehran
  مدار فاصله سنج اولتراسونیک با بسکام a.mehran 2 4,075 09-02-2014، 07:56 AM
آخرین ارسال: a.mehran
  pwm با بسکام a.mehran 0 2,707 09-01-2014، 10:02 PM
آخرین ارسال: a.mehran
  راه اندازی سون سگمنت با بسکام a.mehran 0 2,781 09-01-2014، 09:56 PM
آخرین ارسال: a.mehran

پرش به انجمن:


Browsing: 1 مهمان