Timer Counter میکروکنترلرهای AVR – مقدمه
سلام روزتون بخیر، امیدوارم که حالتون خوب باشه و آموزش های قبلیمون براتون مفید بوده باشه. همونطور که قبلا قول دادم، امروز قراره بریم سراغ آموزش واحد Timer Counter میکروکنترلرهای AVR. این جلسه قراره که مقدمات کلی، که در اصل پیش زمینه جلسات بعد است رو باهم بررسی کنیم. خب حالا فهمیدین موضوع از چه قرار وقتشه بریم سراغ اصل مطلب😜
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] واحد Timer-Counter چیست؟
واحد Timer-Counter یکی از امکانات جانبی Cpu است و در همه ی میکروکنترلرهای AVR موجود است.این واحد از نظر سخت افزاری متشکل از یک شمارنده ی اصلی و چندین رجیستر برای تنظیمات می باشد.
با اعمال تنظیمات کاربرد های آن نیز تغییر میکند. از مهم ترین کاربردهای این سخت افزار میتوان به تایمر(زمان سنج)، شمارنده(کانتر)، Real Time Clock(زمان سنج حقیقی) و PWM (مدولاسیون عرض پالس) اشاره کرد.
از Timer-Counter زمانی استفاده میشه که نیاز به شمارش با سرعت بالا و یا برنامه ریزی میکرو برای انجام کارها تعیین شده طبق زمان خاص و دقیق هستش.
اما برای کار با این واحد نیاز که با بخش های مختلف آن و نیز یک سری مفاهیم کاربردی آشنا شویم.
بعد از معرفی کلی واحد Timer-Counter اولین مفهومی که باید یاد بگیریم،شمارنده است ، قبل از اینکه بریم سراغ شمارنده بهتر برخی موضوعات رو یاد آوری کنیم…
📌یادآوری
رجیستر:رجیسترها نوعی حافظه موقت هستند که معمولا 8 بیتی، 16 بیتی،32 بیتی یا 64 بیتی هستند. و این به این معنی که توانایی ذخیره همان تعداد بیت را دارند.هر رجیستر بجز ورودی و خروجی دارای سیگنال کلاک و ریست نیز می باشد. که به محض آمدن ، لبه ی سیگنال کلاک ، ورودی به خروجی منتقل میشود(به عبارت دیگر ورودی تنها در زمان آمدن سیگنال کلاک ذخیره میشود).
شکل زیر یک رجیستر 8 بیتی را نشان میدهد، در صورتی که Reset فعال شود،تمام8 بیت در خروجی صفر میشود. و در صورتی که Reset غیر فعال باشد و لبه ی سیگنال کلاک بیاید،8 بیت ورودی عینا در رجیستر ذخیره میشوند و سپس به خروجی می روند.
حالا که یک پیش زمینه از رجیستر دارید ، درک شمارنده براتون ساده تر میشه.
[icon name=”star-half-o” class=”” unprefixed_class=””]بطورکلی واحد تایمر/ کانتر از بخش های متعددی تشکیل شده است.که مهمترین آنها شمارنده (counter) است.
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] (شمارنده) چیست ؟
شمارنده ها نوعی حافظه هستند که میتوانند هر تعداد بیت دلخواه پهنا داشته باشند.
وظیفه شمارنده ،شمردن تعداد پالس های سیگنال ورودی کلاک است. در تصویر زیر میبینید که یک شمارنده از یک ورودی کلاک و یک ورودی ریست و تعدادی خروجی( n تا ) تشکیل شده است.
لازمه بدونید که خروجی شمارنده با آمدن سیگنال کلاک ورودی یک واحد افزایش پیدا میکند.
بنابراین هنگامی که Reset فعال باشد،تمام خروجی ها صفر می شود. سپس با آمدن هر پالس کلاک، یک واحد به مقدار خروجی اضافه میشود،تا اینکه نهایتا به مقدار (2n-1 ) برسد.
شکل زیر یک شمارنده ی 8 بیتی را نشان می دهد. خروجی این شمارنده تعداد پالس های ورد را از 0 تا 255 می شمارد.
یعنی با آمدن اولین کلاک، خروجی 00000001،دومین پالس کلاک خروجی 00000010، سومین پالس کلاک 00000011 و… .تا اینکه در نهایت با آمدن خروجی 256 پالس کلاک به 11111111 میرسد و با آمدن کلاک بعدی دوباره همه خروجی ها 0 میشود…
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] کلاک ورودی:
در حالت تایمری کلاک ورودی تقسیمی از کلاک اصلی می باشد واز داخل میکرو به واحد وارد میشود
اما در حالت کانتری کلاک واحد از طریق پایه مربوط (پایه های Tx) و از خارج میکرو به واحد اعمال میشود.
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] مشخص کردن رخداد در حالت کانتری:
زمانی که واحد در حالت کانتری کار میکند،باید نوع رخدادی را که میخواهیم شمرده شود را تنظیم نماییم.
برای درک بهتر این مورد باید به مفهوم تایمر/ کانتر اشاره کنیم…
مفهوم کانتر:
کانتر یا شمارنده می تواند تعداد دفعات وقوع یک رخداد را بشمارد. مثلا تعداد افرادی که از یک گیت رد می شوند.
مفهوم تایمر:
تایمر یا زمان سنج می تواند حسی از زمان را بوجود آورد مثلا هر n میکرو ثانیه یکبار عملی انجام شود.
این رخداد ها می توانند یکی از انواع زیر باشند.
- پالس مثبت (Positive Pulse or high-state):
این مورد برای بیان بالاترین سطح ولتاژ سیگنال مربعی بکار میرود.در واقع با دانستن این خاصیت درمورد یک موج مربعی می فهمیم بالاترین سطح ولتاژی که می توانند توسط این سیگنال به واحد پردازش ما وارد شود چقدر است.
و اینکه آیا این سطح ولتاژ برای کار مناسب است یا نه؟
همچنین باید بدانید که این سطح میتواند در برخی از کاربرد ها بسیارحیاتی باشد.
بنابراین باید همواره این نکته را در نظر داشت که آیا این سطح ولتاژی که ما انتخاب کردیم برای میکروکنترلر به عنوان سطح منطقی 1 قابل درک است یا خیر.
- پالس منفی (Negative Pulse or low-state):
این مورد نیز دقیقا مشابه مورد اول است با این تفاوت که بیانگر پایین ترین سطح ولتاژ این سیگنال است.
در اینجا نیز باید باید دقت کنیم که آیا سطح ولتاژ به اندازهی کافی کم است تا میکرو آن را به عنوان 0 منطقی در نظر بگیرد یا نه؟
اما از کجا بدانیم چه ولتاژی کدام یک از دو مورد بالا را به ما میدهد؟
پاسخ بسیار راحت است، از طریق دیتاشیت هر میکرو، که در اکثرشان ولت 5 ،1 منطقی و ولتاژ 0، 0 منطقی است.
- لبه ی بالا رونده (Rising Edge):
اشاره به مدت زمانی دارد که از سطح منطقی 0 به سطح منطقی 1 میرویم. گرچه خط صافی که در شکل بالا مشاهده میکنید، یک شکل ایده آل و در واقعیت به صورت زیر است.
- لبه پایین رونده (Falling Edge):
این مورد به معنای لبه پایین رونده است و بیانگر تغییر حالت از سطح منطقی 1 به سطح منطقی 0 است.
در شکل بالا چند نوع موج مربعی را مشاهده می کنید؛ همان طور که میبینید همه ی این موج های مربعی سطح ولتاژ بالا و پایین برابری دارند ولی فرکانس آنها با یکدیگر تفاوت دارد .
اینکه فرکانس این سیگنالها چقدر و چگونه باشد؟مساله ای است که توسط ما تعیین میشود.
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] فعال یا غیر فعال بودن خروجی:
هر یک از واحد های تایمر/کانتر”حداکثر 3 خروجی دارد،که هرکدام ازاین خروجیها به یکی از پایه های میکروکنترلر متصل میشود.
پایه هایی که در میکروکنترلر های AVR به واحد تایمر/ کانتر مربوط هستند با نام OC x مشخص میشوند.
x=1, 2 , 3
درصورت فعال بودن خروجی، پایه مربوطه از حالت I/O معمولی خارج میشود و به خروجی واحد تایمر /کانتر متصل میشود.
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] mode(حالت کار):
- وقتی که واحد در حالت تایمری کار میکند. میتوان از آن در حالت های مختلف زیر استفاده کرد:
- 1.مد نرمال(Normal Mode)
- 2.CTC Mode
- 3.Fast PWM Mode
- 4.مد تصحیح فاز(Phase Correct PWM)
که همونطور که قولشو دادم در ادامه هر کدوم رو بطور مفصل براتون توضیح میدم.
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] برخی اصطلاحات پرکاربرد:
- سر ریز شدن (Over flow ) :صفر شدن مقدار TCNTn با اعمال یک پالس دیگر را سرریز گویند .
این مورد در شمارنده کاربرد دارد…
📚 اولین کلاک ، خروجی 00000001،دومین پالس کلاک خروجی 00000010،سومین پالس کلاک 00000011 و… تا اینکه در نهایت با آمدن خروجی 256 پالس کلاک به 11111111 میرسد و با آمدن کلاک بعدی دوباره همه خروجی ها 0 میشود…
برای اینکه درکش ساده ترشه میتونید تصور کنید که رجیستر یک لیوان…
وقتی بیش از ظرفیتش آب داخل بریزیم بالاخره سرریز میکنه.
- تطبیق : برابر شدن مقدار TCNT1 با OCR1A یا OCR1B را تطبیق گویند.
- کپچر: عمل کپی شدن مقدار TCNT1 درون ICR1 توسط پین ICP (که در تصویر قبل مشخص شده) را کپچر شدن خواهند گفت.
[icon name=”arrow-circle-left” class=”” unprefixed_class=””] معرفی اجمالی رجیستر های واحد تایمر /کانتر آخرین بخشی است که قبل از بررسی مدهای تایمر به اون می پردازیم:
:(Timer-Counter Control Register) TCCR x [icon name=”circle” class=”” unprefixed_class=””]
این رجیستر وظیفه کنترل کلیه تنظیمات واحد تایمر/کانتر را برعهده دارد. این تنظیمات به شرح زیرند:
- فعال یا غیر فعال بودن واحد
- مشخص کردن منبع کلاک که با این کار حالت تایمر یا کانتر را نیز انتخاب میکنیم
- تنظیم عدد تقسیم کلاک ورودی واحد در حالت تایمری
- مشخص کردن نوع رخداد در حالت کانتری
- تنظیم مدهای مختلف
- فعال یا غیر فعال کردن پایه ی OC x.
در تصویر، به طور خلاصه وظیفه هربیت این رجیستر را توضیح داده است. در ادامه با هر بیت بهتر آشنا میشیم…
[icon name=”circle-o” class=”” unprefixed_class=””] بیت7( FOC0 ):
این بیت تنها در زمانی فعال است که میکرو در هر مدی غیر از مدهای PWM باشد.
در این صورت، زمانی که در این بیت 1 منطقی نوشته شود،بلافاصله یک سیگنال تساوی مقایسه به واحد تولید موج فرستاده میشود.
که بسته به چگونگی تنظیم بیتها ی COM00 , COM01 پایه خروجی CO0 را تغییر می دهد.
[icon name=”circle-o” class=”” unprefixed_class=””] بیتهای6،3(WGM00,WGM01):
از این بیت ها برای تعیین مد عملکرد استفاده میشود
[icon name=”circle-o” class=”” unprefixed_class=””] بیتهای 5،4(COM00, COM01):
این دوبیت رفتار پایه ی خروجی OC0 را کنترل میکنند.
[icon name=”star-half-alt” style=”solid” class=”” unprefixed_class=””] درصورتی که یکی از این دوبیت یاهر دو 1 شون، پایه OC0 وظیفه خود را به عنوان I/O از دست می دهد و توسط تایمر کنترل میشود. و توسط تایمر کنترل می شود.البته باید برای این منظور رجیستر DDR مربوط به این پایه حتما به صورت خروجی تنظیم شده باشد.
[icon name=”circle-o” class=”” unprefixed_class=””]بیت های ( CS00 , CS01 , CS02 ):
این بیت ها مطابق جدول زیر منبع کلاک تایمر/ کانتر را مشخص میکنند.
اگر از پایه ی T0 به عنوان منبع کلاک استفاده شود، تغییرات پایه ی T0،حتی درصورتی که این پایه به عنوان خروجی تنظیم شده باشد،به عنوان کلاک تایمر در نظر گرفته میشود.
[icon name=”star-half-o” class=”” unprefixed_class=””] لازم به ذکر است که اگر این بیت ها را مقدار دهی اولیه نکنیم، به طور پیش فرض همگی دارای مقدار صفر بوده و در نتیجه تایمر در حالت توقف باقی می ماند.
:(Out Compare For Timer)TCNT n [icon name=”circle” class=”” unprefixed_class=””]
این رجیستر در خود تعداد پالس مربعی وارد شده به این واحد تایمر را نگه میدارد.
📚 برای مثال با وارد شدن هر پالس مربعی به واحد Timer0 این شمارنده یک واحد افزایش می یابد تا به عدد 255 برسد. عدد 255 معادل دسیمال عدد باینری 11111111 است، در واقع به این مفهوم که تمام خانه های حافظه ی 8 بیتی ما دارای عدد 1 شده اند.
حال اگر یک پالس مربعی جدید وارد واحد Timer0 شود عدد 11111111 با عدد 1 جمع خواهد شد که حاصل آن یک عدد ۹ بیتی به صورت 100000000 است ولی حافظه ی ما تنها 8 بیت است، بنابراین تنها 8 بیت اول این عدد 9 رقمی در حافظه می ماند.
رقم پر ارزش تر آن یعنی بیت نهم که همان 1 است دور ریخته میشود. به این رخداد سرریز(Overflow) گفته میشود. با هر بار رخ دادن Overflow گویی حافظه ی 8 بیتی ما کاملا به حالت اول خود که همان 00000000 است باز میگردد.
برای درک بهتر این فرایند به تصاویر زیر دقت کنید
حالا می دانیم که مقدار شمارشگر در کجا ذخیره می شود. اما تا وقتی که تایمر را فعال نکنیم، این رجیستر نیز فعال نیست. بنابراین نیاز است که ابتدا تایمر را تنظیم کنیم.
:(Timer-Counter Register For Timer)OCR n [icon name=”circle” class=”” unprefixed_class=””]
این رجیستر خواندنی و نوشتنی بوده و حاوی مقداری است که دائما با مقدار رجیستر TCNT مقایسه میشود. در صورت برابری با آن می تواند به کمک واحد تولید موج، برای تولید خروجی مورد نظر در پایه ی OC0 مورد استفاده قرار گیرد.
از این رجیستر بیشتر در ایجاد سیگنال های PWM و مد مقایسه ای استفاده شده و در حالت مد نرمال برای زمان سنجی استفاده میشود.
لازم بذکر که محتوای این رجیستر مقدار TOP را در مد CTC و مبنای مقایسه را در مدهای PWM مشخص میکند.
📚 از تطابق این دو رجیستر برای تولید وقفه خروجی یا تولید یک شکل موج روی پایه OC x میتوان استفاده کرد.
:(Timer-counter Interrupt Mask Register ) TIMSK [icon name=”circle” class=”” unprefixed_class=””]
وقفه های تایمر را میتوان به صورت جداگانه توسط این رجیستر فعال یا غیر فعال کرد.و از این رجیستر هم برای تنظیم وقفه در هنگام سرریز شدن تایمر/ کانتر و یا وقفه ای که در هنگام تطبیق مقایسه (compare Match)مورد استفاده قرار میگیرد.
[icon name=”star-half-o” class=”” unprefixed_class=””] از مهم ترین بیت های این رجیستر،بیت ششم است که برای فعال کردن وقفه سرریز تایمر کاربرد دارد.
:TIFR (Timer-counter Interrupt Flag Register) [icon name=”circle” class=”” unprefixed_class=””]
این رجیستر به عنوان رجیستر پرچم نیز شناخته میشود. زمانی بیت TOV 0 در این رجیستر 1 میشود که، یک TO سرریز در تایمر یا کانتر رخ داده باشد.
خب تا اینجا با هرچیزی که برای وارد شدن به دنیای تایمر/کانتر و مد های مختلف آن لازم بود رو یاد گرفتید. در جلسات بعدی برسی مد ها رو شروع میکنیم…
دورنما🔭
در این جلسه با مفاهیم اولیه Timer Counter آ شدیم.در جلسات بعد هر کدام از مدهای واحد Timer Counter را بصورت جداگانه و تخصصی برسیم می کنیم. این تفکیک به این دلیل است که شما بهتر مد ها را بشناسید و کار با مدهای مختلف برای شما راحت تر باشد.
خب اینم از آموزش امروز امیدوارم که لذت برده باشید، فراموش نکنید که این آموزش سریالی پس قسمت های بعدی اون رو از دست ندین😉.
_________ _________
درباره زهراخلیل نژاد
از زمانیکه دوره راهنمایی رو شروع کردم عاشق کمک کردن به انسانها برای داشتن یه زندگی راحت بودم . واز همون سنین با شرکت در کلاسهای رباتیک قدم به این دنیای جذاب و پر از شگفتی گذاشتم. . و هر بار با ساختن یک وسیله ، کاردستی و... ذوق و اشتیاق عجیبی رو تجربه کردم. به همین دلیل هم فکر میکنم اگر هر کس یک رشته رو با علاقه و بطور تخصصی ادامه بده . میتونه کلی ایده خلاق ارائه بده و دنیا رو به جای زیباتری برای زندگی تبدیل کنه .
نوشته های بیشتر از زهراخلیل نژاد
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.