خانه > آموزش > اتصال تعداد زیادی سون سگمنت بزرگ به ATmega32

اتصال تعداد زیادی سون سگمنت بزرگ به ATmega32

در خیلی از کارکردهای عملی لازم می شود که تعداد زیادی سون سگمنت توسط یک میکروکنترلر کنترل شوند. برای مثال یک برد کنترل آسانسور باید قادر باشد تعدا زیادی سون سگمنت را کنترل نماید. یک ترازوی دیجیتال و همچنین یک تابلو نمایشگر قیمت مثال های دیگری از این کاربردها هستند. مضافا به اینکه در اکثر این کاربردها اندازه سون سگمنت ها طوری است که برای روشن شدن نیاز به ولتاژی بالاتر از 5 ولت دارند. بنابراین در این پروژه به دنبال حل این دو مشکل هستیم:

1- اگر تعداد سون سگمنت ها زیاد باشد چگونه آن ها را به میکروکنترلر AVR متصل نماییم؟

2- اگر ولتاژ مورد نیاز سون سگمنت ها بیشتر از 5 ولت باشد چطور آن ها را با AVR کنترل نماییم؟

در فضای مجازی آموزش راه اندازی سون سگمنت تکی با میکروکنترلر AVR به طور فراوان یافت می شود. برای مطالعه ادامه این آموزش پیشنهاد می شود ابتدا راه اندازی یک سون سگمنت با AVR را فرا بگیرید.

در این آموزش ابتدا نحوه اتصال تعداد زیادی سون سگمنت کوچک به AVR را فرا می گیریم(حل مشکل 1) و سپس با نحوه اتصال سون سگمنت های بزرگ به AVR آشنا می شویم(حل مشکل 2).

اتصال تعداد زیادی سون سگمنت به AVR

در اتصال تکی، هر سون سگمنت 8 پایه از میکروکنترلر را اشغال می کند. شکل زیر نحوه اتصال یک میکروکنترلر AVR به یک سون سگمنت کاتد مشترک را نمایش می دهد:

Multiplexd-7 segment-with-ATmega32-1

همانطور که ملاحظه می کنید پورت A میکروکنترلر توسط سون سگمنت اشغال شده است. حال اگر بخواهیم یک نمایشگر 4 رقمی بسازیم کافیست سون سگمنت های دیگر را به همین صورت به پورت های B، C و D میکرو وصل کنیم. اما اگر بخواهیم برای مثال یک نمایشگر 8 رقمی بسازیم باید چه کار کنیم؟ واضح است که اشغال کردن 8 پایه از میکروکنترلر برای هر سون سگمنت کار منطقی ای نیست. برای صرفه جویی در پایه های میکروکنترلر در راه اندازی سون سگمنت ها از روش تازه سازی یا رفرشینگ(Refreshing) استفاده می کنند.

روش تازه سازی

این روش بر این حقیقت استوار است که اگر یک LED با سرعت بسیار زیاد روشن و خاموش شود چشم انسان قادر به تشخیص آن نیست و دائما آن را روشن می بیند. با عنوان نمونه چراغ های روشنایی منزل هم چون با برق متناوب کار می کنند در ثانیه 50 بار خاموش و روشن می شوند اما ما آن ها را روشن می بینیم.

با توجه به توضیحات بالا بدون اینکه در کلیت مسئله تاثیری داشته باشد مثال 4 سون سگمنت را در نظر می گیریم. در این روش سگمنت های a تا g همه نمایشگرها را به هم متصل کرده و کاتدهای سون سگمنت ها را به جای اینکه به زمین متصل نماییم به یکی از پایه های میکروکنترلر متصل می نماییم:

Multiplexd-7 segment-with-ATmega32-2

اصول کار این روش را با یک مثال توضیح می دهیم. فرض کنید می خواهیم عدد 1238 را روی این 4 سون سگمنت نمایش دهیم. برای این کار ابتدا  PB0 را  صفر منطقی کرده و بقیه پایه های مشترک را یک می کنیم و کدهای کاراکتر عدد 1 را روی پورت A قرار می دهیم:

این وضعیت در شکل زیر نمایش داده شده است(خطوط قرمز نشان دهنده 1 منطقی است):

Multiplexd-7-segment-with-ATmega32-2-2

