آموزش تایمر کانتر Timer Counter میکروکنترلرهای AVR مقدمۀ تایمر کانتر

by | 14 دی, 1398 | AVR, میکروکنترلر, وبلاگ | 18 comments

تایمر-میکروکنترلر-avr

آموزش AVR یوبرد

شاهکار 8بیتی اتمل

آموزش های رایگان AVR

فیلم های آموزش AVR

آموزش خصوصی AVR

اخبار جدید یوبرد در اینستاگرام

تایمر/کانتر چیست؟ تایمر/کانتر در AVR چه ویژگی هایی دارد؟ تفاوت تایمر با کانتر در کجاست؟ موج PWM چیست؟ Duty Cycle به چه معناست؟ ساختار داخلی تایمر چگونه است؟ تایمر چگونه کار می کند؟ بلوک های تایمر/کانتر در AVR چه امکاناتی دارند؟ برای یافتن پاسخ این سوالات با ما همراه باشید.

تایمر/کانترها از مهم ترین بلوک های داخلی یک میکروکنترلر هستند. از آنجا که برنامه های نوشته شده در میکروکنترلر باید مطابق یک الگوی زمانی خاصی (به اختیار برنامه نویس) اجرا و انجام شوند، بلوک های تایمر/کانتر اهمیت زیادی در میکروکنترلرها دارند. علاوه بر دقت زمانی اجرا و انجام برنامه ها که با بلوک های تایمر/کانتر قابل دست یابی است، تایمر/کانترها امکانات دیگری از جمله تولید موج PWM، ایجاد وقفه، شمارش پالس های یک سیگنال، تولید تأخیر(delay)های دقیق، اندازه گیری Duty Cycle یک سیگنال مربعی و … می توانند داشته باشند. در این نوشته به بررسی مقدمات بلوک تایمر/کانتر در AVR می پردازیم. در نوشته های بعدی مباحث طرح شده را تکمیل خواهیم کرد. الگویی که در طرح مطالب مربوط به تایمر/کانتر خواهیم داشت مطابق الگوی دیتاشیت (البته با کمی تغییر) است. هدف از طرح یک مقدمه برای بلوک های تایمر/کانتر در AVR این است که کاربر با درک عمیق به برنامه نویسی تایمر/کانتر بپردازد.

تایمرهای میکروکنترلرهای STM32

فیلم آموزش تایمر در STM32                         (فیلم آموزش ARM STM32 مقدماتی)

فیلم آموزش تایمر پیشرفته در STM32

فیلم آموزش تایمر در AVR                             (فیلم آموزش میکروکنترلرهای AVR مقدماتی)

فیلم آموزش تایمر پیشرفته در AVR

فیلم آموزش تایمر در آردوینو                          (فیلم آموزش آردوینو مقدماتی)

فیلم آموزش تایمر پیشرفته در آردوینو

تعریف و تفاوت تایمر و کانتر

Timer در لغت به معنای زمان سنج و Counter نیز در لغت به معنی شمارنده است. اما در  میکروکنترلر Timer و Counter هر دو شمارنده هستند. تمایز بین این دو واژه در چیزی است که شمارش می کنند. تایمر تعداد پالس های یک سیگنال کلاک (clock) را که فرکانس ثابتی دارد شمارش می کند، اما کانتر همۀ پالس هایی را که ممکن است فرکانس متفاوت هم داشته باشند، شمارش می کند. در میکروکنترلرها، تایمر پالس های CPU و کانتر پالس هایی را که از خارج از میکروکنترلر به آن وارد می شود، می شمارد. چون کلاک میکروکنترلر فرکانس ثابتی دارد مقدار خروجی تایمر با زمان های مساوی افزایش می یابد. اما در کانتر اینگونه نیست. کانتر پالس های سیگنالی را که از بیرون می آید، می شمارد. ممکن است این سیگنال در زمانی معین چند پالس داشته باشد و در زمان های دیگر اصلاً پالسی نداشته باشد. یا فرکانس این پالس متغیر باشد. پس خروجی آن لزوماً با زمان های مساوی افزایش نمی یابد.

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

مثال از کاربرد تایمر: فرض کنید در زمان هایی مساوی بخواهیم یک کی پد را اسکن کنیم یا یک متن را روی LCD نمایش دهیم. یا در زمان هایی مساوی خروجی یک سنسور فشار را بخوانیم. با توجه به این که تایمر زمان هایی مساوی به ما می دهد (زیرا تایمر شمارندۀ پالس های کلاک است و فرکانس کلاک ثابت است و مقدار خروجی تایمر با زمان های مساوی افزایش می یابد) برای این کاربرد استفاده می شود.

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

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

 

Duty Cycle (سیکلِ وظیفه)

در یک شکل موج (که تنها دو حالت صفر و یک دارد) نسبت زمان یک بودن سیگنال به پریود سیگنال را Duty Cycle می گویند و بر حسب درصد بیان می کنند.

Duty Cycle=  t/T  × 100 (%)

 

دیوتی سایکل

تصویر 1 – Duty Cycle

موج-با-duty-cycle-های-مختلف

تصویر 2 – سه موج با Duty Cycle های مختلف

 

موج PWM چیست؟

PWM (Pulse Width Modulation) به معنای مدولاسیون پهنای پالس است. شکل موج PWM، یک شکل موج با پهنای پالس متغیر است. یعنی Duty Cycle آن متغیر است.

موج-pwm

تصویر 3 – موج PWM

ساختار تایمر

تایمر از تعدادی فلیپ فلاپ (flip-flop) که پشت سر هم قرار گرفته اند، ساخته شده است. از لحاظ ساختار دو نوع تایمر داریم: تایمر سنکرون (همزمان) که کلاک به همۀ فلیپ فلاپ ها متصل است و تایمر آسنکرون (غیر همزمان) که کلاک تنها به فلیپ فلاپ اول متصل است و خروجی فلیپ فلاپ اول به ورودی کلاکِ فلیپ فلاپ دوم و خروجی آن نیز به فلیپ فلاپ سوم و … متصل است. تعداد بیت های یک تایمر بیانگر تعداد فلیپ فلاپ ها است. تایمر 8 بیتی، 8 فلیپ فلاپ دارد.

تایمر-با-فلیپ-فلاپ

تصویر 4 – آرایش فلیپ فلاپ ها در تایمر سنکرون و آسنکرون

روش کار تایمر

تایمر 8 بیتی زیر را در نظر بگیرید. فرض کنید مقدار قرار داده شده روی ورودی تایمر یعنی D[7…0] (به صورت باینری) 00000000 است. ورودی در خروجی نیز قرار می گیرد. با هر لبۀ بالا روندۀ کلاک، خروجیِ تایمر یعنی Q[7…0]، یک واحد (به صورت باینری) افزایش می یابد. با لبۀ بالاروندۀ اول، خروجیِ تایمر 00000001 می شود. با لبۀ بالا روندۀ دوم، خروجی تایمر 00000010 می شود. با لبۀ بالا روندۀ سوم، خروجی تایمر 00000011 می شود و این افزایشِ خروجی تا عدد 11111111 (255 دسیمال) ادامه پیدا می کند. با لبۀ بالا روندۀ 256 ام، مقدار خروجی تایمر صفر می شود و پایۀ RCO (Ripple Clock Output) برای مدت یک پریودِ کلاکِ ورودی، یک می شود. به این اتفاق سرریزِ تایمر یا Timer Over Flow می گویند. هر تایمر بسته به تعداد بیت هایش یک مقدار ماکزیمم دارد و تایمر تا آن مقدار می تواند بشمارد و پس از آن سرریز می شود. این مقدار ماکزیمم برای یک تایمرِ m بیتی برا بر 2m – 1 است. در این جا چون تایمر 8 بیتی است مقدار ماکزیممِ تایمر 28 – 1 = 255 است. با احتساب مقدار صفر، تایمر 8 بیتی 256 حالت (پله) دارد. توجه شود که اگر به ورودی D[7…0] یک عدد داده شود، این عدد در خروجی نیز قرار می گیرد و تایمر از این عدد شروع به شمارش می کند یعنی در خروجی Q[7…0] به این عدد اضافه می شود. در نهایت نیز با سرریزِ تایمر، مقدار خروجی به صفر می رسد و تایمر دوباره از صفر می شمارد.

شماتیک-ساده-تایمر

تصویر 5 – شماتیک سادۀ یک تایمر 8 بیتی

در یک تایمر 8 بیتی مقدار خروجی تایمر تا 255 می رود و سرریز  اتفاق می افتد و دوباره تایمر از صفر شروع به شمارش می کند. شکل زیر گویای مقدار خروجی تایمر بر حسب زمان سپری شده است. همان طور که در شکل مشاهده می شود، با هر لبۀ بالا روندۀ کلاک، مقدار خروجی تایمر یک واحد افزایش می یابد. در نتیجه  زمانِ هر پلۀ تایمر برابر یک پریود از کلاک است. اگر فرض کنیم فرکانس کلاک f باشد، آنگاه پریود آن T=1/f می باشد. و زمان سپری شده برای هر پلۀ تایمر برابر T است. بنابراین کل زمان شمارش تایمر از 0 تا 255 (یعنی از یک سرریز تا سرریز بعدی) برابر 256T است.

شمارش-تایمر-نسبت-به-زمان

تصویر 6 – مقدار خروجی تایمر نسبت به زمان

همان طور که ملاحظه می شود با توجه به این که فرکانس کلاک ثابت است تایمر یک زمان ثابت ttimer به دست می دهد. این زمان برابر 256 تا پریود کلاک است. از این شمارشِ تایمر برای داشتن فاصلۀ زمان های مساوی استفاده می کنیم.

تایمری که بررسی شد تایمر بالا شمار بود. تایمرهایی هستند که می توانند به صورت پایین شمار عمل کنند. یعنی از 255 تا 0 بشمارند و دوباره از 255 شروع کنند. اما در میکروکنترلرهای AVR تایمر/کانتر پایین شمار به تنهایی وجود ندارد و در مدهایی از تایمر، بالا شمار به همراه پایین شمار است.

از این به بعد هنگام تشریح عملکرد تایمر، مقدارِ خروجیِ تایمر/کانتر را “مقدار تایمر” می نامیم و آن را به صورت خط مورب نمایش می دهیم و پله های شمارش را رسم نمی کنیم. مانند تصویر زیر.

مقدار-تایمر-نسبت-به-زمان

تصویر 7 – مقدار تایمر نسبت به زمان

در ادامه به معرفی و بررسی تعدادی از امکانات یک بلوک تایمر/کانتر در میکروکنترلر AVR می پردازیم.

 

امکانات بلوک تایمر/کانتر در میکروکنترلرهای AVR

تایمر/کانتر در AVR علاوه بر داشتن شمارش دارای مدهای عملیاتی، وقفه، عملکرد آسنکرون، قابلیت Capture و … هستند. این امکانات باعث شده که تایمر/کانتر در بسیاری از پروژه ها کاربردهای مختلفی داشته باشند. در ادامه ویژگی ها و امکانات موجود در بلوک های تایمر/کانتر AVR را بررسی می کنیم.

وقفه های تایمر/کانتر

هر بلوک تایمر/کانتر دارای تعدادی وقفه است. این وقفه ها شامل “وقفۀ سرریز”، “وقفۀ مقایسه”، “وقفۀ Capture” و … هستند. با فعال سازی وقفۀ سرریز تایمر/کانتر، هرگاه تایمر/کانتر سرریز شود، وقفۀ سرریز اتفاق می افتد، با فعال سازی وقفۀ مقایسه، هرگاه مقدار تایمر با رجیستر مقایسه برابر شود، وقفۀ مقایسه اتفاق می افتد و با فعال سازی وقفۀ Capture، هرگاه Capture اتفاق بیفتد، وقفۀ Capture اتفاق می افتد.

وقفه-های-تایمر-کانتر

تصویر 8 – وقفه های تایمر/کانتر

مدهای شمارشی تایمر/کانتر

هر تایمر می تواند چند مد شمارشی داشته باشد. این مدها با ترکیب حالاتی از رجیسترهای مقایسه و مقادیر ماکزیمم تایمر به دست می آیند. در نوشته های بعدی دربارۀ مدهای شمارشی بلوک های تایمر/کانتر صحبت خواهیم کرد.

رجیستر مقایسه و تولید موج PWM در تایمر/کانتر

یک رجیستر مقایسه وجود دارد که مقدار آن را در برنامه می توان تعیین کرد. هر گاه مقدار تایمر با مقدار رجیستر مقایسه برابر شود می توان یک وقفه و در خروجیِ واحد تولیدِ شکل موج (Waveform Generator)، یک موج PWM داشت. تولید موج PWM در مدهای تایمر نیز گنجانده شده است. شکل زیر یک موج PWM را نشان می دهد که با تایمر ساخته شده است. هر گاه مقدار رجیستر مقایسه را کم و زیاد کنیم (یعنی خط آبی را بالا یا پایین ببریم) پهنای پالس خروجی تغییر می کند.

موج-pwm-در-خروجی-تایمر

تصویر 9 – موج PWM با Duty Cycle ثابت در خروجی تایمر/کانتر

موج-pwm-در-خروجی-تایمر

تصویر 10 – موج PWM با Duty Cycle متغیر در خروجی تایمر/کانتر

تصویر زیر نیز بلوک دیاگرام خروجی واحد مقایسه را به همراه بلوک Waveform Generator نشان می دهد.

دیاگرام-واحد-مقایسه

تصویر 11 – بلوک دیاگرام خروجی واحد مقایسه و بلوک Waveform Generator در تایمر/کانتر

واحد Capture در تایمر/کانتر

این واحد می تواند با تحریک خارجی یا داخلی، مقدار تایمر را در یک رجیستر ذخیره کند. برای مثال اگر لبۀ بالا روندۀ یک سیگنال از خارج از میکروکنترلر به ورودی این واحد اعمال شود، مقدار تایمر در یک رجیستر ذخیره می شود. این واحد می تواند کاربردهای زیادی داشته باشد. از این واحد می توان برای اندازه گیری Duty Cycle یک شکل موج مربعی استفده کرد.

قابلیت شمارش به صورت پایین شمار

در مدهایی از تایمر، تایمر می تواند بالا شمار و پایین شمار باشد.

تایمر-بالا-شمار-پایین-شمار

تصویر 12 – تایمر/کانتر بالا شمار و پایین شمار

واحد تقسیم کنندۀ فرکانس

هر بلوک تایمر/کانتر داری یک واحد تقسیم کنندۀ فرکانس است. این واحد، فرکانس کلاک CPU را تقسیم می کند و سپس به تایمر می دهد. این عملکرد برای دستیابی به زمان های بیشتر با استفاده از تایمر است. این واحد تنها برای کاربرد تایمر است و برای کاربرد کانتر قابل استفاده نیست.

عملکرد آسنکرون

بعضی از بلوک های تایمر/کانتر این قابلیت را دارند که کریستال ساعت خارجی به جای کلاک CPU به آنها وصل شود. از این ویژگی می توان برای ساخت ساعت و تقویم در پروژه ها استفاده کرد. به این ویژگی، عملکرد آسنکرون تایمر/کانتر می گویند. عملکرد آسنکرون تایمر/کانتر به این معناست که منبع کلاک تایمر/کانتر یک فرکانس دیگر جدای از فرکانس CPU باشد. این موضوع به ساختار فلیپ فلاپ تایمرها که سنکرون و آسنکرون هستند ارتباطی ندارد.

 

تایمر/کانتر در میکروکنترلر ATmega128

میکروکنترلر ATmega128 دارای چهار بلوک تایمر/کانتر است که هر کدام ویژگی ها وامکاناتی دارند. این ویژگی ها و امکانات در جدول زیر آورده شده اند. همچنین هر بلوک تایمر/کانتر می توانند تا 5 پایه از میکروکنترلر Atmega128 را در اختیار بگیرند.

تایمر/کانتر ویژگی ها و امکانات پایه های ورودی و خروجی
تایمر/کانتر شمارۀ صفر – 8 بیتی

– آسنکرون

– یک خروجی PWM

– تایمر

OC0 (PB4)

TOSC1 (PG4)

TOSC2 (PG3)

تایمر/کانتر شماره یک – 16 بیتی

– سه خروجی PWM

– Capture

– تایمر/کانتر

OC1A (PB5)

OC1B (PB6)

OC1C (PB7)

T1 (PD6)

ICP1 (PD4)

تایمر/کانتر شمارۀ دو – 8 بیتی

– یک خروجی PWM

– تایمر/کانتر

T2 (PD7)

OC2 (PB7)

تایمر/کانتر شمارۀ سه – 16 بیتی

– سه خروجی PWM

– Capture

– تایمر/کانتر

OC3A (PE3)

OC3B (PE4)

OC3C (PE5)

T3 (PE6)

ICP3 (PE7)

جدول 1 – امکانات، ویژگی ها و پایه های تایمر/کانترهای ATmega128

 

از مقدمۀ تایمر/کانتر در AVR نتیجه می گیریم:

  1. تایمر/کانتر می تواند ابزاری برای ایجاد تأخیر دقیق، ایجاد موج PWM، ایجاد وقفه، شمارش پالس های یک سیگنال، زمان بندی اجرای دستورها و … باشد.
  2. تایمر/کانتر در AVR وقتی پالس های یک کلاک را شمارش کند، تایمر است و وقتی پالس های یک سیگنال غیر از کلاک (مثلاً خروجی یک سنسور دور موتور) را شمارش کند، کانتر محسوب می شود.
  3. شکل موج با Duty Cycle متغیر موج PWM نامیده می شود.
  4. تایمرها (یا شمارنده ها) از فلیپ فلاپ ساخته می شوند. دو ساختار سنکرون و آسنکرون برای تایمرها وجود دارد.
  5. تعداد حالات شمارش تایمر (شمارنده)ها برابر است با 2m که m تعدا بیت های تایمر است. تایمر از صفر تا 2m – 1 می شمارد.
  6. تایمر/کانترها در AVR دارای سه وقفۀ مقایسه، سرریز و Capture هستند.
  7. در برخی مدهای تایمر قابلیت پایین شمار به همراه بالا شمار وجود دارد.

 

رضا اسدی

رضا اسدی

مدیر یوبرد، خالق و توسعه دهندۀ پلتفرم یوبرد، مجری پروژه های الکترونیکی، فعال در صنعت آسانسور، سابقه فعالیت در صنعت خودرو و همکاری در صنعت پزشکی و صنایع دیگر، آموزگار آموزش های یوبرد

جدیدترین تاپیک های AVR

برنامه-نویسی-میکروکنترلر-ویژوال-استودیو

برنامه نویسی میکروکنترلرها با ویژوال استودیو

نصب VisualGDB روی ویژوال استودیو، ساخت پروژه برای برنامه نویسی میکروکنترلرها با ویژوال استودیو، ساخت پروژه برای STM32 در ویژوال استودیو، کدنویسی STM32 در ویژوال استودیو، ساخت پروژه برای AVR در ویژوال استودیو، ساخت پروژه برای LPC در ویژوال استودیو، ساخت پروژۀ آردوینو در ویژوال استودیو

رله-relay

رله، سوییچ تحریک پذیر

تعریف رله، تاریخچه، طرز کار رلۀ الکترومکانیکی، اصطلاحات، انواع الکترومکانیکی، رلۀ حالت جامد، رلۀ هیبریدی، رلۀ حرارتی و انواع تحریک شونده با عوامل غیر الکتریکی، انواع موجود در صنعت برق و برق صنعتی، رلۀ ایمنی و برخی انواع حفاظتی، رلۀ دیجیتال، لزوم استفاده و راه اندازی رله، مشخصات الکتریکی

پروتکل-i2c-protocol

پروتکل I2C، ادغامی از USART و SPI توسط Philips

پروتکل I2C، تاریخچه I2C، ویژگی ها و کاربردهای I2C، عبارات و اصطلاحات I2C، باس، اتصالات و گسترش شبکه I2C، سیگنال های I2C، قالب داده و آدرس در I2C، انتقال داده در I2C، آدرس دهی 10 بیتی، قابلیت Multi-master، حکمیت، مشخصات الکتریکی و زمانی، مقدار مقاومت های پول آپ، Clock Stretching

سون-سگمنت-seven-segment

سون سگمنت، نمایشگر هفت قسمتی

سون سگمنت چیست؟ انواع 7-segment، تاریخچه 7-segment، ساختار 7-segment و نمایش در آن، تعداد ارقام و 7-segmentهای مالتی پلکس، کاربردها، انواع اندازه ها و رنگ ها و مدار راه اندازی 7-segment، بایاس 7-segment، مقدار مقاومت در راه اندازی 7-segment، درایور سون سگمنت، پایه های 7-segment

18 Comments

  1. سلام. میشه به تایمر میکرو به جای کریستال 32k کریستال با فرکانس 1 مگاهرتز یا 8 مگا هرتز وصل کرد؟ ممنون

    Reply
    • سلام. خیر. اسیلاتور داخلی عملکرد آسنکرون تایمر برای فرکانس 32768 هرتز بهینه شه. میشه به پایۀ TOSC1 یه کلاک وصل کرد که اون هم باید کمتر از یک چهارم فرکانس CPU باشه.

      Reply
  2. سلام اول بگم اینکه دانش خودتون رو که به سختی به دست آوردید رو به آسانی در اختیار بقیه قرار میدید نشان از قلب بزرگتون هست و من بخاطر مطالبی که ازتون یاد گرفتم ممنون و مدیونتون هستم. میخواستم اگر امکان داره برای ساخت یه تایمر کنتر avr ازتون کمک بگیرم من یه تایمر میخوام که با وصلش به دستگاه با شروع کار دستگاه شروع به کار کنه و وقتی دستگاه از کار می ایسته زمان رو متوقف کنه تا میزان مجموع زمان کارکرد دستگاه رو نشون بده.مثلا هر روز بعد ۱۲ ساعت کاری که دارم به عنوان اپراتور با دستگاه انجام میدم مشخص بشه چند ساعت از اون ۱۲ ساعت کار مفید من با دستگاه بوده شرمنده اگر طولانی شد ممنون میشم اگر کمکم کنید

    Reply
    • سلام. خیلی ممنون لطف دارید. برای این کار بهتره یه ساعت با اون تایمری بسازید که عملکرد آسنکرون داره. توی ATmega128 این تایمر، تایمر شمارۀ صفر هستش. یه کریستال ساعت 32768 هرتز به پایه های TOSC1 و TOSC2 متصل کنید. تقسیم فرکانسی تایمر رو روی 128 بذارید. با این کار فرکانس کلاک تایمر میشه 256 هرتز. تعداد پله های شمارش هم چون تایمر 8 بیتی هست میشه 256 تا. یعنی از صفر تا 255. بنابراین با هر بار سرریز تایمر، یک ثانیه زمان گذشته. حالا اگر وقفۀ سرریز تایمر رو فعال کنیدو یه متغیر رو توی روتین اون ++ کنید، اون متغیر ثانیه رو نشون میده. توی همون وقفه چند متغیر دیگه هم تعریف کنید که نشون دهندۀ دقیقه و ساعت باشه. با هر بار گذشتن مقدار متغیر ثانیه از 59، خودش صفر بشه و یک واحد به متغیر دقیقه اضافه بشه. برای ساعت هم با هر بار گذشتن مقدار متغیر دقیقه از 59، خودش صفر بشه و یک واحد به متغیر ساعت اضافه بشه. حالا در ادامه این متغیر ها رو توی LCD در قالب ساعت نشون بدید. همۀ این کدها رو میشه توی وقفۀ سرریز تایمر نوشت و چیزی لازم نیست توی حلقۀ while نوشته بشه. حالا برای این که میکروکنترلر متوجه بشه چه وقت لازمه که شمارش رو انجام بده، میشه یه شرط گذاشت. کل برنامه ای که توی روتین وقفه نوشته شدن، در صورتی اجرا بشن که مثلاً یه پایه از میکروکنترلر صفر شده باشه. یه پایه رو ورودی بذارید و اون رو پول آپ کنید. بعد یه خروجی از دستگاه بگیرید و اون رو به یه اپتوکوپلر بدید. خروجی اپتوکوپلر هم وصل کنید به ورودی پول آپ شدۀ میکروکنترلر. هر وقت دستگاه روشن بود، در نهایت باعث بشه که اپتو کوپلر ورودی میکرو رو صفر کنه. در این صورت برنامۀ نوشته شده توی روتین وقفه هم با صفر شدن این پایه، اجرا میشه. در واقع هر بار که وقفه اتفاق میفته، اگه اون پایه صفر بود، برنامه اجرا میشه. اگه یک بود، اجرا نمیشه. به مقدار ولتاژی که از دستگاه به ورودی اپتوکوپلر میدید توجه داشته باشید که ولتاژ در حد کارکرد اپتوکوپلر باشه. یه موضوع دیگه این که اگه لازمه تغذیۀ میکروکنترلر از دستگاه تأمین بشه، و وقتی دستگاه خاموش میشه میکروکنترلر هم خاموش میشه، باید  مقادیر دقیقه و ثانیه و ساعت رو قبل از خاموش شدن میکروکنترلر توی EEPROM ذخیره کنید. بعد از روشن شدن دستگاه  هم باید مقادیر رو از EEPROM بخونید و شمارش رو از اون به بعد انجام بدید. کلیّت کار به این شکله. البته یه کلید هم باید برای ریست زمان بذارید. که در صورت نیاز بتونید زمان رو صفر کنید.

      روش های دیگه ای هم وجود داره. مثلاً استفاده از آی سی های RTC مثل آی سی DS1307. که اون هم باید تدابیری در نظر گرفته بشه که زمانی رو که شمرده چطور به زمان کار دستگاه تبدیل کنیم.

      موفق باشید

      Reply
  3. سلام ممنون از اطلاعاتی که‌ در اختیارمون قرار دادید.
    من میخوام یه برنامه بنویسم که با زدن یک کلید موتور شروع به کار کنه و یک وزنه رو تا ارتفاعی پایین ببره و برگرده بالا و میخوام زمانی که این فرایند طول میکشه رو با تایمر اندازه بگیره و در قسمت دیگه‌ای از این زمان استفاده کنه، ممکنه در راه اندازی تایمر در این مورد کمکم کنید؟

    Reply
    • سلام. خواهش میکنم. لطف دارید. شما باید به محض فشرده شدن کلید یا به محض راه افتادن موتور شمارش یه تایمر رو فعال کنید. ممکنه روش های مختلفی وجود داشته باشه. اگر زمان رفت و برگشت وزنه خیلی کوتاهه از تایمرهای 8 بیتی استفاده کنید و فرکانس واحد تایمر هم زیاد تعیین کنید. اما به نظر زمانش انقد کوتاه نیست. باید محاسبه کنید. اگه زمان تقریبی رو میگفتید میتونستم بهتر راهنمایی کنم. به محض راه اندازی موتور یا فشرده شدن کلید، باید تایمری که قبلاً (توی تابع main و قبل از while) راه اندازی کردید، شروع به شمارش کنه. وقفۀ سرریز تایمر هم باید فعال کنید. یه متغیر عمومی هم باید داشته باشید که مقدار اون توی وقفۀ سرریز تایمر ++ بشه. الان با هر بار سرریز تایمر، یک واحد به مقدار اون متغیر اضافه میشه. بسته با این که فرکانس تایمر چقدر باشه یا چند تا پله رو میشمره، زمان ++ شدن این متغیر بدست میاد. مثلا 256 تا پله از تایمر، 256 میکروثانیه طول میکشه. بنابراین هر واحد از متغیر معرف 256 میکروثانیه است. بعد از برگشتن وزنه سر جاش، شمارش تایمر رو متوقف کنید و مقدار متغیر و مقدار فعلی تایمر رو بخونید. زمان رفت و برگشت وزنه میشه (مثال برای 256 پله با فرکانس واحد تایمر برابر 1 مگاهرتز و نام متغیر هم counter باشه) :

      (counter * 256 * 1us) + آخرین مقدار رجیستر تایمر (برای AVR: رجیستر TCNT)

      این میشه زمان رفت و برگشت بر حسب میکروثانیه. حالا ممکنه لازم باشه زمان زیادی رو اندازه بگیرید. در این صورت هم میتونید فرکانس واحد تایمر رو کمتر کنید، هم این که با اون متغیر یه متغیر دیگه رو ++ کنید. مثلاً بگید هر وقت متغیر counter بزرگتر از 59 شد، به متغیر counter_1، یه واحد اضافه کن. که در نهایت زمان میشه:

      (counter_1 * 60 * counter * 256 * 1us) + (counter * 256 * 1us) + TCNTx

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

      Reply
  4. سلام، ممنون از مطالب جامع و کاملتون.
    من یه سوالی در مورد مد شمارنده دارم. کانتر چطوری میتونه وقایع خارجی مثل تعداد دفعات چرخش یک موتور رو بشمره؟

    Reply
    • سلام خواهش میکنم. شما تایمر/کانتر رو روی کانتر تنظیم می کنید. بعد هر تعداد پالسی که به پایۀ مربوط میدید، رجیستر TCNT یک واحد بهش اضافه میشه. موتور هم روی شفتش مثلا یه سنسور مادون قرمز یا جایی از اون یه اپتو کانتر هست که هر بار که دور میزنه، خروجی سنسور یک بار صفر و یک میشه. این خروجی سنسور رو به پایۀ کانتر متصل می کنید. هر بار که شفت موتور یک دور میچرخه، به رجیستر TCNT یک واحد اضافه میشه. توی یک دقیقه هر چند تا که به TCNT اضافه بشه، میشه دور موتور بر حسب دقیقه

      Reply
  5. با کدام حالت تایمر/کانتر می توان زمان بیشتری را تولید کرد؟

    Reply
    • توی میکروکنترلرهای AVR، تایمرهای 16 بیتی، مد PWM,Phase and Frequency Correct (مد شمارۀ 9) که به صورت صعودی و نزولی میشمره و وقفۀ سرریزش زمانیه که توی شمارش نزولی مقدارش به صفر برسه. این تایمر توی این مد تا مقدار رجیستر OCRnA میشمره که اگه مقدار این رجیستر رو 0xFFFF بذارید، میتونهه بیشترین تعداد شمارش رو داشته باشه.  مثلا توی ATmega64 اون رو روی مد 9 بذارید، و رجیستر OCRnA رو 0xFFFF کنید. و شمارش رو شروع کنید. از صفر تا 0xFFFF که میشه 65536 پله میشمره. بعدش همین تعداد پله رو تا مقدار صفر به صورت نزولی میشمره. و این که اگه میخواید زمان بیشتری رو داشته باشید، میتونید تقسیم فرکانسی رو عدد بزرگتری بذارید. مثلا روی 1024. که فرکانس کلاک CPU به این عدد تقسیم بشه بعد به عنوان کلاک تایمر در نظر گرفته بشه.

      Reply
  6. سلام جناب ممنون از سایت خوبتون
    سوال: میشه تایمر از هر پایه دلخواه که مربوط به تایمر نیست . عملیات سنس و تشخیص فرکانس رو انجام بده؟؟

    Reply
    • سلام. خیلی ممنون. لطف دارید. به صورت مستقیم نمیشه. میشه مثلاً از پایه های ورودی وقفۀ خارجی استفاده کرد و هر وقت که وقفۀ خارجی اتفاق افتاد مثلاً تایمر راه اندازی بشه. یا پایه های IO هم به صورت غیرمستقیم میشه. در صورتی که میکروکنترلر به غیر از خوندن پایۀ ورودی ، کار دیگه ای انجام نده. چون هر تأخیری باعث میشه فرکانس اشتباه  اندازه گیری بشه.

      اما روش بهتر همون پایه های ورودی تایمر هستن. توی میکروکنترلرهای AVR پایه های ورودی و خروجی واحدهای داخلی ثابت هستن. و مثلاً برای ورودی Capture تایمر یه پایۀ خاص وجود داره و قابل تغییر نیست. و باید از همون برای کاربردهای مورد نظر استفاده بشه. اما توی بعضی میکروکنترلرهای دیگه مثل STM32 میشه چندین پایه رو به عنوان ورودی Capture داشت. و قابل انتخابه.

      Reply
  7. سپاس. استفاده کردم

    Reply
    • خواهش میکنم. بزرگوارید

      Reply
  8. سلام ممنون از اطلاعات خوبتون .
    من میخواهم با روشن شدن یک چراغ یا ای ای دی. تایمر شروع به شمردن زمان بکنه و هر وقت چراغ خاموش شد تایمر متوقف بشه و این مورد ادامه داشته باشه تا در نهایت بشه فهمید که چقدر این چراغ روشن بوده . ممنون میشم اگر دستور اردوینو رو دارین بهم بدین یا راهنمایی کنید. با سپاس

    Reply
    • سلام. خواهش می کنم.  لطف دارید. باید از کاربرد زمان سنجی تایمر استفاده کنید. به چند روش این کار میتونه انجام بشه. یکی از روش ها این که از کپچر استفاده کنید. تایمرهای 16 بیتی AVR قابلیت کپچر رو دارن. باید وقفۀ کپچر رو فعال کنید. با لبۀ بالا رونده یا پایین روندۀ یه سیگنال، وقفۀ کپچر اتفاق می افته، تو همین روتین وقفه، تایمر رو راه اندازی میکنید که شروع به کار کنه، و با وقفۀ کپچر بعدی، تایمر متوقف میشه. تعداد پله هایی که توی رجیستر کپچر قرار میگیره، نشون دهندۀ زمان بین دو واقعۀ کپچره. که میتونید ازش زمان روشن بودن LED رو به دست بیارید. باید وقفۀ سرریز رو هم فعال کنید که اگه زمان روشن بودن LED زیاد شد، توی وقفۀ سرریز، به یه متغیر یک واحد اضافه کنید. توی محاسبات، باید تعداد سرریزها هم در نظر بگیرید. توی وبلاگ دربارۀ تایمرهای 1 و 3 میکروکنترلرهای AVR صحبت کردیم. میتونید اون نوشته رو مطالعه کنید. کد آردوینو برای این کاربرد ندارم. خواهش می کنم. موفق باشید

      Reply
  9. سلام ممنون از زحمات شما جسارتا سوالم اینه که می‌خوام یه سیگنال ژنراتور درست کنم که توسط کیبورد مقدار فرکانس رو وارد کنم و یک خروجی با همون فرکانس شروع به نوسان کنه ممنون میشم راهنمایی کنید با تشکر

    Reply
    • سلام وقت بخیر.
      می تونید با استفاده از پروتکل UART و با استفاده از یک مبدل USB به UART به کامپیوتر وصل بشید، توی کامپیوتر با استفاده نرم افزارهای شبیه ساز پورت سریال، فرکانس رو برای میکروکنترلر ارسال کنید و میکروکنترلر اون رو دریافت کنه و فرکانس خروجی رو با استفاده از تایمر ایجاد کنید. اگر با پروتکل UART آشنایی ندارید و یا تایمر و یا مباحث پایه ای تر و یا حتی میکروکنترلر، باید ابتدا آموزش میکروکنترلر ببینید.

      Reply

Submit a Comment

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

آموزش های یوبرد

آموزش TFT LCD با TouchGFX و STM32 یوبرد

گرافیک کاربرپسند با میکروکنترلر ST

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش طراحی PCB و نویز یوبرد

تجسم دنیای الکترونیک

آموزش زبان C و MISRA-C یوبرد

گام نخست دنیای میکروکنترلر

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

آموزش زبان ++C و ++MISRA-C یوبرد

لمس شی گرایی در میکروکنترلرها

آموزش میکروکنترلرهای AVR یوبرد

شاهکار 8 بیتی Atmel

آموزش میکروکنترلرهای LPC یوبرد

یادگار فیلیپس

دانلود

لطفا برای دریافت لینک دانلود اطلاعات خواسته شده را وارد نمایید
ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است