۴-۷ طراحی یک ثانیه شمار با دقت بسیار بالا با استفاده از تایمرکانتر صفر

اگر کمی دقیق باشید حتما این موضوع به ذهنتان خطور کرده است که چرا به جای استفاده از تابعی مثل ()delay_ms ما برای یک ثانیه شمار به سراغ تایمر کانترها رفتیم؟ علت این است که تابع ()delay_ms در فواصل زمانی زیاد از دقت بسیار پایینی برخوردار است و ما اینجا در صدد طراحی یک ثانیه شمار با دقت فوق­العاده بالا هستیم بنابراین از تایمرکانترها استفاده کردیم.همچنین در این کار از کلاک داخلی میکرو استفاده می­کنیم.

برای این منظور لازم است که بدانید وقتی در ابتدای ساخت پروژه ­ی AVR خود در محیط Code Wizard میزان Clock source را برابر یک عدد قرار می­دهید این عدد به چه معناست و چه تاثیری در کار ما دارد؟ یکی از معانی این عدد در مبحث تایمرها تعداد حداکثر پالس مربعی است که مولد تولید پالس میکرو در واحد زمان که همان یک ثانیه است می­تواند تولید ­کند. مثلا وقتی Clock میکرو را برابر ۱MHz قرار می­دهید مولد پالس داخلی میکرو در هر ثانیه می­تواند تا  ۱ میلیون پالس تولید ­کند که این تعداد پالس می­تواند در صورت وارد شدن به واحد Timer Counter شمرده شده و زمان از روی آن محاسبه شود. به این نحو که در مثال بالا به ازای ورود هر ۱ میلیون پالس ۱ ثانیه سپری شده است.

برای این کار ابتدا باید منبع کلاک میکرو را منبع داخلی که همان System Clock  است قرار دهیم. سپس در بخش Clock Value می­توانیم فرکانس تولید پالس مربعی را تعیین کنیم که حداکثر می­تواند با فرکانس کاری خود میکرو برابر باشد یا قسمتی از این فرکانس باشد. در این­جا ما همانند شکل زیر فرکانس ۱Mhz را برمی­گزینیم.

شکل 16

شکل ۱۶

پس از انجام این تنظیمات و همچنین فعال سازی وقفه­ ی سرریز عمل کد نویسی را شروع می­کنیم.

نحوه­ ی عملکرد این کد به این شکل است که چون در هر ثانیه ۱ میلیون پالس وارد واحد تایمرکانتر صفر می­شود و در هر ۲۵۶  پالس وارد شده یک وقفه رخ می­دهد، بنابراین در یک ثانیه (۱۰۰۰۰۰۰/۲۵۶) عدد وقفه رخ می­دهد که حاصل آن عددی است نزدیک به ۳۹۰۶، بنابراین اگر ما در هر ۳۹۰۶ بار رخ دادن وقفه یک واحد به متغیر زمان خود بر حسب ثانیه اضافه کنیم توانسته­ ایم زمان بر حسب ثانیه را به طور دقیق محاسبه کنیم.

شکل 17 : نمایش ثانیه محاسبه شده به وسیله­ ی تایمر کانتر صفر و نمایش آن بر روی LCD

شکل ۱۷ : نمایش ثانیه محاسبه شده به وسیله­ ی تایمر کانتر صفر و نمایش آن بر روی LCD

همچنین به خاطر داشته باشید که در کار با تایمرکانتر ها تنظیم دقیق و هماهنگی بین کلاک­ها هم در زمان پروگرمینگ و هم در زمان شبیه سازی بسیار مهم و حیاتی است و هر گونه بی­ دقتی در این تنظیمات موجب عمل­کرد نادرست پروژه در زمان اجرا می­شود.

شاید این مطالب را هم دوست داشته باشید

8 پاسخ

  1. میلاد خوشخو می‌گه:

    با سلام
    اگر بخواهیم با استفاده از یک انکودر ، سرعت موتور را تنظیم کنیم ، سپس به ازای هر یک دقیقه ، تعداد دور بر دقیقه را مشخص کنیم ، لطفا راهنمایی بفرماییذ
    با تشکر

    • با سلام

      کار بسیار ساده هست، اول باید ببینین دقت انکدرتون چقده، به این مفهوم که چند پالس به ازای هر دور بهتون میده، مثلا فرض کنین تعداد پالس‌ها N عدد باشه ، حالا ACC=360/N دقت انکودر شماس، به این معنی‌ که به ازای هر پالس از انکدر ، شفتِ موتور شما ACC درجه تغییر کرده. حال با محاسبه :
      p =Acc *number of received Pulses مقدار کنونی زاویه را محاسبه نمایید ( if p>= 360 then p=0 )
      حالا برای محاسبه سرعت، شما باید مقدار ((p(i)-p(i-1)/(t(i)-t(i-1) را حساب کنین، در اینجا( p(i معادل زاویه در لحظه‌ای i أم و (t(i زمان این اندازه گیری هست، در واقع شما باید زمان رو هم در کنار زاویه اندازه گیری کنین، برای این کار تو میکرو باید یه واحد تایمر کانتر رو راه اندازی کنین که زمان رو فقط همیشه تو یه متغیر نگاه داره، بعد باید یه واحد دیگه تایمر کانتر رو بهrising edge یا falling edge حساس کنین که پالس‌های انکدر رو بشمرین، بد تو هر لحظه که p رو محاسبه کردین، زمان این اندازه گیری که تو متغیر زمان هست رو هم سیو می‌کنین، بعد باتوجه به فرمول بالا سرعت رو حساب می‌کنین.
      سرعت محاسبه شده سرعت دورانی است (angular Velocity)، برای محاسبه RPM، باید از فرمول زیر بهر ببرین:
      Angular velocity= (2*pi*rpm)/60
      pi= 3.14
      rpm=Round Per Minute

  2. میلاد خوشخو می‌گه:

    پس این تکینیک اشتباه است که با استفاده از دو تایمر ، یک دقیقه شمار و یک شمارنده پالس را بدست آوریم و سپس با استفاده از این دو تایمر ، برای محاسبه rpm استفاده کنیم

  3. مرتضی می‌گه:

    با سلام چطور میتونم delay_msرو تبدیل به دقیقه کنم؟البته ۱۰ دقیقه زمان لازم دارم و نوشتم( delay_ms(600000
    ولی کار نکرد..

    • محمود حسن پور دهنوی محمود حسن پور دهنوی می‌گه:

      سلام.
      توی تابع delay_ms مقدار آرگومان نمیتونه از یه حدی بیشتر بشه. شما باید خودتون یه تابع دیگه تعریف کنین و با فراخوانی اون تابع بیان این زمان رو با شکستن به زمانهای کوچیکتر بسازین

  4. نجمی می‌گه:

    سلام
    امکان داره فایل پروتئوس و کد ویژن و هگز همین پروژه رو به ایمیل من بفرستید
    واقعا نیاز دارم و تو شبیه سازی هم یکم مشکل دارم
    ممنونم …خواهش میکنم بفرستید
    h73n94@yahoo.com

پاسخ دهید

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


CLOSE
CLOSE