Professional Documents
Culture Documents
AVR
أ
ب
نهال را باران باید
تا بشوید غبار نشسته بر برگهایش
و سیرابش کند از آب حیات
و آفتاب باید
تا بتاباند
نیرو را
و محکم کند
شاخههای تازه روییده را
بر نام مادر
بوسهای باید زد
دستهایی که
میشویند غبار خستگی روزگار را
و سیراب میکنند روح تشنه را
بر نام پدر
بوسهای باید زد
دست هایی را
که میتابانند
نیرو را
و محکم میکنند
استواری پایههای زیستن را
ت
مقدمه:
ث
به لطف ايزد منان ،اين مجموعه که حاصل تجربيات و مطالعات چندين ساله
مولف بر روي سيستمهاي ديجيتال برنامهپذير است ،تکميل شده است .الزم به ذکر
است که :تماني برنامههاي نوشته شده در کتاب ،در CDهمراه کتاب نيز قرار داده
شده و به طور کامل در آزمايشگاه ريزپردازنده آزمايش و بررسي شدهاند .در CD
همراه کتاب ،عالوه بر برنامههاي کتاب ،تمامي فايلهاي مرتبط و فايلهاي اجرايي
توسط نرمافزار شبيهساز Proteusنيز وجود دارند تا خواننده کتاب ،تنها به تحليل،
بررسي و اجراي آنها بپردازد .همچنين متناسب با نياز خوانندگان کتاب :آموزش
نرمافزارهاي مرتبط با کتاب نيز در CDقرار داده شده تا خواننده در ميان دنياي
تراشههاي برنامهپذير احساس تنهايي نکند .شايان ذکر است که پروژههاي اين کتاب
به سادگي قابل ترکيب و استفاده در پروژههاي بزرگتر ميباشند .اميد است به لطف
خداوند يکتا ،اين کتاب ،راه را براي يادگيري ،طراحي و پيادهسازي رهيافتهاي
نوين علمي و عملي براي شما هموار سازد.
در پايان بر خود الزم ميدانم ،از اساتيد بزرگواري که در دانشگاه صنعتي اميرکبير
(پليتکنيك تهران) ،از آنان بسيار آموختم ،تقدير به عمل آورم و اين کتاب را نتيجه
زحمات بسيار آن عزيزان بدانيم.
با توجه به اين مهم که اين کتابي عاري از اشکال نيست ،در صورتي که اشکال يا
اشکاالتي را در کتاب مشاهده فرموديد ،ما را بخشيده و نظرات اصالحي خود را به
آدرس الکترونيکي h.saghaei@gmail.comيا از طريق وب سايت زير براي ما
ارسال نمائيد تا در چاپهاي بعدي اصالح شوند .پيشاپيش از شما سپاسگزاريم.
ج
فهرست
مقدمه ..................................................................................................ث
فصل اول :ميکروکنترلر و واسطهاي جانبي 1 .......................................................
-1-1معرفي ميکروکنترلرهاي 1 .............................................................. AVR
-1-1-1مقدمه 1 ........................................................................................
-2-1-1طراحي براي زبانهاي BASICو 2 .................................................... C
-3-1-1خصوصيات ATMEGA16و 3 ....................................... ATMEGA16L
-2-1برنامهريزي ميکروکنترلرهاي 5 ........................................................ AVR
-3-1آشنايي با روش نصب و کار با نرمافزار 6 ........................ CODEVISIONAVR
-1-3-1مقدمه 6 ........................................................................................
-2-3-1آشنايي با محيط 7 ................................................ CODEVISIONAVR
-3-3-1روش نصب نرمافزار8 ........................................... CODEVISIONAVR
-4-3-1ايجاد يك پروژه جديد 10...................................................................
-4-1آشنايي با زبان 14............................................................................. C
-1-4-1ساختار برنامهنويسي 14......................................................................
-2-4-1متغيرها 16.....................................................................................
-3-4-1دستور 20.................................................................................. IF
-4-4-1ساختار دستور 22............................................................... SWITCH
-5-4-1دستورات حلقه 23............................................................................
-6-4-1اشارهگرها 26..................................................................................
-7-4-1آرايهها 27......................................................................................
-8-4-1رشته 28........................................................................................
-9-4-1توابع 30........................................................................................
-10-4-1متغيرهاي سراسري و محلي 31...........................................................
فصل دوم :آشنايي با پورتها 33.......................................................................
ح
پروژه اول :چراغ چشمكزن 33....................................................................
پروژه دوم :کنترل چراغ راهنمايي با نمايش مدت انتظار38......................................
پروژه سوم :نمايش کاراکترها بر روي نمايشگرهاي ماتريسي 44..............................
پروژه چهارم :کنترل موتورهاي پلهاي 53.........................................................
فصل سوم :نمايشگرهاي کاراکتري و گرافيکي 57.................................................
LCD -1-3هاي کاراکتري 57.........................................................................
-1-1-3برنامهريزي LCDتوسط 60......................................... CODEWIZARD
-2-1-3دستورات مربوط به کار با 60.......................................................LCD
پروژه پنجم :نمايش گردشي يك عبارت بر روي 61...................................... LCD
پروژه ششم :نمايش حرف به حرف روي 63.............................................. LCD
-2-1-3کاراکترهاي تعريف شده65................................................................ :
-3-1-3نمايش کاراکتر جديد بر روي LCDکاراکتري66....................................... :
پروژه هفتم :فارسي نويسي بر روي LCDکاراکتري 67..........................................
پروژه هشتم :منو نويسي در 69.............................................................. LCD
-2-3آشنايي و برنامهنويسي با LCDهاي گرافيکي73............................................
-1-2-3معرفي پايههاي 74................................................LCD – 128 GO64A
-2-2-3شبيه سازي LCDگرافيکي 78..............................................................
-3-2-3نرم افزار مبدل فرمت عکس 78.............................................................
پروژه نهم :نمايش تصوير بر روي LCDگرافيکي 80........................ KS108 12864
پروژه دهم :نمايش تصوير بر روي LCDگرافيکي 83.................. TOSHIBA 240128
فصل چهارم :کاربرد وقفههاي خارجي 93............................................................
-1-4اسکن صفحه کليد ماتريسي 44با وقفه 93.................................................
پروژه يازدهم :اسکن صفحه کليد ماتريسي 94.............................................. 44
-2-4اسکن صفحه کليد 44با انکدر 96......................................... MM74C922
پروژه دوازدهم :اسکن صفحه کليد ماتريسي 44توسط انکدر 97........... MM74C922
-3-4اسکن صفحه کليد کامپيوتر 98.................................................................
خ
پروژه سيزدهم :اسکن صفحه کليد کامپيوتر توسط ميکروکنترلر101 ...........................
فصل پنجم :کاربرد تايمرها107 ........................................................................
پروژه چهاردهم :فرکانس متر ديجيتال 107 ........................................................
پروژه پانزدهم :اندازهگيري درصد وظيفه و فرکانس سيگنال ورودي 110............................
پروژه شدهم :ساخت نوسانساز کنترل شونده با ولتاژ (107..................................... )VCO
پروژه هفدهم :تنظيم و کنترل فرکانس و درصد وظيفه خروجي توسط کاربر 117 ...........
پروژه هجدهم :مدار کنترل موتور 122 ........................................................ DC
پروژه نوزدهم :محاسبهي RPMموتور 127 .......................................................
پروژه بيستم :اسکن نمايشگر هفت پارچه 128 ..................................................
پروژه بيستمويکم :کسينوس متر 131 ..........................................................
پروژه بيستمودوم :ربات مسيرياب 135 ............................................................
فصل ششم :مبدل آنالوگ به ديجيتال 145 ............................................................
پروژه بيستموسوم :ولتمتر ديجيتال 145 .........................................................
پروژه بيستوچهارم :اندازهگيري دما با استفاده از سنسور 148 ........................ LM35
فصل هفتم :پورت سريال 153 .........................................................................
-1-7ارتباط سريال 153 .................................................................... USART
-2-7سازگاري USARTبا 154 ............................................................ UART
-3-7توليد کنندهي نرخ ارسال داخلي 154 .........................................................
-4-7قاب داده 155 .....................................................................................
-5-7توابع پورت سريال 156 .........................................................................
پروژه بيستوپنجم :نمايش کارکترهاي دريافتي از پورت سريال بر روي 158 ......... LCD
پروژه بيستوششم :راهاندازي ماژول فرستنده -گيرنده بي سيم توسط 163 ...... USART
پروژه بيستوهفتم :روش ساخت CALLER IDتلفن بر اساس استاندارد 172 ......... FSK
پروژه بيستوهشتم :مد چند پردازنده ارتباط سريال 185 ............................ USART
-6-7اتصال ميکروکنترلر AVRبه پورت سريال کامپيوتر با ساختار 193 ............ RS232
پروژه بيستونهم :ارتباط ميکروکنترلر AVRو کامپيوتر 193 ...................................
د
-7-7اتصال ميکروکنترلر AVRبه پورت سريال با استفاده از پروتکل 198 .......... RS485
پروژه سيام :مد چند پردازنده 200 ........................................................... SPI
-8-7ارتباط سريال يك سيمه )203 ................................................ (ONE WIRE
-1-8-7پيکربندي 1WIREبا 205 ........................................... CODEWIZARD
پروژه سيويکم :اندازهگيري دما به کمك سنسور 206 ............................... DS1820
-9-7ارتباط ميکروکنترلر با پورت USBاز طريق تراشه 209 .......................... FT232
پروژه سيودوم :ارتباط با پورت موازي کامپيوتر 211 ............................................
فصل هشتم :حافظههاي جانبي 219 ...................................................................
پروژه سيوسوم :ارتباط با حافظه سريال AT24C256توسط 219 ....................... I2C
پروژه سيوچهارم :ارتباط با حافظه سريال AT25256توسط222 ........................ SPI
پروژه سيوپنجم :ارتباط ميکروکنترلر با حافظه 229 ..................................... MMC
فصل نهم :پروژههاي الکترونيك قدرت 235 .........................................................
پروژه سيوششم :ساخت مبدل 235 ..................................................... BUCK
پروژه سيوهفتم :مولد موج PWMسينوسي 241 ................................................
پروژه سيوهشتم :مولد پالسهاي اينورتر سهفاز 244 ................................. SPWM
پروژه سيونهم :طراحي يك ديمر 247 ............................................................
فصل دهم :پروژههاي کاربردي ديگر 252 ............................................................
پروژه چهلم :اسيلوسکوپ ديجيتال با استفاده از ميکروکنترلر 252 .............................
پروژه چهلويکم :ارتباط ميکروکنترلر و TFTموبايل ( LCDموبايل) 268 ....................
پروژه چهلودوم :طراحي و ساخت 296 ....................................... WAV PLAYER
پروژه چهلوسوم :ماشين حساب 304 ............................................................
پروژه چهلوچهارم :ساعت با استفاده از تراشه 307 .................................. DS1307
پروژه چهلوپنجم :اجراي موزيك با ميکرو 320 ..................................................
پروژه چهلوششم :اندازهگيري فاصله توسط سنسورهاي فراصوت (323 .. )ULTRASONIC
پروژه چهلوهفتم :مدار ترکيبي ترموستات وساعت 327 ........................................
پروژه چهلوهشتم :مودم 332 ............................................................... GSM
ذ
پروژه چهلونهم :کنترل کننده LCDگرافيکي با قابليت فايل خواني از 341 .......... MMC
پروژه پنجاهم :صفحه لمسي (359 .......................................... )TOUCH SCREEN
پروژه پنجاهويکم :تابلو روان 374 ..................................................................
پروژه پنجاهودوم :منبع تغذيه ديجيتالي 398 ..................................................DC
پروژه پنجاهوسوم :راهاندازي LCDکاراکتري موازي به روش سريال 399 ....................
مراجع 413 ................................................................................................
ر
ميكروكنترلر و واسطهاي جانبي فصل اول
در اين فصل ابتدا به اختصار بهه معرفهي ميکروکنترلهر AVRمهورد اسهتفاده در ايهن
کتاب پرداخته ميشود .سپس انهواع روشههاي برنامههريزي ميکروکنترلرههاي AVR
بيان ميشوند .همچنين روش نصب و کهار بها نرمافهزار CodeVisionآمهوزش داده
ميشود و در پايان ،به منظور آشنايي مقدماتي خوانندگان کتاب ،دستورات الزم زبهان
برنامهنويسي Cبراي کار با ميکروکنترلرها به اختصار توضيح داده خواهند شد.
-1-1-1مقدمه
1
«زبآنهاي سطح باال» به سرعت در حال تبديل شدن به زبان برنامهنويسي استاندارد
براي ميکروکنترلرها ( )MCUهستند .زبان برنامهنويسي Basicو Cبيشترين استفاده
را در برنامهنويسي ميکروکنترلرها دارند ولي در اکثر کاربردها ،کدهاي بيشتري را
نسبت به زبان برنامهنويسي اسمبلي توليد ميکنند .شرکت ATMELبا ايجاد تحولي
در معماري ساخت تراشههاي برنامهپذير ،از معماري RISC2براي ساخت
ميکروکنترلرهاي AVRاستفاده ميکند که اين معماري در مقايسه با معماري CISC
داراي دستورات با اندازه (سايز) ثابت ،رجيسترهاي (ثباتهاي) همه منظوره بيشتر
و دستورات سادهتر و قابل اجرا تنها در يك يا دو پالس ساعت هستند ،ميباشد که
در نهايت منجر به افزايش سرعت اجراي دستورات توسط ميکروکنترلر ميشود.
سرعت اجراي دستورات در ميکروکنترلرهاي AVRدر مقايسه با ميکروکنترلرهاي
8051و PICبه ترتيب 12و 4برابر ميباشند.
تکنولوژي حافظه کم مصرف غير فرار براي برنامهريزي AVRمورد استفاده قرار
گرفته است .در نتيجه حافظههاي FLASHو EEPROMدر داخل مدار قابل
1
برنامهريزي هستند .ميکروکنترلرهاي اوليه AVRداراي 2 ، 1و 8کيلوبايت حافظه
FLASHو به صورت کلمههاي 16بيتي سازماندهي شده بودند AVR .ها به عنوان
ميکروکنترلرهاي RISCبا دستورات فراوان طراحي شدهاند که باعث ميشود حجم
کد توليد شده کم و سرعت باالتري حاصل شود .با انجام دستورات تك سيکلي،
اسيالتور با کال داخلي سيستم يکي ميشود .هيچ تقسيمکنندهاي در داخل AVR
قرار ندارد که منجر به اختالف فاز کال سيستم با سرعت اجراي دستورات شود.
بيشتر ميکروکنترلرها ،فرکانس کال اسيالتور سيستم را بر 4يا 12تقسيم ميکنند
که اين امر منجر به کاهش سرعت اجراي دستورات ميشود .بنابراين AVRها 4تا
12بار سريعتر و توان مصرفي آنها نيز 4تا 12بار نسبت به ميکروکنترلرهاي کنوني
کمتر است .زيرا در تکنولوژي CMOSاستفاده شده در ميکروکنترلر هاي ،AVR
مصرف توان سطح منطقي متناسب با فرکانس است .شکل ( ،)1-1افزايش MIPS1را
به علت انجام عمليات تك سيکلي AVRدر مقايسه با PICو 8051نشان ميدهد.
2
مکاني از حافظه SRAMبراي متغير اشغال ميشود .در صورتي که اگر متغير به
عنوان متغير سراسري تعريف گردد ،در تمام زمان اجراي برنامه مکاني از حافظه
SRAMرا اشغال کرده است .براي دسترسي سريعتر به متغيرهاي محلي و کاهش
کد ،نياز به افزايش رجيسترهاي همه منظوره است AVR .ها داراي 32رجيستر همه
منظوره هستند که مستقيما به «واحد محاسبه و منطق» 1متصل شدهاند و تنها در يك
پالس ساعت به اين واحد دسترسي پيدا ميکنند .سه جفت از اين رجيسترها
ميتوانند به عنوان رجيسترهاي 16بيتي استفاده شوند .نتيجه تمام موارد بيان شده،
اين است که ميکروکنترلرهاي AVRبا سرعت باال و سازماندهي RISCهستند.
ميکروکنترلرهاي AVRبه سه خانواده اصلي Tiny AVR ،AT90S AVRو
Mega AVRتقسيمبندي ميشوند .البته خانواده XMegaنيز توسط شرکت سازنده،
به صنعت معرفي شده است .در اين کتاب براي پيادهسازي بسياري از پروژهها از
ميکروکنترلر ATmega16استفاده شده است و همانطور که از نامش مشخص است
از خانواده Mega AVRميباشد .در ادامه به خالصهاي از خصوصيات و پيکربندي
اين ميکروکنترلر ميپردازيم.
3
يك تايمر/کانتر 16بيتي با مقسم مجزا و داراي حالتهاي تسخير و
مقايسه.
4کانال مدوالسيون عرض پالس (.)PWM
8کانال مبدل آنالوگ به ديجيتال 10بيتي.
يك مقايسه کننده آنالوگ داخلي.
Watchdogقابل برنامهريزي با اسيالتور داخلي.
قابليت ارتباط با پروتکل «سريال دو سيمه» 1و .I2C
قابليت ارتباط سريال SPI2به صورت Masterيا .Slave
USARTسريال قابل برنامهريزي.
خصوصيات ويژه ميکروکنترلر
داراي اسيالتور RCداخلي کاليبره شده.
منابع وقفه 3داخلي و خارجي.
توان مصرفي پايين و سرعت باال توسط تکنولوژي . CMOS
ولتاژ کاري 2.7تا 5.5ولت براي Atmega16Lو 4.5تا 5.5ولت براي
. Atmega16
فرکانسهاي کاري 0تا 8MHzبراي Atmega16Lو 0تا 16MHz
براي . Atmega16
32خط ورودي خروجي قابل برنامه ريزي.
شکل ( )2-1شماي پايههاي ميکروکنترلر Atmega16را نشان ميدهد .همانطور که
در شکل ( )2-1مشاهده ميشود ATmega16داراي چهار پورت C ،B ،Aو D
ميباشد که افزون بر اينکه به عنوان ورودي خروجي مورد استفاده قرار ميگيرند،
کاربردهاي جانبي ديگري نيز دارند .که در فصلهاي بعد به آنها خواهيم پرداخت.
1 TWO-WIRE
2 Serial Peripheral Interface (SPI).
3 Interrupt
4
ATmega16 شکل ( :)2-1شمای پایههای میکروکنترلر
ساخت پروگرمر ISPبا استفاده از کانکتور DB25بسيار ساده است .اتصال مستقيم
ميکروکنترلر به کامپيوتر ،ممکن است باعث ايجاد مشکالت ناشي از جريان کشي
توسط ميکروکنترلر و کامپيوتر شود که در نهايت منجر به سوختن ميکروکنترلر
ميشود .بنابراين ،با استفاده از يك تراشه راهانداز 3به منظور تامين جريان الزم در
هنگام برنامهريزي ميکروکنترلر ،مشکل مذکور برطرف خواهد شد .همچنين به اين
دليل که پورت 4موازى در مقابل اتصال کوتاه و يا اضافه بار چندان مقاوم نيست و
ممکن است با قطع و وصل تغذيهي بورد ،آسيب ببيند .بنابراين ،استفاده از يك بافر
1 Self-Programming
2 In System Programming
3 Driver
4 Port
5
جريان ضروري است .در اين روش ،نميتوان به طور قاطع از برنامهريزي کامالً
مطمئن ميکرو صحبت کرد.
مدار واسط STK200/300به منظور برنامهريزي ميکروکنترولر به روش ISP
استفاده شده است که مطابق شکل ( )4-1ميباشد .تراشه 74ALS244به عنوان بافر
جريان ،جهت حفاظت از پورتهاي ميکروکنترلر و کامپيوتر استفاده شده است .شما
ميتوانيد مطابق نقشه شکل ( )4-1مدار پروگرمر را بسازيد و يا آن را از
فروشگاههاي الکترونيکي تهيه نمائيد .شايان ذکر است که صحت عملکرد صحيح
مدار زير تائيد ميشود.
VCC
1
1
4
2
7
2
R
1
ATmega32
1
5
1
0
0
K
2
6
3
1
4
0
)(XCK/T0
PB0
)(ADC0
PA0
1
6
2
3
9
)(T1
PB1
)(ADC1
PA1
4
3
3
8
)(AIN0/INT2
PB2
)(ADC2
PA2
1
7
74ALS244
VCC
4
3
7
)(AIN1/OC0
PB3
)(ADC3
PA3
5
1
2
0
5
3
6
OE1
VCC
)(SS
PB4
)(ADC4
PA4
1
8
1
9
6
3
5
OE2
)(MOSI
PB5
)(ADC5
PA5
6
7
3
4
)(MISO
PB6
)(ADC6
PA6
1
9
2
1
8
8
3
3
A
1
Y
1
)(SCK
PB7
)(ADC7
PA7
7
4
1
6
A
2
Y
2
2
0
6
1
4
1
4
2
2
A
3
Y
3
)(RXD
PD0
)(SCL
PC0
8
8
1
2
1
5
2
3
A
4
Y
4
)(TXD
PD1
)(SDA
PC1
2
1
1
1
9
1
6
2
4
A
5
Y
5
)(INT0
PD2
)(TCK
PC2
9
1
3
7
1
7
2
5
A
6
Y
6
)(INT1
PD3
)(TMS
PC3
2
2
1
5
5
1
8
2
6
A
7
Y
7
)(OC1B
PD4
)(TDO
PC4
1
0
1
7
3
1
9
2
7
A
8
Y
8
)(OC1A
PD5
)(TDI
PC5
2
3
2
0
2
8
)(ICP
PD6
)(TOSC1
PC6
1
1
1
0
2
1
2
9
G
N
D
G
N
D
)(OC2
PD7
)(TOSC2
PC7
2
4
1
2
9
1
0
RESET
VCC
VCC
2
5
3
0
AVCC
1
3
3
2
C
1
AREF
1
2
XTAL2
G
N
D
1
3
3
1
25
Connector
DB
XTAL1
G
N
D
2
2
p
F
1
1
G
N
D
2
G
N
D
XTAL
G
N
D
C
2
2
2
p
F
1
STK200/300 شکل ( :)4-1پروگرامر
-1-3-1مقدمه
براي کار با ميکروکنترلرهاي AVRبايد برنامهاي به يکي از زبآنهاي C ،Assembly
يا Basicدر محيط نرم افزار مربوط به آن نوشت .سپس آن را کامپايل نمود .کامپايل
نمودن برنامه :عملي است که در آن ،برنامه از زبان نوشتاري به زبان صفر و يك که
توسط ميکروکنترلر قابل فهم باشد ،تبديل ميشود .در صورتي که برنامه هيچ
6
خطايي ،شامل :خطاي اماليي ،ساختاري و نظاير آن را نداشته باشد به درستي
کامپايل شده و يك فايل به زبان صفر و يك (زبان ماشين) توسط کامپايلر توليد
ميشود .پسوند فايلهايي که حاوي برنامه به زبان ماشين هستند HEX ،ميباشد.
اکنون براي انتقال فايل HEXايجاد شده به درون آيسي ،نيازمند يك دستگاه جانبي
يا واسط سخت افزاري هستيم که کامپيوتر را به تراشه ميکروکنترلر متصل کند و
فايل HEXمربوطه را از کامپيوتر بر روي ميکروکنترلر بارگذاري نمايد .اين واسط
سخت افزاري ،اصطالحاً پروگرمر ناميده ميشود .پس از برنامهريزي کردن (پروگرم
کردن) ،ميکروکنترلر را از پروگرمر جدا کرده و در مدار مورد نظر قرار داده (و يا اگر
پروگرمر ساخته شده مطابق شکل ( )4-1باشد بدون جدا نمون ميکروکنترلر از مدار
به برنامهريزي آن اقدام ميکنيم) .پس از آن ،عملکرد سخت افزاري آنرا بررسي
ميکنيم.
در اين قسمت ،نرم افزار CodeVisionAVRکه يکي از کامپايلرهاي قوي براي
برنامهنويسي به زبان Cميباشد ،معرفي ميشود .افزون بر اين ،روش نصب و
قسمتهاي مختلف آن نيز آموزش داده ميشود.
7
-3-3-1روش نصب نرمافزار CodevisionAVR
ابتدا با مراجعه به ( CDکه همراه با کتاب عرضه ميشود) فايل مربوط به نرم افزار
CodeVisionAVRرا باز کنيد و با اجراي فايل setup.exeمراحل نصب را مطابق
شکلهاي زير تا پايان ادامه دهيد.
-2با انتخاب مسير مناسب جهت نصب نرمافزار بر روي گزينه Nextکليك نمائيد.
8
-3بر روي گزينه Nextکليك نمائيد.
9
از پنجره ظاهر شده شماره سريال را يادداشت نمائيد و در مرحله بعد وارد
نمائيد.
-6فايل License Generator.exeرا از مسير دايرکتوري اصلي برنامه ،اجرا
نمائيد .اکنون با وارد کردن يك نام دلخواه در قسمت ،User nameو در
قسمت ،Serial numberشماره سريال مرحلهي 5را وارد کرده و دکمهي
Generateرا فشار دهيد و فايل توليد شده با پسوند .datرا در مسير
دلخواه ذخيره نمائيد.
10
CodeWizardAVR شکل ( :)6-1انتخاب
-1-3با کليك بر روي گزينه ،Yesمطابق شکل ( )6-1محيط ويزارد مطابق شکل
( )7-1باز ميشود و توسط اين محيط ميتوان با استفاده از سربرگهاي موجود ،با
انتخاب ميکروکنترلر مورد نظر ،رجيسترهاي آن را بهصورت اوليه مقداردهي نمود.
پس از اتمام مقدار دهي اوليه ،با انتخاب گزينه Fileاز منوي مربوطه ،مطابق شکل
( ،)8-1بر روي گزينه Generate, Save and Exitکليك کرده و با انتخاب يك نام
براي آن ،پروژه مورد نظر را ايجاد نمائيد تا شکل ( )9-1ظاهر شود .اکنون برنامه
شما به صورت اوليه مقدار دهي شده است.
11
شکل ( :)8-1ذخیرهسازی و تولید کد.
-2-3با کليك بر روي گزينه Noدر شکل ( )6-1پنجره زير جهت ذخيره پروژه
ظاهر ميشود .پس از انتخاب يك نام براي پروژه مورد نظر ،بر روي گزينه Save
کليك نمائيد.
12
شکل ( :)10-1انتخاب یک نام جهت ذخیره پروژه
-1-2-3پس از ذخيره پروژه ،شکل ( )11-1ظاهر ميشود که داراي سه سربرگ
C Compiler ،Fileو After Makeميباشد .با انتخاب سربرگ C Compiler
ميکروکنترلر و فرکانس کريستال آن را انتخاب نمائيد .به عنوان مثال ،در شکل (-1
)12ميکروکنترلر ATmega32و کريستال 4مگاهرتز انتخاب شده است (ساير
سربرگها در قسمتهاي مربوطه به تفصيل توضيح داده ميشوند) .حال ،بر روي
گزينه OKکليك نمائيد تا پروژه ايجاد شود.
13
اين فايل .cاست .يعني محيطي جهت برنامهنويسي به زبان Cايجاد شده است.
اکنون ،از منوي باالي صفحه ،بر روي گزينه Projectو سپس بر روي Configure
کليك نمائيد تا مجدداً شکل ( )11-1ظاهر شود .سپس از سربرگ Filesبر روي
گزينه Addکليك نمائيد و فايل ايجاد شده با پسوند .cرا به پروژه اضافه نمائيد و بر
روي گزينه OKکليك نمائيد .اکنون پروژه مورد نظر ،ايجاد شده است.
-1-4-1ساختار برنامهنویسی
به منظور برنامهنويسي به زبان ،Cآشنايي اوليه با دستورات آن الزامي است .براي اين
منظور :با معرفي مختصر ساختارها و دستورات مرتبط ،مطابق زير با يك برنامه ساده
شروع ميکنيم.
>#include <stdio.h
{ )(int main
;)"printf("Hello World\n
;return 0
}
شرح برنامه:
> : #include <stdio.hفايلي به اسم stdio.hرا ضميمه ميکند که اين فايل به ما
اجازه استفاده از توابع خاصي را ميدهد stdio .کوتاه شدهي عبارت Standard
Input/Outputاست .اين فايل شامل توابع ورودي :مانند خواندن از صفحه کليد و
توابع خروجي :مانند نمايش دادن بر روي صفحه نمايش است.
14
} { (آکالدها) براي اين است که تمام نوشتهها را در يك گروه خاص قرار دهد .در
مثال باال ،آکالد مشخص ميکند که نوشتهها متعلق به تابع mainاست .شايان ذکر
است که آکالدها در زبان Cکاربرد زيادي دارند.
: return 0مقدار آرگومان برگشتي توسط دستور returnمشخص ميشود وreturn 0
به معني آن است که تابع ما مقدار صفر را باز ميگرداند.
پس از کامپايل نمودن برنامه ،اگر کدهاي شما اشتباه باشند ،کامپايلر به شما
ميگويد که اشتباه در کدام خط رخ داده است .به منظور اجراي صحيح برنامه،
اصالح خطا شامل :خطاي اماليي و ساختاري الزامي است .پس از کامپايل صحيح،
برنامهي شما تبديل به فايل اجرايي ميشود .اکنون بايد عبارت " "Hello Worldرا
در صفحه مالحظه کنيد.
15
استفاده از توضيحات ( : )commentsبراي تشخيص بهتر هر يك از خطوط برنامه،
استفاده از commentدر جلوي خطوط پيشنهاد ميشود .توضيحات را بايد بعد از //
يا بين /*………*/بنويسيد .توضيحات توسط کامپايلر خوانده نميشوند.
توضيحات استفاده شده در اول برنامه عملکرد برنامه را نشان ميدهند .شما همچنين
ميتوانيد :بين قسمتهاي مختلف برنامه از توضيحات استفاده کنيد تا آن قسمت را
توضيح دهيد در ذيل ،مثالي از قرار دادن توضيح قرار داده شده است:
/* Author: Hamed Saghaei
Date: 2009/07/15
Description:
Writes the words "Hello World" on the screen */
>#include <stdio.h
)(int main
{
;)"printf("Hello World\n "//prints "Hello World
;return 0
}
-2-4-1متغیرها
متغيرها در زبان برنامهنويسي ،Cمکاني از حافظه هستند که نامي به آنها تخصيص
داده ميشود و ميتوانند مقداري را در بر داشته باشند .از متغيرها براي ذخيره کردن
مقادير در حافظه استفاده ميشود .دو نوع متغير اصلي در زبان Cوجود دارد که به
ترتيب (عدد) Numericو(حروف) Characterميباشند.
-متغيرهاي عددي :اين نوع متغيرها ميتوانند عدد صحيح باشند و اعداد کسري يا
اعشاري نميتوانند در اين گروه قرار بگيرند.
-متغيرهاي کاراکتري :در اين نوع متغيرها :حروف و اعداد ميتوانند قرار بگيرند.
البته اعداد در اينجا کمي متفاوت هستند.
-عبارات عددي و رشتهاي ثابت :اين نوع عبارات ثابت هستند و مقدار آنها قابل
تغيير نيست .گاهي براي جلوگيري از اشتباه از آنها استفاده ميشود.
تعريف متغيرها :براي تعريف متغير در برنامه ابتدا نوع آن را بايد مشخص کنيم در
جدول ( )2-1نوع متغيرها و محدودهي آنها مشخص شده است .البته متغيرها را به
هر نحوي که مايل باشيد ميتوانيد نام گذاري کنيد .ولي بهتر است کمتر از 32حرف
داشته باشند و در ابتداي برنامه تعريف شوند.
16
جدول ( :)2-1انواع داده
محدوده نوع نام
از 0و 1 يك بيت bit
از -128تا 127 هشت بيت char
از 0تا 255 هشت بيت بدون عالمت unsigned char
از -32767تا 32768 اعداد صحيح 16بيتي int
از 0تا 65535 اعداد صحيح بدون unsigned int
عالمت 16بيتي
از -217483648تا اعداد صحيح 32بيتي long int
217483647
)(int main
{
;int a
;char b
;return 0
}
در عبارت باال :متغير aاز نوع intو متغير bاز نوع charتعريف شدهاند .و مطابق زير
برنامه ذيل ميتوان در يك مکان ،چندين متغير را تعريف کرد.
)(int main
{
;int a, b, c
;return 0
}
17
با توجه به اينکه تابع ،mainتابع اصلي برنامه است .بنابراين بازگشت مقادير توسط
اين تابع صحيح نميباشد .در ادامه به جاي تعريف آن به روش مثالهاي قبل ،به
صورت زير تعريف ميشود .همچنين براي تعريف متغيرهاي ( Constantثابت) تنها
الزم است :عبارت constرا قبل از نوع متغير قرار داد.
)(void main
{
;const float pi = 3.1415
}
-متغيرهاي عالمتدار و بدون عالمت:
متغيرهاي عالمتدار ( )signedميتوانند داراي مقادير مثبت يا منفي باشند ولي
متغيرهاي بدون عالمت ( ،)unsignedتنها ميتوانند مقادير مثبت و صفر را اختيار
کنند .اين عبارات ،قبل از نوع متغير تعريف ميشوند و نبود آن دليل بر عالمتدار
بودن ( )Signedمتغير است.
)(void main
{
;unsigned int a
;signed int b
}
-استفاده از متغير در محاسبات:
براي دادن مقداري به متغير از عالمت تساوي (=) استفاده ميشود.
)(void main
{
int a=4; // a=4
char b; // b=0
;a = 3 // a=3
'b = 'H'; // b='H
}
به منظور انجام محاسبات از عملگرهاي محاسباتي زير استفاده ميشود.
18
جدول ( :)3-1عملگرهای محاسباتی
عمگر عمليات
+ جمع
- تفريق
* ضرب
/ تقسيم
% باقيمانده
براي انجام عمليات به متغيري نياز داريم که حاصل عمليات در آن ذخيره شود.
)(void main
{
;int a, b
;a = 5
b = a + 3; // b=8
a = a % 3; // a=2
}
در زبان برنامهنويسي ،Cميتوان متغيري از keyboardرا با استفاده از دستور scanf
گرفت و توسط printfآن را چاپ کرد.
>#include <stdio.h
)(void main
{
;int a
;)scanf("%d", &a
;a = a * 2
;)printf("The answer is %d", a
}
d%براي خواندن و چاپ کردن متغيرها از نوع intاستفاده ميشود و ساير متغيرها
مطابق جدول زير هستند.
جدول ( :)4-1خواندن و چاپ متغیرها
%d or %i int
%c char
%f float
%lf double
%s string
19
-3-4-1دستور If
در بيشتر مواقع الزم است که مقدار متغيري در برنامه کنترل شود .براي اين منظور
استفاده از حلقه Ifبه حل مساله کمك ميکند.
-ساختار کلي دستور If
)شرط( if
{
;دستورات
}
)شرط( else if
{
;دستورات
}
else
{
;دستورات
}
>#include <stdio.h
)(void main
{
;int mark
;char pass
;)scanf("%d", &mark
)if (mark > 40
;'pass = 'y
}
در برنامه باال ابتدا متغيري از ورودي گرفته ميشود و سپس شرط 40 > mark
امتحان ميشود .اگر پاسخ مثبت بود ،حرف Yدر متغير passقرار داده ميشود.
>#include <stdio.h
)(void main
{
;int mark
;char pass
;)scanf("%d", &mark
)if (mark > 40
20
;'pass = 'y
else
;'pass = 'n
}
در برنامه باال ابتدا متغيري از ورودي گرفته ميشود و سپس شرط 40 > mark
امتحان ميشود .اگر پاسخ مثبت بود ،حرف Yدر متغير passقرار ميگيرد ،در غير
اين صورت حرف nدر passقرار داده ميشود.
در صورتي که در برنامه ،اجراي چند دستور پس از امتحان شرط نياز داشت ،ميبايد
مطابق زير برنامه ذيل ،دستورات را درون { } قرار دهيم.
>#include <stdio.h
)(void main
{
;int mark
;char pass
;)scanf("%d", &mark
)if (mark > 40
{
;'pass = 'y
;)"printf("You passed
}
else
{
;'pass = 'n
;)"printf("You failed
}
}
همچنين ميتوان در هر دستور ifچند شرط را امتحان نمود:
>#include<stdio.h
)(void main
{
;int a, b
;)scanf("%d", &a
;)scanf("%d", &b
)if (a > 0 && b > 0
;)"printf("Both numbers are positive\n
)if (a = 0 || b = 0
{
;)"printf("At least one of the numbers = 0\n
21
;a++
}
))if (!(a > 0) && !(b > 0
;)"printf("Both numbers are negative\n
}
-عملگرهاي منطقي:
جدول ( :)5-1عملگرهای منطقی
== مساوي
!= نا مساوي
> بزرگتر از
>= بزرگتر يا مساوي
< کوچکتر از
<= کوچکتر يا مساوي
&& و
|| يا
! نقيض
22
default:
;دستور
}
#include <stdio.h>
void main()
{
char fruit;
printf("Which one is your favourite fruit:\n");
printf("a) Apples\n");
printf("b) Bananas\n");
printf("c) Cherries\n");
scanf("%c", &fruit);
switch (fruit) {
case 'a':
printf("You like apples\n");
break;
case 'b':
printf("You like bananas\n");
break;
case 'c':
printf("You like cherries\n");
break;
default:
printf("You entered an invalid choice\n");
}
}
کنترل ميکنيم اگرcase متغير برنامه است که آن را با استفاده ازfruit :در برنامه باال
beak در خروجي چاپ ميشود سپس از دستورYou like apples متن، بودa برابر
استفاده شده است که باعث خروج از حلقه ميشود در نهايت اگر با هيچيك از
چاپYou entered an invalid choice متنdefault متغيرها برابر نبود با استفاده از
.ميشود
دستورات حلقه-5-4-1
براي اين کار از.در برخي مواقع الزم است دستوري به صورت متوالي اجرا شود
:دستورات حلقه استفاده ميشود که به سه دسته تقسيم ميشوند
for, do while, while:
23
-ساختار for
)عدد شروع ;شرط ;اضافه شدن متغير( for
{
; دستورات
}
forاجازه ميدهد از عددي تا عدد ديگر تکرار داشته باشيم .در برنامه زير اعدد 1تا
24در خروجي چاپ ميشوند.
)(void main
{
;int i
)for (i = 1; i == 24; i++
;)"printf("H\n
;return 0
}
در مثال باال از i++استفاده کرديم که برابر است با i=i+1يعني در هر بار اجرا ،يك
واحد به iاضافه ميشود يا ميتوان از i--استفاده کرد که هر بار اجرا ،يك واحد از i
کم ميشود.
-ساختار while
)while(condition
{
; دستورات
}
تفاوت اين حلقه با قبلي در اين است که ما نميدانيم قرار است چند بار حلقه اجرا
شود در مثال زير تعداد اجرا شدن حلقه از ورودي گرفته ميشود در timesذخيره و
در هر بار اجرا شدن حلقه يك واحد به iافزوده ميشود تا زماني که به تعداد times
برسد از حلقه خارج شده و برنامه تمام ميشود.
>include <stdio.h
)(void main
{
;int i, times
;)scanf("%d", ×
;i = 0
)while (i <= times
{
24
i++;
printf("%d\n", i);
}
}
do while ساختار -
است با اين تفاوت که شرط آن در آخر امتحانwhile مانندdo while ساختار
.ميشود
do {
; دستورات
}
while(Condition)
#include <stdio.h>
void main()
{
int i, times;
scanf("%d", ×);
i = 0;
do
{
i++;
printf("%d\n", i);
}
while (i <= times);
25
-6-4-1اشارهگرها
اشارهگر 1متغيرهايي هستند که درون خود آدرسي از حافظه را نگهداري ميکنند و به
متغير درون آن آدرس ،اشاره ميکنند به اين دليل به آنها اشارهگر ميگويند .شما
ميتوانيد از اشارهگرها براي کارهاي خاصي استفاده کنيد .مثالً براي گرفتن مقدار
آدرسي که به آن اشاره ميکند .اشارهگرها ميتوانند مشخص يا نامشخص باشند.
اشارهگرهاي مشخص به يك متغير مشخص مثالً intاشاره ميکنند ،و اشارهگرهاي
نامشخص ميتوانند به انواع اطالعات اشاره کنند .براي اينکه شما عبارت يا
کاراکتري را به عنوان اشارهگر مشخص کنيد بايد يك * قبل از اسم آن بگذاريد ،در
اينجا مثالي از اشارهگر آورده شده است.
)(void main
{
;int *p
;void *up
}
شما ميتوانيد آدرس يك intرا درون يك اشارهگر قرار دهيد و اشارهگر با استفاده
از عالمت & آدرس intرا ميگيرد.
)(void main
{
;int i
;int *p
;i = 5
;p = &i
;return 0
}
شما ميتوانيد به مقدار intکه اشارهگر به آن اشاره کرده دسترسي داشته باشيد.
* باعث ميشود که اشارهگر دوباره بازگشت داده شود ،يعني در واقع همان متغير
ميشود و تغيير در آن به منزلهي تغيير در متغير است.
)(void main
{
;int i, j
;int *p
;i = 5
;p = &i
j = *p; //j = i
*p = 7; //i = 7
1 Pointer
26
;return 0
}
استفاده از اشارهگر براي بيان i=jدر باال راهي طوالني است .شما در ادامه با
کاربردهاي بيشتر اشارهگرها آشنا خواهيد شد ولي در اين قسمت ،هدف آشنايي
مقدماتي با اين مبحث است.
-7-4-1آرایهها
اگر شما ميخواستيد 5متغير داشته باشيد ،مانند زير عمل ميکرديد:
;int i1, i2, i3, i4, i5
حال اگر 1000متغير بود چه ميکرديد؟ مسلم ًا فرايند باال زمان زيادي ميبرد ،ولي با
استفاده از آرايه ميتوانيد :با نام يك متغير ،هر تعداد که بخواهيد متغير بسازيد .آرايه
مانند متغير معمولي است و براي تعريف آن کافي است فقط بعد از نام آن يك جفت
براکت بياوريد و درون آن تعداد متغير مورد نظر را بنويسيد .مثال:
]int a[5
براي اينکه به مق دار متغيرهاي هر خانه دست يابيد شما بايد نام آرايه و سپس
شمارهي خانهي مورد نظر را بياوريد .فقط به ياد داشته باشيد که شمارهي خانههاي
آرايه از صفر شروع ميشود .براي مثال يك آرايه به طول 5داراي خانههايي از
شمارهي 0تا 4است.
;]int a[5
;a[0] = 12; a[1] = 23
;a[2] = 34; a[3] = 45
;a[4] = 56
;)]printf("%d",a[0
-استفاده از آرایه با حلقه
استفاده از آرايه در حلقه کاربرد زيادي دارد .زيرا خانههاي آرايه يك دنباله را طي
ميکنند که اين فرايند مشابه حلقهها است .براي مثال :وقتي خانههاي آرايه صفر
نشدهاند و شما ني از داريد که مقدار آن ها را صفر کنيد بايد مانند زير از حلقه استفاده
کنيد:
;]int a[10
;for (i = 0;i < 10;i++) a[i] = 0
-آرایههای چند بعدی
آرايههايي که ما قبالً استفاده کرديم آرايههاي يك بعدي نام دارند زيرا تنها از يك
سطر تشکيل شدهاند .آرايههاي 2بعدي از چند سطر و ستون تشکيل شدهاند ،در
براي تسلط بيشتر بر موضوع شکل ( )13-1را مالحظه نمائيد.
27
آرایههای یک بعدی
مقدار شماره سطر
0 4
1 3
2 -1
آرایه ی دو بعدی
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
شکل ( :)13-1آرایههای چند بعدی
شما ميتوانيد از آرايههاي سه بعدي يا بيشتر نيز استفاده کنيد ولي اغلب کاربردي
ندارند .در ادامه برنامهاي آورده شده که شما را با روش تعريف يك آرايهي دو
بعدي و چگونه کار کردن آن آشنا ميکند .توجه داشته باشيد که مثال داراي 2حلقه
است زيرا مي خواهيم مقدار متغيرهاي درون سطر و ستون هاي مختلف را تغيير
دهيم.
28
شما بايد مقدار هر خانهي آرايه را به کاراکتر مورد نظر خود اختصاص ،و کاراکتر
پاياني خود را 0قرار دهيد .به ياد داشته باشيد که براي اشاره کردن به يك رشته بايد
از %sاستفاده کنيد.
;]char ca[10
;'ca[0] = 'H'; ca[1] = 'e
;'ca[2] = 'l'; ca[3] = 'l
;ca[4] = 'o'; ca[5] = 0
;)printf("%s", ca
وقتي که شما يك مقدار خاص را به يك اشارهگر رشته نسبت ميدهيد کامپايلر يك
صفر در انتهاي آن قرار ميدهد و ديگر نيازي نيست تا مانند آرايه کاراکتري 0 ،را در
انتهاي آن قرار دهيد.
;char ca[10], *sp
;)scanf("%s", ca
;sp = ca
;)scanf("%s", sp
29
بودند تابع مقدار عددي صفر را برگشت ميدهد و اگر رشته اول کوچکتر از رشتهي
دوم بود تابع عددي منفي را برگشت ميدهد.
;"s1 = "abc
;"s2 = "abc
i = strcmp(s1, s2); // i = 0
)رشته(strlen
اين تابع تعداد کاراکترهاي رشته را بازگشت ميدهد.
;"s = "abcde
i = strlen(s); // i = 5
-9-4-1توابع
توابع 1در واقع ،زير برنامه ميباشند .شما قبال از توابع استفاده کرديد ،منظور همان
تابع mainاست .شما قبل از اينکه يك تابع را فراخواني کنيد بايد آن را در ابتداي
برنامه و قبل از mainتعريف کنيد .در مورد هر تابع ميبايد نوع returnمشخص
شود (يعني نوع آرگومان برگشتي تابع مشخص شود مثال از نوع intاست يا از نوع
charيا نظاير آن) .در صورتي که نميخواهيد مقدار خاصي را returnکنيد از void
استفا ده کنيد .بعد اسم منحصر به فرد تابع را بنويسيد و پس از آن يك جفت پرانتز
قرار دهيد .در صورتي که تابع شما آرگومان ورودي دارد با مشخص کردن نوع و
تعداد آرگومآنها ،آنها را درون پرانتز جلوي اسم تابع قرار دهيد و در صورتي که
تابع شما آرگومان ورودي ندارد درون پرانتز عبارت voidرا نوشته يا آن را خالي
باقي بگذاريد .در آخر نيز دو عدد } { بگذاريد و برنامه ي خود درون آن بنويسيد.
تابع تعريف شده در مثال زير را بررسي نمائيد:
>#include <stdio.h
)(void Hello
{
;)"printf("Hello\n
}
)(void main
{
;)(Hello
}
پارامتر هاي تابع ،مقاديري هستند که ما به يك تابع ميدهيم تا بتواند آنها را محاسبه
کند .شما بايد در داخل پرانتز هاي پارامتر ،متغيرها را بياوريد تا مقدار پارامتر را که
1 Functions
30
قابل قبول است در تابع قرار دهد .دراينجا ما Function Addکه دو پارامتر را با هم
جمع مي کند آورده شده است:
>#include<stdio.h
)int Add(int a, int b
{
;return a+ b
}
)(void main
{
;int answer
;)answer = Add(5, 7
}
شما ميتوانيد آدرس متغير را در يك تابع قرار دهيد ،در اينجا کپي صورت نميگيرد
و شما نياز به اشارهگر داريد.
>#include<stdio.h
)(int main
{
;int answer
;int num1 = 5
;int num2 = 7
;)answer = Add(&num1, &num2
;)printf("%d\n", answer
;return 0
}
-10-4-1متغیرهای سراسری و محلی
متغيرهاي محلي 1فقط در داخل يك تابع قابل استفاده هستند و بيرون از آن نميشود
از اين نوع متغيرها استفاده کرد .اگر شما نياز داريد که بتوانيد از يك متغير در تمامي
قسمتهاي برنامه استفاده کنيد ،بايد آن را سراسري 2تعريف کنيد.
>#include<stdio.h
1 Local
2 Global
31
int a; // Global variables
int b; // Global variables
int Add()
{
return a + b;
}
int main() {
int answer; // Local variable
a = 5;
b = 7;
answer = Add();
printf("%d\n", answer);
return 0;
}
32
آشنايي با پورتها فصل دوم
با توجه به اينکه اين کتاب با عنوان پروژههاي کاربردي با استفاده از ميکروکنترلر
AVRاست ،فرض بر آن است که خوانندگان کتاب از آشنايي مقدماتي با
ميکروکنترلرهاي AVRبرخوردار هستند .بر مبناي اين فرض ،جزئيات بيشتر در
رابطه با معماري ساخت اين تراشهها و انواع خانوادههاي آنها بحث نخواهند شد.
در صورت تمايل به يادگيري بيشتر ميتوانيد به مراجع آخر کتاب مراجعه نمائيد.
در اين فصل ،کار با پورتهاي موازي ميکروکنترلر AVRبه صورت پروژههاي
کاربردي آموزش داده ميشود .دقت شود :کليه برنامهها به زبان برنامهنويسي Cو در
محيط نرمافزار CodeVisionAVRنوشته و کامپايل ميشوند .سپس توسط نرم افزار
Proteusشبيهسازي شده و با اجراي آنها ،صحت برنامههاي نوشته شده ،آزمايش و
تائيد ميشود.
33
-1رجيستر : DDRXاين رجيستر براي تنظيم جهت ورودي يا خروجي پايه
استفاده ميشود .به اين ترتيب که :اگر بيتي در رجيستر DDRXيك شده باشد،
پين متناظر با آن در حالت خروجي و با مقدار صفر در حالت ورودي قرار
ميگيرد .که مطابق جدول ( )1-2است.
-2رجيستر : PORTXاگر DDRX.pin=1باشد (پايه در حالت خرجي باشد) اين
رجيستر براي نوشتن يك مقدار منطقي در پين استفاده ميشود و اگر
DDRX.pin=0باشد (پايه در حالت ورودي باشد) براي تنظيم امپدانس پايه به
کار ميرود .که مطابق جدول ( )1-2است.
جدول ( :)1-2وضعیت پایهها بر اساس محتوای رجیسترهای متناظر
1 ""1
0 0 Tri State
1 ( Pull-upباالکش)
در حالت ،Tristateامپدانس پايهي مورد نظر بي نهايت شده و ارتباط بين
پايه و مدار داخلي پورت قطع ميگردد.
در حالت ،Pull-upپين مورد نظر با يك مقاومت باالکش داخلي به Vcc
متصل ميگردد .اين حالت ورودي براي اتصال مدارهايي که خروجي سه
حالته دارند به پايه ورودي ميکروکنترلر مناسب است.
-3رجيستر : PINXاين رجيستر ،تنها يك رجيستر خواندني است که مقدار منطقي
روي پايهها را مستقل از اين که در حالت ورودي يا خروجي پيکربندي شده
باشند ،نشان ميدهد.
حداکثر جرياني که هر پين در حالت خروجي تامين ميکند به اندازهي
است که بتواند يك LEDرا روشن نمايد .به همين دليل ،ميتوان LEDها
را مستقيماً به پايههاي مورد نظر از ميکروکنترلر متصل نمود (جرياني به
اندازهي 40mAدر ولتاژ تغذيهي پنج ولتي و جريان 20mAدر ولتاژ
تغذيهي سه ولتي).
34
با فعالسازي بيت ( PUDيعني نوشتن يك در بيت )PUDدر رجيستر
SFIORميتوان مقاومتهاي باالکش کليه پورتها را غير فعال نمود.
در نرمافزار CodevisionAVRبايد رجيستر ها با حروف بزرگ نوشته
شوند.
ابتدا کليه مراحل الزم را به منظور ايجاد يك پروژه بدون استفاده از ويزارد انجام
دهيد ،سپس درمحيط ايجاد شده ،برنامهاي مطابق زير بنويسيد:
برنامه:
>#include <mega16.h
>#include <delay.h
)void main(void
;{DDRB.0=1
;PORTB.0=0
)while (1
{
;PORTB.0=1
;)delay_ms(1000
;PORTB.0=0
;)delay_ms(1000
};}
شرح برنامه :همانطور که مشاهده ميشود ابتدا کتابخانه مربوط به ميکروکنترلر
) AVRکه در اينجا ATmega16است( و کتابخانه تاخير ،در ابتداي برنامه قرار
داده شدهاند .با استفاده از DDRB.0=1پين صفرم از پورت Bبه عنوان خروجي
و توسط PORTB.0=0با مقدار صفر مقداردهي اوليه شده است .پس از اجراي
برنامه ،دستورات درون حلقه whileبراي هميشه تکرار ميشوند .به اين صورت
که :ابتدا PORTB.0يك و پس از يك ثانيه صفر ميشود و دوباره پس از يك
ثانيه يك ميشود .در صورتي که پايه مثبت (آند) يك LEDبه PORTB.0
ميکرو متصل و پايه منفي (کاتد) LEDبه زمين وصل شود اين LEDبهصورت
متناوب و با تاخير يك ثانيه روشن و خاموش ميشود.
کامپايل و برنامهريزي تراشه :پس از اتمام نوشتن برنامه بر روي گزينه Compile
and Makeکليك کرده يا کليدهاي Shiftو F9را به صورت همزمان فشار
داده تا فايل Hexآن توليد شود .پنجرهاي مطابق شکل ( )1-2ظاهر ميشود که
وضعيت عمل کامپايل و ساخت فايل Hexرا نشان ميدهد و در صورتي که
برنامه اشکالي (اماليي ،ساختاري و نظاير آن) نداشته باشد ،عبارت No errors
در آن ظاهر ميشود .اکنون که برنامه به درستي کامپايل و فايل Hexساخته
35
شده است ،ميبايد فايل Hexبه ميکروکنترولر انتقال يابد (ميکروکنترولر پروگرم
شود) .با توجه به پروگرمر ساخته شده در فصل اول ،که از نوع STK200/300
است ،در محيط CodeVisionAVRاز گزينهي Settingبر روي Programmer
کليك کرده تا پنجرهي شکل ( )2-2ظاهر شود و از AVR programmer
گزينهي STK 200/300را انتخاب کرده و دکمهي OKرا فشار داده تا پروگرمر
مورد نظر انتخاب شود.
36
اکنون ،نوبت پروگرم نمودن ميکروکنترلر است .مطابق شکل ( )4-1از فصل
اول ،ميکروکنترولر را به پروگرمر متصل نموده و منبع تغذيه را روشن نمائيد .با
فشردن همزمان کليدهاي Shiftو F4پنجرهاي مطابق شکل ( )3-2ظاهر
ميشود ،فيوز بيتها را براي نوسان ساز داخلي 4مگاهرتز و ساير قسمتها را
مطابق شکل ( )3-2تنظيم و سپس بر روي Program Allکليك نمائيد تا
ميکروکنترلر مورد نظر ،برنامهريزي شود .به منظور آشنايي کامل با قسمتهاي
مختلف نرمافزار ،همچنين روش دقيق برنامه ريزي ميکروکنترلر به CDهمراه
کتاب مراجعه شود.
تمرين :برنامه زير ،برنامه يك فالشر است :ابتدا آن را تحليل و سپس در محيط
Codevisionبنويسيد و اجراي آن را توسط نرمافزار Proteusمشاهده نمائيد؟
>#include <mega16.h
>#include <delay.h
#define xtal 4000000
;int i
)void main (void
;{DDRD = 0xFF
)while(1
37
){ for(i = 1; i <= 128; i = i*2
};){PORTD = i;delay_ms(100
)for(i = 128; i > 1; i = i/2
};){PORTD = i;delay_ms(100
}
}
پروژه دوم :كنترل چراغ راهنمايي با نمايش مدت انتظار
بدون استفاده از وقفهها و تايمرهاي ميکروکنترلر ،برنامهاي بنويسيد که چراغهاي
راهنمايي دو زمانه يك چهار راه را کنترل کند و با پيشنهاد يك روش بهينه به
منظور استفاده از پايههاي ميکروکنترلر برنامه دو شمارنده معکوس شمار دو
رقمي را براي دو سمت چهار راه بنويسيد؟
فرضيات پروژه :ميکروکنترلر مورد نظر ATmega16است و از کريستال داخلي
4مگاهرتز استفاده شده است .براي اين منظور 6عدد LEDبه پايههاي پورت
Dميکروکنترلر مطابق جدول ( )2-2متصل شدهاند .وضعيت رنگ دو چراغ
نسبت به هم مانند شکل ( )4-2است .يك شستي تغيير وضعيت ()Toggle
براي اين چراغ الزم است که مامور راهنمايي و رانندگي بتواند با هر بار فشردن
آن وضعيت چراغها را به طور همزمان عوض کند.
38
شکل ( :)4-2وضعیت و مدت زمان روشن و خاموش بودن چراغهای راهنما
براي اين کار ،شستي متصل به پايهي PD3درنظر گرفته شده است .با فشردن اين
شستي ،تنها در زماني که يکي از چراغها سبز و ديگري قرمز است ،بايد باعث شود
که :چراغي که سبز است ،سه ثانيه نارنجي و سپس قرمز شود و چراغي که قرمز
است ،چهار ثانيه بعد سبز شود.
راهنمايي :در هر بار پايان يافتن کوچکترين حلقهاي که براي ساختن زمآنها
نوشتهايد ،وضعيت کليد را چك کنيد .دقت کنيد که فاصلهي بين دوبار چك
کردن اين وضعيت در صورت فشرده نشدن در حدود چند ميلي ثانيه و در
صورت فشرده شدن در حد چند ثانيه باشد ،که اين خود يك نوع Debounce
نرم افزاري است.
1
يادآوري :براي نمايش اطالعات روي چند نمايشگر «هفت قسمتي»
توسط ميکروکنترلر و براي کاهش تعداد پايههاي به کار رفته ،معموالً از روش
تسهيم «خط -داده» 2استفاده ميشود .اين نحوه نمايش بر پايه اين مطلب
استوار است که سيستم بينايي انسان قادر به تشخيص و تفكي
رويدادهايي که با سرعت بيش از حدود 17بار در ثانيه روي ميدهد،
نيست .مثالً چشم ما ،المپي را که 100بار در ثانيه روشن و خاموش
ميشود ،به طور پيوسته روشن ميبيند ،ولي با شدت نور کمتر از
حالت روشن بودن دائم آن قابل رويت است.
1 7-Segment
2 Line-Data Multiplex
39
يك روش معمول در اتصال و بستهبندي 1چند نمايشگر هفت قسمتي،
قسمتهاي متناظر همهي نمايشگرها به هم و در نهايت خارج کردن 8پايه
(هفت قسمت به همراه يك نقطه) از بستهبندي ،به عنوان پايههاي دادهي
نمايشگر و خارج کردن جداگانهي خط مشتر هر نمايشگر به عنوان پايهي
فعالساز (يا همان آدرس) آن نمايشگر ،است .بنابراين از يك بستهي 4تايي از
نمايشگرهاي 7قسمتي که به اين روش بستهبندي شده است 12 ،پايه شامل 8
پايه داده مشتر ميان همه نمايشگرها و 4پايه فعالساز مخصوص هر
نمايشگر (يا همان پايههاي آدرس) خارج ميشود .بنابراين ،در اين نوع اتصال
در هر لحظه از زمان تنها يك دادهي واحد ميتواند روي تعداد دلخواهي از آنها
به نمايش در آيد .مالتي پلکس خط-داده همان روشي است که براي نمايش يك
دادهي دلخواه (که لزوم ًا براي همهي نمايشگرها مشابه نيست ).روي اين
نمايشگرها به کار ميرود .اگر با سرعت باال و در کسري از ثانيه ،دادهي مربوط
به هر نمايشگر را همزمان با فعال کردن آن ،روي خط داده ارسال کنيم ،سپس
دادهي نمايشگر بعد را همزمان با فعال کردن آن و به همين ترتيب تا آخرين
نمايشگر پيش برويم و مجدد ًا به نمايشگر اول بازگشته و اين کار را به طور
مداوم ادامه دهيم ،با توجه به همان نکتهاي که ذکر شد ،کل داده به صورت ثابت
و در يك زمان ،روي مجموعهي نمايشگرها مشاهده ميشوند .با اين کار به
2
جاي استفاده از 32پايهي ميکروکنترلر ميتوان از 12پايهي آن براي راه اندازي
کامل 4نمايشگر هفت قسمتي استفاده کرد.
حل :به منظور کاهش بيشتر تعداد پايههاي به کار رفته ،ميتوان از يك «مبدل کد
باينري به 7قسمتي»( 3تراشه )7447به عنوان واسط خط داده و از يك
«کدگشاي 2به 4خطي» 4به عنوان واسط خط آدرس (تراشه )74139استفاده
کرد که اين امر منجر به استفاده بهينه از پايههاي ميکرو ميشود و در شکل (-2
)5نشان داده شده است .جهت پيادهسازي نرم افزاري ،ابتدا کليه مراحل الزم را
به منظور ايجاد يك پروژه بدون استفاده از ويزارد انجام داده ،سپس درمحيط
ايجاد شده ،برنامهاي مطابق زير بنويسيد:
1 Package
2 Drive
3 BCD to 7-segment Decoder
4 2-to-4-Line Decoder/Demultiplexer
40
: برنامه
#include <mega32.h>
#include <delay.h>
int s,x,m,n,q,r,i,b,t,d;
void output(void);
void time(void);
void change(void);
void main()
{ DDRA=0x3F; DDRD=0x77; t=2;
while(1){
if(t==2){s=25;x=29;}
if(t==1){s=14;x=10;}
m=s%10;
n=s/10;
q=x%10;
r=x/10;
time();
}//end of while
}
//*****************************************************
void time(void){
int f=1;
if(t==1)PORTD=0x14;
if(t==2)PORTD=0x41;
while(f){d=25;
while(d){
for(i=0;i<4;i++){
if(PIND.3==1)change();
switch(i){
case 3:b=n; break;
case 2:b=m; break;
case 1:b=r; break;
case 0:b=q; break;}//end of switch
output();
delay_ms(5);}//end of for
d--;}//end of while
if(q==0 & r==3)r=0;
if(m==0 & n!=0){n--;m=9;} else if(n==0 & m!=0){n=0;m--;} else
if(m!=0 & n!=0)m--;
if(q==0 & r!=0){r--;q=9;} else if(r==0 & q!=0){r=0;q--;} else if(q!=0 &
r!=0) q--;
41
if(m==0 & n==0){if(t==1){t=2;f=0; goto exit;}
else if(q<5&q>1)PORTD=0x42; else if(q<2)PORTD=0x44;}
if(q==0 & r==0){if(t==2){t=1;f=0;} else if(m<4 & m>1)PORTD=0x24;
else if(m==1){PORTD=0x44;r=3;q=0;}}
exit:
//end of exit
}//end of while
}
//*****************************************************
void output(void){
int c;
switch(b){
case 0:c=0x03;break;
case 1:c=0x07;break;
case 2:c=0x0B;break;
case 3:c=0x0F;break;
case 4:c=0x13;break;
case 5:c=0x17;break;
case 6:c=0x1B;break;
case 7:c=0x1F;break;
case 8:c=0x23;break;
case 9:c=0x27;break;
}//end of switch
if(i==0) PORTA=c&0xFC;
if(i==1) PORTA=c&0xFD;
if(i==2) PORTA=c&0xFE;
if(i==3) PORTA=c&0xFF;
}//end of output
//*****************************************************
void change(void){
if(t==2 & m>0){PORTD=0x42;m=0;n=0;r=0;q=4;d=25;}
if(t==1 & q>0){PORTD=0x24;m=3;n=0;r=0;q=0;d=25;}
}
42
2
2
2
2
13
12
11
10
9
15
14
U4
QF
QA
QB
QE
QC
QD
QG
7447
U1
1
1
1
1
9 22
43
U2:A RESET PC0/SCL
23
PC1/SDA
7 1 13 24
Y3 E XTAL1 PC2/TCK
6 12 25
Y2 XTAL2 PC3/TMS
5 3 26
Y1 B PC4/TDO
A
B
C
D
BI/RBO
RBI
LT
4 2 40 27
Y0 A PA0/ADC0 PC5/TDI
39 28
7
1
2
6
4
5
3
PA1/ADC1 PC6/TOSC1
74HCT139 38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3 21
PB2/INT2/AIN0 PD7/OC2
4
PB3/OC0/AIN1
5 R1
PB4/SS
6 10k
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA32
حل :به منظور نمايش حروف بر روي نمايشگر ماتريسي ،از روش جاروب
نمودن سطرها و ستونها استفاده ميشود و ميبايد مطابق پروژه دوم عمل نمود.
برنامه:
>#include <mega16.h
>#include <delay.h
;unsigned char k; int l
unsigned char arr1[8]={0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66,
;}0x00
unsigned char arr2[8]={0x7E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x7E,
;}0x00
unsigned char arr3[8]={0x1E, 0x33, 0x60, 0x60, 0x60, 0x33, 0x1E,
;}0x00
)void main(void
;{PORTA=0xFF; DDRA=0xFF
;PORTB=0xFF; DDRB=0xFF
)while (1
){for(l=0;l<1000;l++
){for(k=0;k<=7;k++
;]{ PORTA=arr1[k
;)PORTB&=~(1<<k
;)delay_us(100
;PORTB=0xFF
}
}
)for(l=0;l<1000;l++
){for(k=0;k<=7;k++
;]{ PORTA=arr2[k
;)PORTB&=~(1<<k
;)delay_us(100
;PORTB=0xFF
}
44
}
)for(l=0;l<1000;l++
){for(k=0;k<=7;k++
;]{ PORTA=arr3[k
;)PORTB&=~(1<<k
;)delay_us(100
;PORTB=0xFF
}
}
}
}
45
#include <mega32.h>
#include <delay.h>
unsigned char i,j,k,n,r, lsh, pos,char1,char2,charnum;
unsigned char ar1[17][8]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x26,0x03,0xFF,0xFE,0x00,0x00,
0x00,0x1C,0x26,0x03,0xFF,0xFE,0x08,0x00,
0x00,0x14,0x41,0x81,0xFF,0x7E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void main(void)
{
charnum=13;
charnum=charnum-4;
PORTA=0x00;DDRA=0xFF;
PORTB=0x00;DDRB=0xFF;
PORTD=0xFF;DDRD=0xFF;
while(1)
{
pos=0;
for(i=0;i<=charnum;i++)
{
lsh=8;
for(r=1;r<=8;r++)
{
lsh--; pos++;
for(n=1;n<=33;n++)
{
for(k=0;k<=7;k++)
{
for(j=0;j<=4;j++)
{
46
char1=ar1[i+j][k]>>r;
char2=ar1[i+j+1][k]<<lsh;
PORTA=char1|char2;
PORTB|=1<<j;PORTB=0x00;
}
PORTD&=~(1<<k);
delay_us(66);
PORTD=0xFF;
}
}
}
}
}
} U7
9 22
RESET PC0/SCL
23
PC1/SDA
13 24
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
PB0/XCK/T0 PD5/OC1A
2 20
PB1/T1 PD6/ICP
3 21
PB2/INT2/AIN0 PD7/OC2
4
PB3/OC0/AIN1
5
PB4/SS
6
PB5/MOSI
7 30
PB6/MISO AVCC
8 32
PB7/SCK AREF
ATMEGA32
19
16
15
12
9
6
5
2
19
16
15
12
19
16
15
12
19
16
15
12
19
16
15
12
9
6
5
2
9
6
5
2
9
6
5
2
9
6
5
2
U2
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
U3 U4 U5 U6
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
74LS373
74LS373 74LS373 74LS373 74LS373
OE
D7
D6
D5
D4
D3
D2
D1
D0
LE
OE
OE
OE
OE
D7
D6
D5
D4
D3
D2
D1
D0
D7
D6
D5
D4
D3
D2
D1
D0
D7
D6
D5
D4
D3
D2
D1
D0
LE
LE
LE
D7
D6
D5
D4
D3
D2
D1
D0
LE
11
1
18
17
14
13
8
7
4
3
11
1
18
17
14
13
8
7
4
3
11
1
18
17
14
13
8
7
4
3
11
1
18
17
14
13
8
7
4
3
11
1
18
17
14
13
8
7
4
3
عالوه بر مشاهده برنامه بازي، همراه کتابCD با مراجعه به: بازي و سرگرمي
سرعتProteus با اجراي آن در محيطCodeVision ) در محيطSnake( مار
.عمل خود را آزمايش نمائيد و در ساختار برنامه را تحليل کنيد
ميزان، زيرا.موتورهاي پلهاي داراي کاربرد زياد به منظور کنترل موقعيت است
.چرخش شفت موتور متناسب با تعداد پالسهاي اعمال شده به هر فاز آن ميباشد
47
اين موتورها ،در کاربردهايي همچون درايورهاي سخت ،پرينترهاي ماتريسي ،کنترل
بازوهاي ربات و نظاير آن استفاده ميشوند .هر موتور پلهاي از يك هسته متحر
مغناطيسي دائمي که به آن روتور (يا شفت) ميگويند و يك بخش ثابت که استاتور
ناميده ميشود ،تشکيل شده است .موتورهاي پلهاي عموم ًا داراي چهار سيمپيچ
استاتور هستند و به موتورهاي چهار فاز معروف ميباشند .يك موتور پلهاي عالوه
بر چهار سيم ذکر شده ،ممکن است يك يا دو سيم براي اتصال به ولتاژ تغذيه مثبت
يا منفي داشته باشد .شکل ( )8-2ارتباط بين سيمپيچهاي استاتور را نشان ميدهد.
2
براي راهاندازي موتور پلهاي به طور کلي دو روش «گام کامل» 1و «نيم گام»
وجود دارد .که روش گام کامل ،به دو رهيافت هدايت تكفاز و هدايت دو فاز
تقسيمبندي ميگردد که در ادامه به توضيح هر يك از اين روشها ميپردازيم.
48
شکل ( :)9-2راهاندازی موتور پلهای به صورت هدایت تکفاز
-2راهاندازي موتور پلهاي به صورت هدايت دو فاز :در اين روش ،مطابق شکل
( )10-2در هر لحظه هر دو جفت از سيمپيچهاي استاتور با قطبهاي ناهمنام
فعال ميشوند که در اين صورت قطبهاي روتور در جهت برايند قطب
مخالف استاتور قرار ميگيرند .در اين حالت نيز با فعالسازي مناسب
سيمپيچهاي استاتور چهار حالت شکل ( )10-2بوجود ميآيند .تفاوت اين
روش با روش قبل در اين است که :در اين حالت گشتاور ايجاد شده افزايش
49
مييابد و براي کاربردهايي که به قدرت بيشتري نياز دارند مفيد است .در اين
حالت ،براي راهاندازي موتور از جدول ( )4-2استفاده ميشود .با اجراي هر
يك از اين حالتها شفت موتور يك پله جابجا ميشود.
50
شکل ( :)11-2راهاندازی موتور پلهای به صورت نیم گام
و از جدول ( )5-2به منظور راهاندازي موتور استفاده ميشود .تفاوت اين روش با
روش راه اندازي گام کامل هدايت دو فاز اين است که :در اين روش دقت موتور به
51
دو برابر افزايش مييابد ولي ميزان گشتاور توليد شده در اين حالت ،به اندازهي 15
تا 30درصد کاهش مييابد.
زاویه پله :موتورهاي پله اي مختلف ،مشخصات گشتاور ،ولتاژ و تعداد پله در دور
متفاوتي دارند .تعداد پله در دور ،ميزان دقت موتور را نشان ميدهد .براي بدست
آوردن زاويه هر پله ،ميتوان 360درجه را بر تعداد پله در دور تقسيم نمود .جدول
( )6-2تعداد پله در دور و زاويه هر پله را در چند موتور مختلف را نشان ميدهد.
سختافزار مورد نياز براي اتصال يك موتور پلهاي چهار فاز به ميکروکنترلر در
شکل( )12-2ترسيم شده است .از آنجايي که جريان دهي ميکرو براي تحريك
موتور پلهاي مناسب نيست ،از تراشه ULN2003که حاوي بافر جريان ميباشد،
استفاده شده است .مشخصات تراشههاي خانواده ULN200xAدر جدول ()7-2
آورده شده است.
52
ULN200xA جدول ( :)7-2مشخصات تراشههای خانواده
ULN2001A General Purpose, DTL, TTL, PMOS, CMOS
ULN2002A 14-25V, PMOS
ULN2003A 5V TTL , CMOS
ULN2004A 6-15 V ,CMOS , PMOS
حل :از آنجا که در تحريك به صورت پله کامل ،هر بار تحريك روتور ،منجر به
چرخش روتور به اندازه 1.80ميشود .براي چرخش 900بايد 90/1.8=50بار
پالس فرمان توليد گردد.
برنامه:
>#include <mega16.h
>#include <delay.h
;int i=0, k=0,num
)void main(void
{
;DDRD=0x0F
;ACSR=0x80
;SFIOR=0x00
)for(i=1;i<=13;i++
{
;PORTD=0b00000001
;)delay_ms(30
;num++
)for(k=1;k<=3;k++
{
;PORTD=PORTD<<1
;)delay_ms(30
;num++
;if (num==51) k=4
}
}
}
53
ب -برنامهاي بنويسيد که يك موتور پلهاي 4فاز را با دقت 1.80به صورت گام
کامل ،به اندازهي 900در جهت ساعتگرد بچرخاند؟
حل :براي تحريك نيم گام براي چرخش به اندازه 900بايد تعداد تحريكهاي
هدايت تكفاز 50مرتبه و تعداد تحريكهاي هدايت دو فاز نيز 50مرتبه باشند
به طوري که تحريك هدايت تكفاز و هدايت دو فاز به صورت يك در ميان به
طور متوالي صورت پذيرد.
برنامه:
>#include <mega16.h
>#include <delay.h
;int d,a,i=0,k=0,num
)void main(void
{
;DDRD=0x0F
;ACSR=0x80
;SFIOR=0x00
)for(i=1;i<=13;i++
{
;d=0b00000001
;a=0b00000011
)for(k=1;k<=4;k++
{
;PORTD=d
;d=d<<1
;)delay_ms(30
;PORTD=a
;a=a<<1
;if(a==24) a=9
;)delay_ms(30
;num++
;if(num==51) k=4
}
}
}
پ -برنامهاي بنويسيد که يك موتور پلهاي 4فاز را با دقت 1.80به صورت پله
کامل ،به اندازهي 3600در جهت ساعتگرد با سرعت 50دور در دقيقه
( )RPMبچرخاند؟
54
حل :براي اين که بتوان موتور را کنترل نمود ،کافي است که تاخيرهاي مناسب
بين تحريكهاي متوالي فازها وجود داشته باشد.
در هر دقيقه ،موتور 50دور ميچرخد .يعني ،هر دور چرخش موتور 1200
ميليثانيه زمان ميبرد.
در روش گام کامل ،هر دور کامل يعني چرخش 360درجه نيازمند 200مرتبه
تحريك موتور پلهاي است (تعداد تحريكها در حالت هدايت تكفازي و
هدايت دو فازي يکسان هستند) .يعني ميزان تاخير هر تحريك معادل 6
ميليثانيه است .رابطه کلي در رابطه با زمان تاخير مطابق زير است:
(تعداد پله در دور سرعت برحسب = 60/ (RPMميزان تاخير در تحريك با گام کامل
براي مطالعه :در روش نيم گام ،هر دور کامل يعني چرخش 360درجه نيازمند
400مرتبه تحريك موتور پلهاي است (تعداد تحريكهاي هدايت تكفاز 200
مرتبه و تعداد تحريكهاي هدايت دو فاز نيز 200مرتبه ميباشد) .يعني ميزان
تاخير هر تحريك معادل 3ميليثانيه است.
(تعداد پله در دور 2سرعت برحسب = 60/ (RPMميزان تاخير در تحريك نيم گام
برنامه:
>#include <mega16.h
>#include <delay.h
;int i=0, k=0,num
)void main(void
{
;DDRD=0x0F
;ACSR=0x80
;SFIOR=0x00
)for(i=1;i<=50;i++
;{PORTD=0b00000001
;delay_ms(6);num++
)for(k=1;k<=3;k++
;{ PORTD=PORTD<<1
;)delay_ms(6
;num++
} ;if(num==51) k=4
}
}
55
U3
22 9
PC0/SCL RESET
23
PC1/SDA
24 13
PC2/TCK XTAL1
25 12
PC3/TMS XTAL2
26
PC4/TDO
27 40
PC5/TDI PA0/ADC0 +5V +12V
28 39
PC6/TOSC1 PA1/ADC1
29 38
PC7/TOSC2 PA2/ADC2
37
PA3/ADC3
14 36
PD0/RXD PA4/ADC4
15 35
PD1/TXD PA5/ADC5
16 34 Vcc
PD2/INT0 PA6/ADC6 U1
17 33 9 4
PD3/INT1 PA7/ADC7
18
PD4/OC1B
19 1 5
PD5/OC1A PB0/XCK/T0 IN1 VCC VS
20 2 7 2
PD6/ICP PB1/T1 IN2 OUT1
21 3 10
PD7/OC2 PB2/INT2/AIN0 IN3
4 12 3
PB3/OC0/AIN1 IN4 OUT2
5 6
PB4/SS ENA
6 11 13
PB5/MOSI ENB OUT3
30 7
AVCC PB6/MISO
32 8 1 14 +72.0
AREF PB7/SCK SENSA OUT4
15
SENSB GND
ATMEGA16
L298 8
R1 R2
1 1
تراشه L298 شکل( :)13-2مدار کنترل موتور پلهای 4فاز با استفاده از
نكته :اگر بخواهيم سرعت موتور را روي مقدار نسبتاً زياد تنظيم نمائيم،
نميتوان از لحظه راهاندازي موتور ،تاخير بين تحريكهاي متوالي را بر اساس
سرعت مطلوب نهايي محاسبه کرد چرا که به دليل لختي زياد ،آرميچر نميتواند
ميدان مغناطيسي استاتور را دنبال نمايد بنابراين بايد به تدريج سرعت ميدان
استاتور (تحريك استاتور) را افزايش دهيم تا روتور بتواند ميدان استاتور را
دنبال کند و اصطالحاً از حالت سنکرون خارج نشود.
56