سپس به اندازه چند میلی ثانیه(مثلا 2 میلی ثانیه) مکث می نماییم. این مکث به خاطر این است که نور سون سگمنت تاثیر خود را روی چشم بیننده بگذارد. دقت کنید که در این مدت به خاطر 1 بودن پایه مشترک سایر سون سگمنت ها آنها خاموش می مانند. بعد از گذشت این مدت، نوبت به نمایش عدد 2 روی سون سگمنت دوم است:

Multiplexd-7-segment-with-ATmega32-3

به همین ترتیب بقیه اعداد را هم می توان به همین ترتیب نمایش داد. حاصل کار را می توان در انیمیشن زیر مشاهده نمود:

#Multiplexd-7-segment-with-ATmega32

البته این انیمیشن به صورت کند شده می باشد و اگر با سرعت واقعی مشاهده شود چشم انسان قادر به تشخیص روشن و خاموش شدن آن نمی باشد و به طور مداوم همه سون سگمنت ها را روشن می بیند.

حال که با اصول روشن تازه سازی آشنا شدیم، به سراغ برنامه نویسی آن در نرم افزار Codevision می رویم.

برنامه ساده زیر این کار را انجام می دهد:

عملکرد این برنامه خیلی ساده است. با ایجاد تاخیرهای زمانی 2 میلی ثانیه ای در حلقه اصلی عمل تازه سازی را انجام می دهیم. برای مثال ساده ای که در نظر گرفتیم یعنی نمایش عدد 1238 به صورت ثابت این برنامه به درستی کار می کند. اما اگر برای مثال بخواهیم یک شمارنده 0 تا 9999 بسازیم چطور؟ در این صورت نیاز است تا برای شمارش هم یک تاخیر مثلا 1 ثانیه ای در برنامه ایجاد کنیم. در این صورت این تاخیر 1 ثانیه ای باعث ایجاد اختلال در فرایند تازه سازی سون سگمنت های می شود. در کاربردهای عملی بهتر است که عملیات تازه سازی و در کل کارهایی که به لحاظ زمانی حساس می باشند، به جای حلقه اصلی در وقفه تایمر انجام شود. برای این کار یکی از تایمرهای میکروکنترلر را طوری تنظیم می کنیم که هر 2 میلی ثانیه یکبار سرریز شده و وقفه رخ دهد. سپس برنامه مربوط به تازه سازی را در داخل روتین سرویس وقفه مربوط به آن می نویسیم. برنامه نمونه در زیر مشاهده می شود:

همانطور که مشاهده می شود در داخل حلقه اصلی هیچ برنامه ای وجود ندارد. عمل تازه سازی در داخل روتین سرویس وقفه سرریز تایمر 0 نوشته شده است. با مقداردهی درست به رجیستر TCCR0 کلاک تایمر 0 را برابر 8MHz/64=125KHz قرار دادیم. با این کلاک 250 شمارش تایمر به میزان 2میلی ثانیه طول می کشد(0.002=250/125000). بنابراین چون مقدار سقف شمارش تایمر 0 برابر 256 می باشد با مقداردهی اولیه به رجیستر TCNT0 برابر 6 این 250 شمارش را ایجاد کردیم. همچنین با استفاده از رجیستر TIMSK وقفه سرریز تایمر 0 را فعال نمودیم.

