۴-۶ روشهای بهینهسازی دقت در ADC هنگام استفاده از سنسورها با خروجی ولتاژ
۲۷ بهمن ۱۳۹۷۲-۷ نحوهی راه اندازی واحد Timer-Counter و شمارش تعداد پالسهای مربعی
۲۷ بهمن ۱۳۹۷در این فصل به معرفی واحد Timer-Counter در میکروکنترلرهای AVR میپردازیم همچنین به معرفی قابلیتهای این واحد پرداخته و نهایتا با انجام چند پروژهی عملی پروندهی این فصل را میبندیم.
واحد Timer-Counter و روش استفاده از این واحد یکی از مهمترین و کاربردیترین بخشهای کار با یک میکروکنترلر AVR است. در ابتدا کمی به معرفی کلمات کلیدی این فصل همانند Clock و Counter میپردازیم.
مفهوم سیگنال Clock :
سیگنال Clock یک سیگنال منحصر به فرد است که بین دو سطح بالا و پایین نوسان میکند.
در الکترونیک به سطح بالا در اصطلاح High-state و به سطح پایین Low-state گفته میشود. برای درک بهتر این مفهوم ابتدا به شکل زیر نگاه بیندازید:
شکل ۱ همانطور که از فصلهای قبل به خاطر دارید شکل یک موج مربعی است. اما هر موج مربعی میتواند با ۴ ویژگی منحصر به فرد شناخته شود:
ویژگی اول (High-state) :
این ویژگی برای بیان بالاترین سطح ولتاژ سیگنال مربعی به کار میرود. در واقع با دانستن این خاصیت در مورد یک موج مربعی میفهمیم بالاترین سطح ولتاژی که میتواند توسط این سیگنال به واحد پردازشی ما وارد شود به چه میزان است و آیا این سطح ولتاژ برای کار ما مناسب است یا خیر؟
در این کتاب ما به صورت پیش فرض این سطح بالا را +5 ولت در نظر میگیریم.
لازم به ذکر است که این سطح میتواند در برخی از کاربردها بسیار حیاتی باشد، بنابراین باید همواره این نکته را در نظر داشت که آیا این سطح ولتاژ برای میکروکنترلر به عنوان سطح منطقی ۱ قابل درک است یا خیر، در صورت منفی بودن جواب باید این سیگنال را تقویت کنیم تا این سطح منطقی برای میکروکنترلر قابل درک باشد.
ویژگی دوم(Low-state) :
این ویژگی دقیقا مشابه ویژگی اول است با این تفاوت که این ویژگی بیانگر پایینترین سطح ولتاژ این سیگنال است. در انتخاب این سیگنال همانند ویژگی اول باید دقت کنیم که این سطح باید آنقدر کم باشد تا بتواند توسط میکروکنترلر به عنوان ۰ منطقی تشخیص داده شود. اینکه چگونه بفهمیم کدام سطح برای یک میکروکنترلر به عنوان سطح منطقی ۱ در نظر گرفته میشود و کدام سطح به عنوان سطح منطقی ۰ به نوع میکروکنترلر ما بستگی دارد و در data sheet مربوط به هر نوع میکروکنترلر این ویژگی بیان شده است. معمولا در میکروکنترلرهای AVR، ولتاژ ۵ ولت به عنوان سطح منطقی ۱ و ۰ ولت به عنوان سطح منطقی ۰ در نظر گرفته میشود.
ویژگی سوم(Rising edge):
کلمهی Rising edge به معنای لبه بالا رونده است و همانطور که در شکل ۱ میبینید این بخش به صورت یک خط کاملا عمودی رسم شده است. در واقع این بخش نمایانگر تغییر سطح منطقی ۰ به ۱ است ولی اگر بخواهیم کمی دقیقتر به این اتفاق نگاه کنیم باید یادآور شویم که این اتفاق مدت زمانی طول میکشد و در واقع شکل A یک Rising edge ایدهآل است.
در شکل ۲ این تغییر سطح به صورت واقعی نشان داده شده است و همانطور که میبینید اگر محور افقی را محور زمان و محور عمودی را محور ولتاژ در نظر بگیریم، مدت زمانی طول میکشد که ما از سطح منطقی ۰ به سطح منطقی ۱ برویم و این زمان تحت عنوان نام Rising delay شناخته میشود.
ویژگی چهارم (Falling edge):
این ويژگی همانند ویژگی سوم میباشد و به معنای لبهی پایینرونده میباشد. در واقع این ویژگی به معنای تغییر سطح منطقی ۱ به سطح منطقی ۰ است، در این ویژگی همانند ویژگی سوم این تغییر سطح به صورت آنی نبوده و کمی تاخیر دارد که به آن Falling delay یا تاخیر افت گویند. حال میتوان کمی بهتر در مورد مفهوم واژهی Clock بحث کرد. اگر تعدادی موج مربعی با نظم خاصی را کنار یکدیگر قرار دهیم میتوانیم بگوییم یک سیگنال Clock درست کرده ایم.
در شکل ۳ چند نوع موج مربعی را مشاهده میکنید، همانطور که میبینید همهی این موجهای مربعی سطح ولتاژ بالا و پایین برابری دارند ولی فرکانس آنها با یکدیگر تفاوت دارد و اینکه فرکانس این سیگنالها چقدر و چگونه باشد مسالهای است که توسط ما تعیین میشود.
بحث کلاک در طراحی پردازندهها یکی از اساسیترین مقولهها است و مهندسین سخت افزار و معماران کامپیوتر همواره در صدد مدیریت هرچه بهتر منابع کلاک برای کاهش توان مصرفی در پردازندهها هستند.
حال میتوانیم کمی در مورد کلاک میکروکنترلر تصویر ذهنی بهتری داشته باشیم اما بحث کلاک داخلی در میکروکنترلرهای AVR مبحثی پیچیدهتر از مباحث مطرح شده در این کتاب است و اصولا تعیین کلاک در میکروکنترلرهای AVR تعیین کنندهی خیلی چیزها مثل سرعت اجرای دستورات و همچنین فرکانس تولید موج مربعی داخلی و غیره میباشد. در کارکردن با تمام واحد های میکروکنترلر بخصوص واحد Timer-Counter و یا واحدهای ارتباطی مثل Usart و یا I2C هماهنگی کلاک داخلی و کلاک برنامهریزی (Programming) میکروکنترلر بسیار حیاتی و تعیین کننده است.
مفهوم Counter :
در اصطلاح Counter به یک شمارنده اطلاق میشود که میتواند تعداد تغییرات یک بخش خاص را در خود ذخیره کند. این شمارنده در عمل بخشی از یک حافظه است، بنابراین میزانی که میتواند در خود ذخیره کند محدود است. مثلا اگر فرض کنیم به Counter ما یک حافظهی ۱۰ بیتی اختصاص داده شده باشد که هر بیت تنها میتواند اعداد ۰ و ۱ را تنها در خود جایدهد، بنابراین در این حافظهی ۱۰ بیتی ما میتوانیم اعداد بین ۰ تا ۱۰۲۳ را ذخیره کنیم. نحوهی محاسبه به این شرح است که اگر یک حافظهی ۱۰ بیتی مثل زیر را در نظر بگیرید هر خانه از حافظه میتواند تنها دو حالت داشته باشد، (یا ۰ باشد یا ۱ ) بنابراین اگر برای تمام خانه ها تمام حالات را در هم ضرب کنیم کل حالات میشود برابر ۱۰۲۴ حالت که در واقع تعداد کل حالات است.
0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 | 0 یا 1 |
---|---|---|---|---|---|---|---|---|---|
2 |
*2 |
*2 |
*2 |
*2 |
*2 |
*2 |
*2 |
*2 |
2 |
حالت اول حالتی است که تمام خانه ها ۰ باشند بنابراین عدد دسیمال این عدد باینری (000000000) برابر ۰ خواهد بود، همچنین اگر تمام خانهها عدد ۱ باشند عدد دسیمال این عدد باینری (1111111111) برابر ۲۵۵ میشود که بزرگترین عددی است که این حافظهی ۱۰ بیتی میتواند در خود جایدهد. بنابراین در حالت کلی برای محاسبه بزرگترین و کوچکترین عددی که حافظهی یک Counter میتواند در خود جایدهد باید از فرمول زیر استفاده کرد:
Max number = (2 N) - 1 Min number = 0
در فرمول بالا N بیانگر تعداد خانههای حافظهی یک Counter است. مثلا برای یک Counter با حافظهی ۱۶ بیتی میتوان تمام اعداد بین ۰ تا ۶۵۶۳۵ را ذخیره کرد.
ارائهی یک مثال کاربردی:
تا اینجا با مفاهیم ساده ولی اساسی Timer-Counter آشنا شدید، حال میخواهیم کمی عملیتر به این قضیه نگاه کنیم. برای این منظور یک کلاک مربعی مانند آنچه در شکل C نشان داده شد را در نظر بگیرید. سئوال اول اینکه اگر فرض کنیم که میخواهیم ببینیم این کلاک مربعی دارای چه فرکانسی است یا اینکه این کلاک مربعی در یک واحد از زمان چند بار از سطح بالا به سطح پایین رفته است باید چه کار کنیم؟
سئوال دوم اینکه اصولا دانستن تعداد تغییرات یک موج مربعی می تواند چه کمکی به ما در درک بهتر مولد این موج یا کلاک بکند؟
در پاسخ به سئوال اول باید بگوییم خوشبختانه در واحد Timer-Counter در میکروکنترلرهای AVR چنین خاصیتی تعبیه شده است، در واقع با استفاده از این ویژگی شما میتوانید تعداد لبههای بالارونده و یا تعداد کل لبههای پایین رونده را بشمارید. در واقع اگر شما بتوانید تعداد کل لبههای بالا روندهی یک کلاک مربعی را بشمارید میتوانید ادعا کنید که تعداد کل تغییرات از بالا به پایین یک کلاک مربعی را دارید، همچنین همین خاصیت در مورد شمارش تعداد لبههای پایین رونده نیز صادق است، چرا که در هر مولفه از یک موج مربعی تنها یک لبهی بالارونده و یک لبهی پایین رونده موجود است.
اما در پاسخ به سئوال دوم ابتدا یک مثال کاربردی در دنیای رباتیک میزنیم، این مثال در دنیای کنترل موتورها و در نهایت کنترل رباتهایی که با چرخ حرکت میکنند بسیار کاربردی و مفید است، بنابراین توصیه میشود این مثال را با دقت بیشتری مطالعه کنید.
بازخورد یک موتور DC مجهز به انکودر تولید کننده پالس مربعی (DC motor position/speed feed back with pulse encoder):
همانطور که در شکل ۴ میبینید یک موتور به همراه یک انکودر مولد موج مربعی نشان داده شده است. اما برای اینکه از عملکرد اصلی این انکودر با خبر شوید بهتر است نگاهی به شکل E بیندازید.
در شکل ۵ همانطور که میبینید یک انکودر از دو بخش تشکیل شده است:
۱. صفحه ی سوراخ دار
۲. مولد موج مربعی لیزری
بر روی صفحهی سوراخ دار تعداد بسیار زیادی سوراخ وجود دارد، مثلا این صفحه میتواند از ۳۶۰ سوراخ تشکیل شده باشد. همانطور که در شکل ۴ میبینید این سوراخها دور تا دور این صفحه قرار گرفتهاند و فاصلهی تمام این سوراخها با هم برابر است.
مولد لیزری نیز با عبور هر سوراخ از مقابل خود یک پالس مربعی تولید میکند، بنابراین چون صفحهی سوراخ دار به شفت موتور وصل است و فرض کردیم از ۳۶۰ سوراخ با فاصلهی یکسان تشکیل شده است با عبور هر سوراخ از مقابل مولد درواقع گویی موتور ۱ درجه به جلو و یا عقب حرکت کرده است.
حال ما بسیار در گرفتن بازخورد از موتور قدرتمند شدهایم! هم میتوانیم مسافت طی شده توسط موتور را به دست بیاوریم و هم سرعت حرکت موتور و غیره بنابراین اگر بتوانیم پالس مربعی تولید شده توسط انکودر را بشماریم میتوانیم تمام این خاصیت ها را به دست آوریم.
حال اگر فرض کنیم ربات ما دارای یک چرخ به شعاع r است، بنابراین در هر دور چرخش این چرخ، ربات ما به اندازهی 2πr که همان محیط چرخ است جابجا میشود. حال برای یک جابجایی به اندازهی ۳۶۰ درجه ما 2πr جابجا میشویم و در واقع برای یک جابجایی ۱ درجهایی 2πr/360 جابجا میشویم. بنابراین اگر انکودر ما دارای N سوراخ باشد که در واقع نمایان گر تولید N پالس مربعی در هر دور چرخش است، مسافت پیموده شده توسط ربات در ازای هر پالس تولید شده توسط انکودر 2πr/N است.
در ادامه به نحوهی شمارش تعداد پالسهای مربعی تولید شده توسط یک منبع تولید کنندهی پالس میپردازیم.