کنترل کننده PID گسسته

بدون دیدگاه

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

فایل PDF این ترجمه رو می تونید از انتهای همین مطلب  به طور مستقیم دانلود کنید.

استفاده از این ترجمه با ذکر نام سایت karakit.ir بلامانع است.

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

و حتما می دونید که در انواع مختلف برای انواع حالات کاری در توانهای مختلف به کار می ره. اما این وسیله با برق 220 سر و کار داره. بنابراین باید راه مطمئنی برای راه اندازی و تریگر کردنش با میکرو پیدا کرد. یکی از ساده ترین راه ها استفاده از اپتوترایاک moc3022 است. اپتوترایاکهای سری moc30xx دارای 6 پایه هستند که انواع moc302x ساده تر و ارزانتر هستند. moc 3022 می تونه تا 400 ولت رو تحمل کنه. اما این آی سی ها توانایی عبور جریانهای تا 100 میلی آمپر رو دارند و برای راه اندازی کلیدهای قوی مانند ترایاکها به کار می رن. یکی از مزایای استفاده از اونها ایزوله شدن مدار میکرو از قسمت ولتاژ بالای مداره و دیگری راه اندازی مطمئنه.
شکل کلی مدار در زیر دیده می شه

سمت چپ بین پایه 1 و 2 یه LED داخلی وجود داره که اونو با یه مقاومت به میکرو متصل می کنیم. با روشن و خاموش شدن این LED ترایاک داخلی آی سی در سمت راست که بین پایه های 4 و 6 قرار داره فعال و غیر فعال می شه. مقاومتها باید کوچیک باشند. مثلا برای راه اندازی آی سی 470 اهم و برای اتصال اون به ترایاک اصلی 1 کیلو اهم مناسبه.
نکته پایانی اینه که نصب هیت سینک بر روی ترایاک فراموش نشه

آشنایی با LCD کاراکتری

کسانی که با میکروکنترلر کار کردند حتما با LCD کاراکتری هم آشنا هستند. در کامپایلرهای مختلف معمولا کتابخانه های آماده برای استفاده از این نوع نمایشگرها وجود داره. اما اگه قصد داشته باشیم خودمون این نمایشگرها رو راه اندازی کنیم باید چکار کنیم؟ مثلا اگه چه راهی وجود داره اگه بخوایم برای یه میکروکنترلر دارای پردازنده ARM که کتابخونه ای براش نوشته نشده برنامه بنویسیم و خروجیها رو روی LCD کاراکتری نمایش بدیم ؟
در این مطلب نحوه راه اندازی LCD کاراکتری 16×2 توضیح داده شده.

پایه های LCD کاراکتری

عملکرد پایه های LCD کاراکتری از 1 تا 16 در شکل زیر دیده می شن:

پایه 1 به زمین و پایه 2 معمولا به 5 ولت متصل و کنتراست LCD با اتصال پایه 3 به سر وسط یک پتانسیومتر تنظیم می شه. پایه 4 یا همون RS اگه بالا باشه LCD در حالت داده قرار می گیره، یعنی اطلاعاتی که روی پایه های D0 تا D7 قرار می گیره برای LCD به معنی کد کاراکترهایی هستند که باید نمایش داده بشن. اما اگه پایه RS پایین باشه LCD در حالت دستوری قرار می گیره. یعنی با قراردادن کد مناسب روی پایه های D0 تا D7 می شه دستوراتی مثل پاک کردن صفحه نمایش رو انجام داد.
پایه 5 اگه high باشه LCD در حالت خواندن و اگه low باشه در حالت نوشتن قرار می گیره. اکثرا نیازی به خوندن وضعیت LCD نداریم و معمولا می شه این پایه رو به زمین وصل کنیم.
پایه های 15 و 16 هم به ترتیب پایه تغذیه و زمین LED نور پس زمینه هستند ام باید یه مقاومت مناسب مثلا 390 اهم برای راه اندازی نور پس زمینه استفاده بشه.
راه اندازی LCD کاراکتری در دو حالت 8 بیتی و 4 بیتی امکان پذیره. در مد 4 بیتی فقط پایه های D4 تا D7 مورد استفاده قرار می گیرند.

راه اندازی LCD کاراکتری در حالت 8 بیتی

1- پایه E رو high می کنیم.
2- پایه RS رو low می کنیم.
3- عدد 0011100 رو روی پایه های D0 تا D7 قرار می دیم. طوری که رقم سمت چپ باید به D7 و رقم سمت راست به D0 اعمال بشه.
4- بعد پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
5- بعد عدد 00001100 رو مثل مرحله 3 روی پایه های داده قرار می دیم.
6- مثل مرحله 4 پایه E رو low و high می کنیم.

با اعمال دستورات بالا LCD آماده کار می شه. اولین دستوری که به LCD داده شد حالت کاری رو مشخص می کنه که در اینجا نمایشگر 2 ردیفی، نحوه اتصال 8 بیتی و فونت 7×5 پیکسلی انتخاب شدند. در واقع هر بیت نشان دهنده یک وضعیت می تونه باشه که با رجوع به دیتاشیت می تونین به راحتی عملکرد هر بیت رو پیدا کنین.
دستور دوم هم نمایشگر رو روشن، cursor رو خاموش و چشمک زن رو هم خاموش می کنه. اگه بخوایم cursor دیده بشه بیت مربوط به D1 رو 1 می کنیم و اگه بخوایم چشمک زن رو هم فعال کنیم بیت مربوط به D0 رو 1 می کنیم.
حالا LCD آماده دریافت اطلاعات از میکروکنترلر هست. برای این کار مراحل زیر رو انجام می دیم.

1- پایه RS رو high می کنیم.
2- کد اسکی کاراکتر دلخواه رو روی پایه های D0 تا D7 قرار می دیم. مثلا برای نمایش حرف K عدد 01001011 رو روی باس داده قرار می دیم.
3- بعد پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.

در این مرحله کاراکتر K روی صفحه نمایش ظاهر می شه.
عیب روش 8 بیتی اینه که مجبوریم 4 پایه میکروکنترلر رو بیشتر از حالت 4 بیتی به LCD متصل کنیم. به همین علت روش راه اندازی LCD کاراکتری به روش 4 بیتی در اینجا به طور کامل توضیح داده شده.

راه اندازی LCD کاراکتری به روش 8 بیتی قبلا توضیح داده شد. گفتیم که برای آزاد کردن 4 تا پایه میکروکنترلر می تونیم از روش راه اندازی 4 بیتی استفاده کنیم.
در این روش مراحل راه اندازی اولیه LCD کمی طولانی تره و برای فرستادن کد اسکی به نمایشگر هم به دو مرحله احتیاج داریم. بنابراین این روش از روش 8 بیتی کند تر عمل می کنه اما با توجه به سرعت میکروکنترلرهای امروزی در عمل به مشکلی بر نمی خوریم.

در روش 4 بیتی پایه های D0 تا D3 استفاده نمی شن و به طور کلی در مدار به جایی متصلشون نمی کنیم. اتصال بقیه پایه ها مثل روش 8 بیتی هست.

راه اندازی LCD کاراکتری به روش 4 بیتی

ابتدا تغذیه LCD رو وصل می کنیم و 100mS صبر می کنیم. بعد مراحل زیر رو به ترتیب انجام می دیم:

1- پایه E رو high می کنیم
2- پایه RS رو low می کنیم
3- عدد 0011 رو روی پایه های D4 تا D7 قرار می دیم. طوری که رقم سمت چپ به D7 و رقم سمت راست به D4 اعمال بشه.
4- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
5- به مدت 50mS صبر می کنیم.
6- عدد 0011 رو روی باس داده قرار می دیم.
7- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
8- به مدت 100uS صبر می کنیم.
9- عدد 0011 رو روی باس داده قرار می دیم.
10- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
11- به مدت 100uS صبر می کنیم.
12- عدد 0010 رو روی باس داده قرار می دیم.
13- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
14- به مدت 100uS صبر می کنیم.
15- عدد 0010 رو روی باس داده قرار می دیم.
16- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
17- عدد 1000 رو روی باس داده قرار می دیم.
18- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
19- به مدت 100uS صبر می کنیم.
20- عدد 0000 رو روی باس داده قرار می دیم.
21- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
22- عدد 1000 رو روی باس داده قرار می دیم.
23- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
24- به مدت 100uS صبر می کنیم.
25- عدد 0000 رو روی باس داده قرار می دیم.
26- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
27- عدد 0001 رو روی باس داده قرار می دیم.
28- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
29- به مدت 3mS صبر می کنیم.
30- عدد 0000 رو روی باس داده قرار می دیم.
31- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
32- عدد 0110 رو روی باس داده قرار می دیم.
33- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
34- به مدت 100uS صبر می کنیم.
35- عدد 0000 رو روی باس داده قرار می دیم.
36- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
37- به مدت 100uS صبر می کنیم.
38- عدد 1100 رو روی باس داده قرار می دیم.
39- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
40- به مدت 100uS صبر می کنیم.

با پایان این مراحل LCD آماده نوشتنه. از ابتدای مرحله 15 تا آخر مرحله 19 مربوط به تنظیم حالت کاری LCD در نمایشگر 2 ردیفی، نحوه اتصال 4 بیتی و فونت 7×5 پیکسلی هست. از ابتدای مرحله 20 تا آخر مرحله 24 صفحه نمایشگر خاموش می شه. از ابتدای مرحله 25 تا آخر مرحله 29 دستور پاک کردن صفحه نمایش صادر می شه. از ابتدای مرحله 30 تا آخر مرحله 34 نحوه افزایش شاخص مکان نما مشخص می شه که در اینجا با تایپ هر کاراکتر یکی به اون اضافه می شه. و بالاخره از ابتدای مرحله 35 تا آخر مرحله 40 نمایشگر روشن می شه، cursor خاموش و چشمک زن هم غیر فعال می شه.
حالا LCD آماده دریافت کد اسکی کاراکترهاست. برای نمایش هر کاراکتر مراحل زیر رو انجام می دیم:

1- پایه RS رو high می کنیم.
2- 4 بیت سمت چپ کد اسکی رو روی باس داده قرار می دیم. مثلا 0100 رو برای حرف K
3- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
4- 4 بیت سمت راست کد اسکی رو روی باس داده قرار می دیم. مثلا 1011 رو برای حرف K
5- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.

در اینجا اگه همه مراحل درست انجام شده باشه باید حرف K روی LCD ظاهر بشه.

ارتباط به طریق پروتکل I2C فقط به دو سیم نیاز دارد. اما این دو سیم در بهترین حالت توانایی آدرس دهی 1024 وسیله را دارند. این پروتکل برعکس SPI می تواند چند master داشته باشد. اما اآنها قادر به صحبت با یکدیگر نیستند و از یک باس برای ارتباط با slave ها استفاده می کنند. وسایل متصل به I2C میتوانند با فرکانس 100kHz تا 400kHz با هم ارتباط برقرار کنند که کمتر از سریال آسنکرون و SPI است. در این پروتکل بعد از ارسال هر 8 بیت داده یک بیت فراداده ACK یا NACK نیز فرستاده می شود. سخت افزار مورد نیاز برای استفاده از I2C پیچیده تر از SPI ولی ساده تر از سریال آسنکرون است و به لحاظ نرم افزاری به سادگی قابل اجرا است.

سیگنالها و سخت افزار

هر باس I2C از دو سیگنال تشکیل شده است: SCL که کلاک سیگنال است و SDA که داده سیگنال است. کلاک توسط master تولید می شود. برعکس آسنکرون و SPI درایورهای باس در I2C از نوع Open Drain هستند. یعنی می توانند خط سیگنال را low کنند اما توانایی high کردن آن را ندارند. بنابراین امکان آسیب دیدن درایور وسایل زمانی که یکی بخواهد سیگنال را high و دیگری بخواهد آن را low کند وجود ندارد و اتلاف توان هم کاهش می یابد. هر سیگنال با مقاومت پول آپ شده است تا در صورتی که هیچ وسیله ای نخواهد آن را low کند ، خود به خود high شود.

مقاومتهای پول آپ معمولا 4.7k هستد و در صورت نیاز کاهش می یابند. این پروتکل در فواصل کوتاه 2 تا 3 متری قابل استفاده است اما برای فواصل زیاد و یا سیستمی با تعداد زیادی وسیله مرتبط به باس، باید مقدار پول آپ را کاهش داد.

سطح ولتاژ سیگنالها

با توجه به اینکه درایورها سیگنال را high نمی کنند امکان اتصال وسایل با سطح ولتاژ ورودی و خروجی متفاوت وجود دارد. مثلا اگر ولتاژ تغذیه دو وسیله با هم تفاوت داشته باشند مقاومت پول آپ را به ولتاژ تغذیه پایین تر وصل می کنیم. البته این کار تنها زمانی مقدور است که این ولتاژ به اندازه کافی برای high کردن ورودی دستگاه دیگر بالا باشد. در غیر این صورت حتما باید از یک مدار یا قطعه تغییر سطح یا level shifter استفاده نمود.

پروتکل

پیام از دو قاب تشکیل می شود: قاب آدرس که master در آن مشخص می کند که پیام به کدام slave ارسال می شود و قاب ( یا قابهای ) داده که به صورت 8 بیتی تبادل می شوند. وقتی که SCL پایین می شود داده روی SDA قرار می گیرد و پس از بالا شدن SCL نمونه برداری می شود. زمان بین لبه کلاک و نوشتن یا خواندن داده تسط دستگاههای روی باس تعیین می شود و بسته به چیپ ها تغییر می کند.

شرایط شروع

برای آغاز یک قاب آدرس دستگاه master پایه SCL را بالا و SDA را پایین نگه می دارد. این باعث می شود همه slave ها متوجه شوند که قرار است یک داده تبادل شود. اگر دو تا master به طور همزمان بخواهند کنترل باس را در اختیار بگیرند دستگاهی که زودتر SDA را پایین نگه دارد کنترل باس را در اختیار می گیرد.

قاب آدرس

برای یک آدرس 7 بیتی ابتدا پرارزشترین بیت ارسال می شود و سپس بیت خواندن و نوشتن ارسال می شود که مشخص می کند قرار است داده خوانده یا نوشته شود ، 0 به معنای نوشتن و 1 به معنای خواندن است. بیت نهم این قاب بیت ACK و یا NACK است. وقتی هر هشت بیت قاب فرستاده شدند، دستگاه گیرنده کنترل SDA را به عهده می گیرد. اگر گیرنده پیش از نهمین پالس کلاک خط SDA را پایین نکشد به این معنی است که گیرنده داده را دریافت نکرده یا نمی داند چگونه آن را تجزیه و تحلیل کند. در این صورت فرایند متوقف می شود و بر عهده master است که در این باره تصمیم گیری کند.

قاب های داده

وقتی قاب آدرس فرستاده شد، ارسال داده می تواند اغاز شود. Master پالسهای کلاک را با فواصل زمانی مشخص تولید می کند و داده با توجه به وضعیت بیت R/W توسط master و یا slave روی خط SDA قرار می گیرد. تعداد قاب های داده دلخواه است و رجیستر داخلی بیشتر دستگاه های slave به طور خودکار افزایش می یابد.

شرایط توقف

وقتی همه قاب های داده فرستاده شدند، master شرایط توقف را تولید می کند. به این طریق که ابتدا SCL از 0 به 1 می رود و در همین وضعیت می ماند و SDA نیز از 0 به 1 می رود.

گیت منطقی Or

بدون دیدگاه

گیت OR که همان یای منطقی است، باعث می شود که اگر فقط یکی از ورودی ها مقدار منطقی صحیح یا همان True داشته باشد خروجی نیز True شود. بنابراین تنها در صورتی مقدار خروجی برابر غلط یا False خواهد شد که همه ورودی ها False باشند.

عملکرد این گیت مشابه شکل زیر است که با وصل شدن هر یک از کلیدها لامپ روشن می شود:

مدار ترانزیستوری زیر طرز کار گیت OR را شبیه سازی می کند:

در صورتی که +5 ولت را معادل 1 منطقی یا همان True و 0 ولت را همان 0 منطقی یا False در نظر بگیریم، با اعمال +5 ولت به ورودی A یا B و یا هردو، حداقل یکی از ترانزیستورها در ناحیه اشباع قرار می گیرد و ولتاژ خروجی Q برابر +5 ولت خواهد بود که همان True یا 1 منطقی است.

اما در صورتی که هر دو ترانزیستور در ناحیه قطع باشند، یعنی به هر دو ورودی 0 ولت اعمال شود، خروجی نیز برابر 0 ولت یا همان False خواهد بود.

یکی دیگر از مدارهایی که می تواند عملکرد گیت OR را شبیه سازی کند در شکل زیر نمایش داده شده است:

از آی سی های TTL که در خود 4 گیت OR را جا داده اند می توان 7432 و از آی سی های CMOS می توان 4071 را نام برد.

گیت منطقی Not

بدون دیدگاه

ساده ترین گیت منطقی گیت NOT است و در شماتیک به شکل زیر نمایش داده می شود:

همان طور که از نام این گیت معلوم است در صورتی که ورودی اعمال شده به آن مقدار منطقی صحیح یا True یا همان High باشد خروجی برابر مقدار غلط یا False یا همان Low خواهد بود و بالعکس.

یکی از ساده ترین مدارهایی که می تواند همین عمل را شبیه سازی کند مدار تک ترانزیستوری زیر است:

اگر مقدار High را معادل +5 ولت و مقدار Low را 0 ولت فرض کنیم، با اعمال High به A ولتاژ ظاهر شده روی کلکتور و یا همان خروجی Q تقریبا 0 ولت و در واقع Low یا 0 منطقی خواهد بود. چرا که ترانزیستور به اشباع رفته و ولتاژ کلکتور به اندازه ولتاژ اشباع کلکتور – امیتر خواهد بود که مقداری نزدیک به صفر دارد.

به طریق مشابه با اعمال Low به ورودی A ترانزیستور در حالت قطع قرار می گیرد و مقدار دقیق ولتاژی که روی خروجی Q ظاهر می شود برابر Vcc-Ic.Rc خواهد بود که با کوچک در نظر گرفتن Ic می توانیم این ولتاژ را تقریبا برابر +5 ولت یا همان 1 منطقی یا High در نظر بگیریم.

گیت Not را می توان در IC های 7404و 4009 و 4096 یافت.

همچنین این گیت را می توان با استفاده از گیت های NOR و NAND نیز درست کرد که چگونگی آن در شکل زیر نمایش داده شده است.

اسیلاتور

یکی از کاربردهای نوع CMOS این گیت ساخت اسیلاتورهای حلقوی Ring Oscillator است. یکی از ابتدایی ترین مدارهای اسیلاتوری که می توان با گیت NOT ساخت در شکل زیر نمایش داده شده است.

در رابطه بالا F فرکانس اسیلاتور، n تعداد گیت های به کار رفته و Tp زمان انتشار هر گیت است. حست این گونه اسیلاتورها این است که مصرف بسیار پایینی دارند و به سادگی ساخته می شوند.

گیت منطقی And

بدون دیدگاه

همان طور که از نام این گیت مشخص است، خروجی آن فقط زمانی صحیح یا True یا High یا 1 منطقی خواهد بود که دو ورودی هر دو True باشند. نماد شماتیک گیت AND به شکل زیر است:

and gate

و عملکرد آن را به طریق ساده می توان با این شکل نشان داد:

برای تحلیل این گیت مانند گیت NOT فرض می کنیم که ولتاژ +5 معادل مقدار منطقی 1 یا همان صحیح یا True و ولتاژ 0 معادل مقدار منطقی 0 یا False است.

یک مدار ترانزیستوری که عملکرد گیت AND را شبیه سازی می کند در شکل زیر نمایش داده شده است.

کاملا واضح است که اگر ولتاژ هر یک از مقادیر ورودی A و B تقریبا برابر 0 ولت یا در واقع همان Low یا False نباشند ترانزیستور متناظر در حالت قطع قرار گرفته و ولتاژ خروجی Q برابر 0 خواهد بود که همان 0 منطقی است. بنابراین تنها زمانی می توانیم انتظار خروجی High داشته باشیم که هر دو ترانزیستور در حالت اشباع قرار گیرند و این تنها در صورتی امکان پذیر است که هر دو ورودی به طور هم زمان High باشند.

با بسط همین تحلیل می توان دریافت که عمل AND بر روی هر تعداد ورودی تنها زمانی منجر به خروجی True خواهد شد که همه ورودی ها True باشند و تنها False شدن یکی از آنها باعث خواهد شد که خروجی نیز False شود.
آی سی های TTL گیت AND عبارتند از 7408 ، 7811 ، 7421 و آی سی های CMOS مشتمل است بر CD4081 ، CD4073 و CD4082.

در میان معروف ترین سنسورهای اندازه گيري موقعیت ، رمزگذارهاي نوری یا optical encoders در سیستمهای با قابلیت اطمینان نسبتا پایین و رزولوشن ( دقت تعیین مکان ) پایین استفاده مي شوند. این رمزگذار ها به دو نوع افزایشی و مطلق تقسیم می شوند.

رمزگذار افزایشی یا Incremental Encoder

رمزگذار نوری افزایشی که در شکل زیر دیده می شود، دارای یک دیسک است که به بخشهایی تقسيم شده که به ترتیب شفاف و مات هستند. یک منبع نور در یک طرف دیسک ( سمت چپ دیسک داخل شکل )، و یک سنسور نوری در طرف دیگر قرار گرفته است. زماني كه دیسک می چرخد، خروجی آشکارساز بطور متناوب ، بسته به اینکه آیا بخش موردنظر كه بین منبع نور و آشکارساز ظاهر مي شود، شفاف باشد یا کدر ، خاموش و روشن مي شود.

بنابراین رمزگذار، جریاني از پالسهاي موج مربعی توليد مي كند که هنگامی که شمارش انجام مي شود، موقعیت زاویه ای شافت را نشان مي دهد. رزولوشن رمزگذارهای نوری (تعداد بخشهاي مات و شفاف در هر دیسک) می تواند از 100 تا 65000 و با دقتهاي مطلق نزدیک 30 کمان بر ثانیه ( 1/43200 در هر چرخش ) وجود داشته باشند .

در بیشتر رمزگذارهای افزايشي يك منبع نور و سنسور ثانويه قرار داده شده تا از جلوی دسته دیگری از سوراخهای تعبیه شده در دیسک عبور کنند و جهت چرخش دیسک را مشخص نمایند. بسیاری از رمزگذارها نیز یک منبع نور سوم و آشکارساز دارند تا با عبور کردن نشانگر از جلوی آنها ، یک دور چرخش کامل تشخیص داده شود. بدون این نشانگر چرخش ، تشخیص زاویه به صورت مطلق مشکل خواهد بود و تنها به صورت نسبی از لحظه شروع به کار رمزگذار می توان زاویه را اندازه گیری کرد.

نقطه ضعف بالقوه و جدی اين است که رمزگذارهاي افزايشي نیاز به شمارنده هاي خارجی برای تعیین زاویه هاي مطلق در یک چرخش داده شده دارند. اگر برق بطور لحظه ای خاموش شود ، یا اگر رمزگذار یک پالس را به علت نويز یا کثیف بودن دیسک ازدست بدهد، اطلاعات زاویه ای همراه با خطا حاصل خواهد شد.

رمزگذار مطلق یا Absolute Encoder

رمزگذار نوری مطلق یا Absolute Encoder که در شکل زیر یک نمونه از آن را مشاهده می کنید بر این معایب غالب مي شود ، اما نسبت به رمز گذار افزایشی گران تر است. يك دیسک رمزگذار نوری مطلق، به N دایره هم مرکز تقسيم مي شود (براي مثال N=4) و هر بخش نيز بصورت شعاعی در امتداد طول آن به بخش های مات و شفاف تقسیم می گردد، كه یک کلمه منحصر به فرد دیجیتالي N بیتی با بیشترین مقدار 2^N-1 را تشكيل مي دهد. در مثال ما رزولوشن برابر 16 است.

رمزگذار نوری مطلق یا Absolute Encoder که در شکل زیر یک نمونه از آن را مشاهده می کنید بر این معایب غالب مي شود ، اما نسبت به رمز گذار افزایشی گران تر است. يك دیسک رمزگذار نوری مطلق، به N دایره هم مرکز تقسيم مي شود (براي مثال N=4) و هر بخش نيز بصورت شعاعی در امتداد طول آن به بخش های مات و شفاف تقسیم می گردد، كه یک کلمه منحصر به فرد دیجیتالي N بیتی با بیشترین مقدار 2N-1 را تشكيل مي دهد. در مثال ما رزولوشن برابر 16 است

حداکثر رزولوشن كدگذارهاي نوری صنعتی به 16 بیت، با دقتهاي مطلق که به رزولوشن (20 کمان در ثانیه ) مي رسد. با این حال، هر دو كدگذار نوری مطلق و افزایشی ممکن است در محیط های صنعتی دچار آسیب گردد.

دیسک انعکاسی

به جای استفاده از دیسکهای فوق می توان از دیسکهایی استفاده کرد که به جای قسمتهای شفاف و کدر، قسمت های سیاه و براق داشته باشند. در این صورت منبع نور و سنسور هر دو در یک سمت دیسک قرار می گیرند و سنسور با توجه به مقدار نوری که از قسمت سیاه یا براق بازتاب می شود خروجی 0 یا 1 را تولید می کند.

آی سی AD9850 یک تولید کننده شکل موج سینوسی و مربعی با فرکانس متغیره که به صورت ماژول آماده توی بازار پیدا می شه. این آی سی در بهترین حالت می تونه فرکانس تا 125MHz که البته در فرکانسهای بالا ممکنه Duty Cycle 50 درصد نداشته باشه.

این ماژول یک DDS Synthesizer محسوب می شه و برای راه اندازی باید از یک میکروکنترلر استفاده بشه. اگه از آردوینو استفاده می کنین احتمالا کتابخونه آماده براش بتونین پیدا کنین. اما اگه خودتون بخواین برنامه میکرو بنویسین خیلی بعیده بتونین حداقل به زبان فارسی راهنمای مناسبی پیدا کنین. به همین علت راهنمای راه اندازی این ماژول به کمک میکروکنترلر AVR آماده شده و برنامه ش هم به زبان بیسیک تحت کامپایلر BASCOM توضیح داده شده.
بهترین راه برای راه اندازی این ماژول مراجعه به دیتاشیت و بعد مثال های موجود در اینترنته. طبق گفته دیتاشیت باید 5 بایت به ماژول فرستاده بشه. دو راه سریال و موازی برای برنامه ریزی این ماژول وجود داره که در اینجا مد سریال معرفی شده.
اول باید پایه D2 رو به زمین و D0 و D1 رو به vcc وصل کنید. بعد پایه RESET رو به مدت خیلی کوتاه high و بعد low کنید. بعد همین کار رو با پایه W_CLK و بعد با پایه FQ_UD انجام بدید. بعد باید کل 40 بیت داده رو به ترتیب روی پایه DATA قرار بدید. قالب این بیتها به این صورته:

W0 W1 W2 W3 W4 W5 ————- W28 W29 W30 W31 0 0 0 0 0 0 0 0

از بیت اول تا 32 مربوط به فرکانس دلخواه شماست و W0 بیت LSB شماست و اول فرستاده می شه. اول بیت مورد نظر رو تنظیم می کنید و بعد یه پالس روی پایه W_CLK بفرستید. محاسبه این 32 بیت طبق رابطه زیر انجام می شه:

Value = Frequency * 4 294 967 296 / 125 000 000

که فرکانس مورد نظرتون رو به جای Frequency قرار می دین و با تغییر مبنا یک عدد 32 بیتی به دست میارین که بیتهای اونو باید به ترتیب طبق روال بالا به آی سی بفرستین.
دو تا بیت بعدی کنترلی هستند و حتما باید 0 باشند. بقیه بیتها رو هم 0 قرار بدید و با همون روال قبل برای هر کدوم یه کلاک بفرستین. حالا یه پالس دیگه روی FQ_UD بفرستید و دیگه برنامه باید همین جا تموم شه. می تونید نتیجه سینوسی یا مربعی رو با اسکوپ مشاهده کنید.
برای اطمینان بیشتر بین قرار دادن هر بیت روی پین DATA و ارسال کلاک به W_CLK یه تاخیر کوچیک مثلا 10 میکرو ثانیه قرار داده شده.
قابل ذکره که اگه vcc ماژول رو برابر 5 ولت قرار بدید احتمالا دامنه خروجیتون بزرگتر خواهد بود. ولی 3.3 هم می تونید بهش وصل کنید.
برنامه نمونه رو می تونین در زیر مشاهده کنین:

'Project name: ad9850
	'Author: Karakit.ir
	$regfile = "m8adef.dat"
	$crystal = 8000000
	$hwstack = 64
	$swstack = 64
	$framesize = 64

	Config Portb = Output  
	'1: W_CLK   2: FQ_UD   3: DATA   4: RESET
	Clk Alias Portb.1
	Fq Alias Portb.2
	Dta Alias Portb.3
	Rst Alias Portb.4

	Config Watchdog = 512   
	'از واچ داگ برای ریست شدن میکرو در هر 512 
	'میلی ثانیه استفاده شده تا در صورت بروز هر اختلالی ماژول متوقف نشه

	Dim W(40) As Byte
	Dim I As Byte
	Dim V As Word

	Set Rst
	Waitus 1
	Reset Rst

	Set Clk
	Waitus 1
	Reset Clk

	Set Fq
	Waitus 1
	Reset Fq

	For I = 0 To 39	'ابتدا همه بیتها رو صفر می کنیم 
		W(i) = 0
	Next I

	W(24) = 1 		'حالا بیتهای مورد نیاز رو 1 می کنیم

	V = 0

	Start Watchdog

	Do		     	'حالا همه بیتها رو به ترتیب می فرستیم به ماژول 
		For I = 1 To 40
			If W(i) = 1 Then
				Set Dta
			Else
				Reset Dta
			End If
			Waitus 10
			Set Clk
			Waitus 1
			Reset Clk
		Next I

		Set Fq
		Waitus 1
		Reset Fq

		Do

		Loop

	Loop

	End

برای اینکه فرکانس دلخواه خودتون رو داشته باشین لازمه که بیتها رو مطابق با عددی که از رابطه بدست آوردین تنظیم کنین یا حتی براش یه تابع بنویسین. با اضافه کردن دکمه یا ولوم یا انکدر به مدار و تغییر برنامه هم می تونین یه DDS با فرکانس متغیر داشته باشین.
در صورتی که دامنه ولتاژ خروجی این DDS براتون کافی نیست و یا ممکنه بار جریان زیادی بکشه باید از یک مدار تقویت کننده استفاده کنین که در همین سایت معرفی شده.