نکته دیگری که توضیح آن خالی از لطف نیست دستور( PORTB=~(1<<i می باشد. در این دستور از اپراتور شیفت به چپ استفاده شده است. دستور a<<b مقدار باینری a را به تعداد b شیفت به چپ می دهد. برای مثال دستور 3>>1 مقدار باینری 1(یعنی 0b00000001)  را 3 تا به چپ شیفت می دهد که نتیجه می شود: 0b00001000(از راست 0 وارد می شود). حال با استفاده از اپراتور نقیض همه بیت ها را عکس می کنیم. یعنی(1<<3)~ می شود 0b11110111. از این دو اپراتور برای فعال کردن پایه مشترک سون سگمنت مورد نظر استفاده می نماییم.

اتصال سون سگمنت های بزرگ به میکروکنترلر AVR

سون سگمنت ها در ابعاد مختلفی ساخته می شوند. با توجه به اینکه هر یک از پایه های خروجی میکروکنترلر ATmega32 می توانند حداکثر ولتاژ 5 ولت و جریان 20 میلی آمپر را تغذیه نمایند اگر سون سگمنت مورد نظر جریان یا ولتاژ مورد نیازش بیشتر از این حدود باشد نمی توان آن را مستقیما به میکروکنترلر متصل نمود.

تمام مثال هایی که در بالا گفته شد برای سون سگمنت های کاتدمشترک بوده است. برای سون سگمنت های آند مشترک هیچ تفاومتی نمی کند جز اینکه برای فعال شدن هر سون سگمنت باید پایه مشترک آن را 1 منطقی کرده و برای روشن شدن هر سگمنت پایه مربوط به آن باید 0 منطقی شود. با توجه به اینکه در سون سگمنت های اندازه بزرگتر بیشتر نوع آند مشترک آن کاربرد دارد در بخش بعد بیشتر به نوع آند مشترک می پردازیم.

اتصال میکروکنترلر ATmega32 به سون سگمنت های بزرگ

اتصال با استفاده از ترانزیستور

در داخل سون سگمنت های بزرگ معمولا از بیش از یک LED به صورت سری استفاده می شود. برای مثال مدار داخلی یک سون سگمنت 12 ولتی در شکل زیر آورده شده است:

Multiplexd-7-segment-with-ATmega32

همانطور که مشخص است در هر یک از سگمنت ها 3 عدد LED با هم سری شده اند به جز در سگمنت نقطه یا DP که به علت کوچک بودن همان یک LED استفاده شده است. یکی از روش هایی که می توان یک سون سگمنت با ولتاژ و جریان بالا را به میکروکنترلر متصل کرد استفاده از ترانزیستور است. در شکل زیر دو مدار پیشنهادی برای سون سگمنت های نوع آند مشترک و کاتد مشترک 12ولت آورده شده است:
Multiplexd-7-segment-with-ATmega32-4

دقت شود که برای هر سگمنت یک ترانزیستور جداگانه لازم است که در اینجا برای جلوگیری از شلوغی شکل از آوردن آن اجتناب شده است. برای پایه مشترک هر کدام از سون سگمنت ها هم باید یک تراتزیستور قرار داد. ترانزیستورها و مقاومت ها را هم باید با توجه به ولتاژ و جریان نامی سون سگمنت ها انتخاب کرد.

اتصال با استفاده از آی سی های ULN2003 و UDN2981

توضیح عملکرد ULN2003

شکل پایه های این آی سی در شکل زیر آورده شده است:

Multiplexd-7-segment-with-ATmega32-5

این آی سی در راه اندازی موتورهای پله ای بسیار کاربرد دارد. عملکرد این آی سی را به طور ساده توضیح می دهیم. پایه GND این آی سی باید به زمین متصل شود. سپس هر کدام از ورودی ها که با حرف I نمایش داده شده اند به 1 منطقی(5ولت) متصل شود خروجی متناظر با آن به زمین وصل می شود. برای اینکه درک عملکرد این آی سی آسان تر شود به مدار زیر توجه کنید:

Multiplexd-7-segment-with-ATmega32-6

این مدار نشان دهنده یک لامپ است که برای روشن شدن نیاز به ولتاژ 20 ولت دارد. با توجه به مدار فوق چون یک سر لامپ به ولتاژ 20 ولت متصل شده است کافیست سر دیگر آن به زمین متصل شود. با فشردن سوئیچ چون ورودی I1 به 5ولت متصل می شود خروجی O1 زمین شده و لامپ روشن می شود و با رها کردن سوئیچ دوباره خاموش می شود. با این توضیحات می توان فهمید که این آی سی فقط توانایی تامین زمین برای بارهای با ولتاژ و جریان بالا دارد.برای استفاده از این آی سی توجه به نکات زیر ضروری است:

 – هر یک از پایه های این آی سی توانایی تحمل 50 ولت و 500 میلی آمپر را داراست.

– با اعمال 1 منطقی به پایه های ورودی در خروجی 0 دریافت می کنیم. به این منطق NOT پنهان در این آی سی برای استفاده در راه اندازی سون سگمنت باید دقت شود.

– زمین های منبع 20 ولت و 5 ولت باید به هم متصل شوند.

توضیح عملکرد UDN2981

شکل پایه های این آی سی در شکل زیر آورده شده است:

UDN2981

در این آی سی پایه های 1 تا 8 ورودی و پایه های 11 تا 18 خروجی هستند. با اعمال 1 منطقی(5ولت) به هر یک از ورودی ها ولتاژ VS به خروجی متناظر با آن اعمال می شود. برای درک آسان این آی سی به مدار شکل زیر توجه نمایید:

UDN2981

در صورتی که سوئیچ فشرده نشود چون در پایه 1 ورودی 1 منطقی نداریم پس در پایه 18 هم ولتاژی نداریم و لامپ خاموش است. اما با فشردن سوئیچ ولتاژ VS یا همان 20V در پایه 18 اعمال شده و لامپ روشن می شود. این آی سی در هر یک از پایه های خود توانایی تامین 50 ولت و 500 میلی آمپر را داراست. همچنین پایه های زمین دو منبع باید به هم متصل گردند.

دیتاشیت این آی سی ها را از لینک های زیر می توانید دریافت نمایید:

دیتاشیت ULN2003

دیتاشیت UDN2981

 

حال با این توضیحات مدار پیشنهادی برای اتصال سون سگمنت های آند مشترک و کاتد مشترک 12 ولتی به میکروکنترلر ATmega32 در شکل های زیر آورده شده است:

Multiplexd-7-segment-with-ATmega32-9 Multiplexd-7-segment-with-ATmega32-9

به وسیله همین 2 آی سی می توان تا 8 سون سگمنت را را ه اندازی کرد.

با مثال این آموزش را به پایان می رسانیم.

مثال: با استفاده از سون سگمنت های آند مشترک 12 ولتی و میکروکنترلر AVR و دو عدد سوئیچ یک شمارنده 0 تا 9999 بسازید به طوری که با فشردن یکی از سوئیچ ها مقدار شمارنده یک واحد افزایش یابد و با دیگری یک واحد کاهش یابد.

حل: برنامه به اندکی تغییر نسبت به برنامه قبلی به صورت زیر می باشد:

دقت کنید در دستور (PORTB=(1<<i دیگر اثری از اپراتور نقیض وجود ندارد. این مسئله به خاطر ماهیت NOT پنهان در آی سی ULN2003 هست که قبلا به آن اشاره کردیم. در حلقه اصلی هم دو دستور شرطی وجود دارند که با استفاده از آن ها وضعیت سوئیچ ها را چک می کنیم. با فشرده شدن سوئیچ ها مقدار متغیر counter یک واحد کم یا زیاد می شوند. با استفاده از عملگرهای تقسیم (/) و با قیمانده(%) نیز رقم های یکان، دهگان، صدگان و هزارگان این متغیر جهت نمایش روی سون سگمنت ها را می یابیم.

مدار رسم شده در نرم افزار Proteus نیز در شکل زیر رسم شده است:

Multiplexd-7-segment-with-ATmega32-11-1

امیدواریم این مطلب مورد رضایت کاربران عزیز قرار گرفته باشه.

ان شاالله موفق و موید باشید.

یاعلی.

 

 

درباره ی مدیر سایت

۲۲ دیدگاه

  1. سلام من فایل پروتئوس رو درست کردم فایل هگز رو هم ایجاد کردم با همین کد البته خطا داشت برطرف شد ولی با اینحال جواب نداد .متاسفانه ۰۹۱۲۳۱۸۰۸۳۰ لطفا من رو راهنمایی کنید

  2. سلام روز بخیر ممنون از شما فقط اگرامکان داره فایل پروتئوس شمارنده ای که توضیح دادید رو اگر دارید برای من ایمیل کنید .خیلی ممنون میشم جسارت بنده رو ببخشید

  3. بسیار عالی بود.
    سوال:چطور میشه ورودی های زیادی رو به میکرو فرستاد و با استفاده از rs232 منتقل کرد؟

  4. جناب ممنون!!. بسیار روان و کامل تشریح شده

  5. سلام .خیلی کامل و جامع توضیح دادید تمام سوالهامو جواب گرفتم .معلومه زحمت زیادی کشیدید.بسیار عالی بود
    خدا توفقیت بده
    ممنونم.

  6. سلام بسیار عالی بود ولی در پروتوس ای سی udn2981 در کتابخانه نیست

  7. محمود قربانی

    سلام خیلی عالی بود
    فقط من میخوام این سیستم تا عدد ۹۹۹۹ که رفت عدد ۱۰۰۰۰ یک سگمنت دیگه اضافه بشه امکانش هس؟
    اگر امکانش هست لطفا توضیح بدید
    با تشکر

    • سلام. خواهش می کنم. دقیقا منظورتون رو متوجه نشدم. برای افزایش تعداد سگمنت ها روش همینه فرقی نداره.

  8. سلام.خدا قوت.خیلی عالی و کاربردی بود.من که شخصا لذت بردم.

  9. خیلی مفید بود. میخواستم بدونم اگه بخوایم تعداد زیادی led یا موتور dc رو کنترل کنیم باید چیکار کنیم. مثلا دو هزارتا led یا موتور

  10. عالی
    مچکر

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *