580 likes | 822 Views
چرا از تایمرها استفاده می کنیم؟. تایمر کانتر یکی از بخش های مهم میکروکنترلرها می باشد. در بیشتر مواقع لازم که تعدادی وقایع خارجی (با سرعت بالا) شمارش شود و یا گاهی لازم است که در یک زمان خاص و دقیق، کاری صورت گیرد. تنها توسط تایمر کانتر ها می توان این کارهای دقیق و با سرعت بالا را انجاد داد.
E N D
چرا از تایمرها استفاده می کنیم؟ • تایمر کانتر یکی از بخش های مهم میکروکنترلرها می باشد. در بیشتر مواقع لازم که تعدادی وقایع خارجی (با سرعت بالا) شمارش شود و یا گاهی لازم است که در یک زمان خاص و دقیق، کاری صورت گیرد. تنها توسط تایمر کانتر ها می توان این کارهای دقیق و با سرعت بالا را انجاد داد. • میکروکنترلرهای AVR حداکثر دارای شش عدد تایمر کانتر هشت بیتی و شانزده بیتی هستند. برخی از آنها دارای عملکرد ساده و برخی دیگر دارای امکانات بیشتر نظیر تولید موج PWM ، حالت مقایسه CTC ، حالت تسخیر، عملکرد غیر همزمان و ... می باشند. بطور مثال اگر بخواهیممیکروکنترلر: 1. هر چند وقت یک بار، به وسیله ADC ولتاژ سنسور دما را بخوانیم 2. هر ثانیه یک واحد به ثانیه شمار یک ساعت دیجیتال اضافه کند 3. به وسیله یک کلید، بین نمایش ساعت و دما تغییر کند 4. همواره نور صفحه را به وسیله ولتاژ خروجی یک مقاومت نوری، تنظیم کند انجام این چهار عمل به وسیله کدهای ساده و بدون استفاده از تایمرها غیر ممکن یا بسیار نامفهوم و دشوار خواهد بود!
ساختار تایمرها: همانطور که در شکل می بینید، تایمرها مجموعه ای از حافظه هایی (معروف به Flip-Flop) هستند که پشت سرهم قرار گرفته اند و نماینده یک عدد دودویی اند. در این نمونه یک تایمر 3 بیتی را می بینیند که به ازای هر کلاک، یک واحد دودویی به مقدار این 3 بیت اضافه می شود! و زمانی که به حداکثر مقدار خود می رسد، دوباره صفر می شود!
تعاریف موجود در واحد تایمر/کانتر • در حالت کلی میتوان عملکرد تایمر ها را در 4 مد تقسیم بندی کرد.از آنجایی که هر 4 مد در تمامی تایمر ها مشترک است ابتدا مد های تایمر ها رابررسی کرده و سپس رجیستر های مربوط به هر تایمر را شرح میدهیم.اما قبل از شروع کار نیاز به تعریف 3 اصلاح زیر داریم رسیدن مقدار ریجستر تایم به 0xff(8بیتی) یا 0xffff(16بیتی)را مقدار حداکثر تایمر یا مقدار ماکزیمم تایمر (max)می نامیم این اصطلاح را در مد نرمال به کار نمیگیریم زیرا top برابر max است و در مد های دیگر کاربرد دارد موقعه ای که مقدار رجیستر تایم به بزرگترین مرحله شمارش میرسد top اتفاق افتاده است . مقدار TOP در مد fast pwmو phase correct pwmبرای تایمر های 8 بیتی مقدار ثابت 0xffو در تایم 16 بیتی میتواند اعداد ثابت 0x01ff,0x00ff و 00x03ffرا داشته باشد یا اینکه متغییر باشد رسیدن مقدار ریجستر تایمر به حداقل مقدار تعریف شده( در حالت پیش فرض0x00 یا 0x0000) را گویند.توجه کنید که مقدرا bottom لزوما صفر نیست و میتواند تعیین شود.
ساختار واحد تایمر و کانتر: میکروکنترلر AVRاغلب دارای سه تایمر (Timer0 , Timer1, Timer2) می باشد • تایمر 0و2 8 بیتی • تایمر 1 16 بیتی به ازای هر یک سه ثبات اساسی زیر وجود دارد: 1. TCNTn: مقدار کنونی تایمر شماره n در هر لحظه درون این ثبات می باشد! 2. OCRn: مقدار این ثبات در هر لحظه با ثبات TCNTn مقایسه می شود و در صورت برابر بودن، مطابقِ مُد تایمر کاربردهای مختلفی را برای ما دارند! 3. TCCRn:این ریجستر بر خلاف دو ریجستر قبلی یک ریجستر کنترلی است که خصوصیات تایمر مورد استفاده توسط ان تعیین می شود تایمرهای میکرو بوسیله یک منبع کلاکِ قابل انتخاب تغذیه می شود. که این منبع می تواند خارجی یا بوسیله کلاک اصلی سیستم باشد!
Timer Registers : TCNTn (Timer Counter Register) OCRn (Output Compare Register) TCCRn (Timer Counter control register) TIMSK (timer/counter interrupt mask register) TIFR(timer/counter interrupt flag register) نکته:n شماره تایمر مورد نظر است که به ازای هر تایمر رجیستر مورد نظر وجود خواهد داشت
نحوه عملکرد رجیستر TCNT:TCNTn (Timer Counter Register) به ازای هر کلاک یک واحد به ثبات TCNTn اضافه می شود تا اینکه به مقدار حداکثر خود برسد و پس از آن دوباره صفر شود! به عنوان مثال برای تایمر 0 داریم TCNT0= 253 TCNT0= 255 TCNT0= 0 TCNT0= 254 تنظیمات CodeVision: 1. انتخاب تایمر 2. انتخاب منبع کلاک برای تایمر مورد نظر 3. تعیین مُد تایمر
نحوه عملکرد رجیستر OCRn:OCRn (Output Compare Register) • از این رجیستر بیشتر در مد هایPWM و مد مقایسه (CTC)استفاده شده ودرحالت مد نرمال که تایمر برای زمان سنجی استفاده میشود کاربرد خاصی ندارد و همانطور که قبلا اشاره شد زمانی که متحوای آن با رجیستر TCNT برابر شود (در اثر شمارش TCNT)رجیستر TCNT سریز میکند که میتوان از این خاصیت استفاده های گوناگونی را کرد که در ادامه با آنها آشنا می شویم نکته: محتوای این ریجستر مقدار TOP را در مد CTC و مبنای مقایسه را در مد های PWM تعیین می کند.
نحوه عملکرد رجیستر TCCRn:TCCRn (Timer Counter control register) در این رجیستر تمامی بیت ها نقش تعیین خصوصیات تایمر را دارند . به عنوان مثال در تایمر 0 داریم: TCCR0 از این بیت تنها زمانی میتوان استفاده نمود که تایمر در مد PWM نباشد.با یک کردن این بیت یک مقایسه اجباری ایجاد کرده و با توجه به تنظیم بیت های COM0[1:0]پایه خروجی OCO تغییر حالت میدهد.از این بیت در کاربرد های خاص استفاده میشود و در حالت عادی آن را صفر میکنیم توسط این بیت ها مد عملکرد تایمر را تعیین میکنیم وظیفه این بیت ها تعیین تقسیم فرکانسی کلاک تایمر صفر می باشد. در صورتی که از مد های PWM یا CTC استفاده نماییم . تنظیم و عملکرد این دو بیت مطابق جدول می باشد.
انتخاب منبع کلاک تایمرها: هر سه تایمر Timer0,Timer1,Timer2 این قابلیت را دارند که کلاک خود را از کلاک سیستم و یا تقسیمی از آن دریافت کنند. در این حالت به آن تایمر گفته می شود! هر دو Timer0 و Timer1این قابلیت را نیز دارند که بوسیله پین های T0 (برای Timer0) و T1 (برای Timer1) بصورت خارجی و به ازای لبه بالا/پایین رونده سیگنال تأمین شوند. در این حالت به آن کانتر(شمارنده) گفته می شود! همچنین Timer2 این قابلیت را دارد که کلاک خود را به وسیله یک اسیلاتور خارجی و یا تقسیمی از آن تأمین کند. به این صورت که یک کریستال با فرکانس معینی بین دو پایه TOSC0 و TOSC1 متصل باشد! Timer2 برای کریستال ساعتی (32.768 kHz) بهینه شده است و نسبت تقسیم های 8/32/64/128/256/1024 را برای آن فراهم آورده است! این کریستال در هر ثانیه 32768 بار یعنی 2^15 بار پالس تولید می کند و از آن بعنوان یک ثانیه شمار بسیار دقیق استفاده می کنند! پایه های OC0 و OC1A و OC1B و OC2 نیز پایه های خروجی متناظر با هر تایمر هستند. که در ادامه با این ها بیشتر اشنا می شویم!
نحوه انتخاب CLOCK بر اساس بیت های کنترلی ریجستر0 TCCR: 7 6 5 4 3 2 1 0 Bit -- -- -- -- -- CS02 CS01 CS00 Read/Write R RRRR/W R/W R/W R/W Initial value 0 0 0 0 0 0 0 0
TIMER0 تایمر صفر و تایمر دو در خانواده AVR تا 90 درصد شبیه به هم بوده لذا در اینجا تمامی خصوصیات برای تایمر صفر بیان می شود در هنگام برخورد با مسائل تایمر ها باید مراحل زیر را بدانیم: 1-تعیین مد کاری تایمر (مد های 4 گانه) 2-تعیین فرکانس کاری تایمر (تنظیم بیت های prescale) 3-تنطیم خصوصیات شکل موج خروجی تایمر (در صورت نیاز) 4-در صورت نیاز به وقفه فعال کردن بیت فعال کننده آن در ریجستر TIMSK نکته :سه مورد اول بر روی رجیستر TCCR اثر گذاری میکنند لذا اولین قدم در برنامه نویسی تایمر ها تنظیم این رجیستر است.
Timer Modes : 1- Normal Mode 2- CTC (Clear Timer On Compre Match) 3- Fast PWM :(Fast Pulse Width Modulation) 4- Phase Correct PWM نکته:این مد ها برای هر تایمر به صورت جداگانه توسط 2 بیت WGM در رجیستر TCCR تنظیم میگردد
نحوه انتخاب مد عملکرد تایمر/ کانترصفرتوسط ریجسترTCCR :
مُدهای مختلف تایمرها: 1. مُد نرمال در این مُدِ ساده و ابتدایی، ثبات TCNTnهمواره بصورت افزایشی کار می کند و زمانی که به حداکثر مقدار خود (0xFFبرای Timer0، Timer2 و 0xFFFF برای Timer1) برسد مقدار TCNTn صفر می شود و پرچم سرریز TOVn را یک می کند و درصورت فعال بودن وقفه سرریز تایمر، مسیر برنامه را برای اجرای روتین وقفه تغییر می دهد! استفاده از ثبات OCRn برای مقایسه با ثبات TCNTn نیز در این مُد فعال می باشد و می تواند در ازای برابری این دو ثبات، یک وقفه را ایجاد کند! اما این کار در مُد نرمال توصیه نمی شود چرا که از لحاظ سخت افزاری CPU را بسیار مشغول می کند!
مُدهای مختلف تایمرها: 2. مُد CTC (Clear Timer on Compare match): در این مُد، مشابه مُد نرمال زمانی که مقدار ثبات TCNTn با ثبات OCRn یکسان گردد، مانند مُد نرمال پرچم OCFn را یک می کند و مسیر برنامه را برای اجرای وقفه تغییر می دهد. اما برخلاف مُد نرمال که تایمر به شمارش ادامه می داد، در این مُد پس از یکسان شدن این دو ثبات، مقدار ثبات TCNTn صفر می شود!
Example-15 یک قطار پالس مربعی 5 کیلو هرتز بر روی پایه OC0 ایجاد کنید برای نوشتن این برنامه از تایمر صفر در مد CTC استفاده می کنیم
مُدهای مختلف تایمرها: 3. مُد Fast PWM (Fast Pulse Width Modulation): در این مُد نیز مقدار ثبات TCNTn بصورت پلکانی افزایش پیدا می کند و مقدار این ثبات همواره با ثبات OCRn در حال مقایسه می باشد. زمانی که محتوای این دو ثبات با هم برابر گردد، (در حالتِ Non-Inverted) سطح ولتاژِ پایه OCn، صفر (Low) می شود و زمانی که مقدار TCNTn به حداکثر مقدار خود برسد سطح ولتاژِ پایه OCn، یک (High) می شود. بدین وسیله می توانیم یک موج PWM در پایه OCn تولید کنیم. دقت شود که برای این کار بایستی پایه OCn بصورت خروجی تعریف شده باشد. فرکانس بالای این موج کاربردهای زیادی را برای ما دارد: 1. موتورها DC: برای کنترل سرعت 2. چراغ ها: برای تنظیم روشنایی 3. منابع تغذیه سویئچینگ: برای بدست آوردن ولتاژ خروجی 4. آمپلیفایرهای صوتی
مُد Fast PWM: Max Value 0 1 Non Inverted 0 1 Inverted 0
نحوه تعیین حالت خروجی موج PWM در مد Fast PWM
Example-16 یک پالس PWM با فرکانس 4 کیلو هرتز و زمان وظیفه 20% ایجاد کنید
H-Bridge • برای کنترل موتورهای DC در دو جهت مختلف از این تکنیک استفاده می کنیم:
مُدهای مختلف تایمرها: 4. مُد Phase Correct PWM: در این مُد، تایمر بصورت افزایشی تا حداکثر مقدار خود افزایش پیدا می کند ولی پس از رسیدن به مقدار ماکسیمم دیگر صفر نمی شود، بلکه بصورت کاهشی تا اینکه به صفر برسد کاهش پیدا می کند! در این مُد نیز همواره ثبات TCNTn با ثبات OCRn مقایسه می شود و در ازای مُدی که در آن قرار دارد (Non-Inverted یا Inverted) می تواند یک موج PWM برای ما تولید کند. دقت شود که حداکثر فرکانس موج PWM تولید شده در این مُد به دلیل دو شیبه بودن این تایمر(یک شیب از صفر تا رسیدن به ماکسیمم و یک شیب از مقدار ماکسیمم تا صفر) نصف مُد Fast PWM می باشد.
نحوه تعیین حالت خروجی موج PWM در مد Phase Correct PWM
وقفه ها در تایمر ها • برای اینکه بتوان از وقفه ها در واحد تایمر میکرو کنترلر AVR استفاده کرد باید سه مرحله زیر را انجام دهیم: • 1-ست کردن بیت هفتم ریجستر وضعیت با دستور asm(“sei”) • 2-تنظیم ریجستر فعال کننده وقفه تایمر ها به نام TIMSK(timer/counter interrupt mask register) 3-تست پرچم های وقوع وقفه در ریجستر ی با نام TIFR(timer/counter interrupt flag register)
TIMSK(timer/counter interrupt mask register) • برای اینکه بتوانیم از سر ریز شدن تایمر برای ایجاد وقفه استفاده کنیم، باید از این رجیستر استفاده شود اگر این بیت را یک کنیم و وقفه کلی فعال باشد,در صورت تحریک شدن واحد capture توسط خروجی مقایسه کننده آنالوگ داخلی یا سیگنال اعمال شده به پایه ICP,وقفه مربوط به واحد تسخیر کننده فعال میگردد و میتوان محتوای ریجستر1 ICR را بررسی کرد اگر این بیت را یک کنیم و وقفه کلی فعال باشد با تطبیق مقایسه واحد Aیعنی برابری ریجستر TCNT1با ریجستر OCR1Aپرچم تطبیق واحد A تایمر یا کانتر یک , موجب ایجاد شدن وقفه تطبیق مقایسه میگردد اگر این بیت را یک کنیم و وقفه کلی فعال باشد با تطبیق مقایسه واحد B یعنی برابری ریجستر TCNT1با ریجستر OCR1Bپرچم تطبیق واحد B تایمر یا کانتر یک , موجب ایجاد شدن وقفه تطبیق مقایسه میگردد اگر در این بیت یک نوشته شود و وقفه همگانی فعال شده باشد و تطبیق مقایسه ای تایمر یا کانتر صفر یا دو انجام گیرد وقفه مربوط به مقایسه اجرا می شود. اگر این بیت را یک کنیم وقفه سر ریز تایمر صفر یا یک یا دو فعال میگردد و در صورتی که وقفه همگانی فعال باشد و محتوای تایمرمورد نظر(رجیستر tcnt) از حداکثر خود سریز کند وقفه سریز تایمر صفر یا یک یا دو اجرا می شود
TIFR (Timer/Counter Interrupt Flag Register) تنظیم این بیت ها بستگی به تنظیمات مد ها در ریجستر TCCR هر تایمر دارد . در مد NORMALو مد CTC زمانی که سریز رخ دهد پرچم متناظر با تایمر مورد نظر فعال می شود.زمانی که بردار وقفه اجرا می شود در برگشت از وقفه به طور اتوماتیک توسط سخت افزار این پرچم پاک میگردد . همچنین به روش POLLINGکاربر میتواند با نوشتن یک در این پرچم آن را صفر کند. این پرچم ها زمانی فعال میگردند که مقدار ریجستر TCNT تایمر مربوطه با مقدار OCRدر آن تایمر برابر شود . این پرچم ها می توانند موجب وقفه تطبیق تایمر 0 با 1 یا 2 گردند . همچنین به روش POLLING کاربر میتواند با نوشتن یک در این پرچم ان صفر کند. زمانی که واحد CAPTURE تحریک گردد این پرچم فعال می شود و موجب ایجاد وقفه تسخیر کننده میگردد و در برگشت از وقفه توسط سخت افزار پاک میگردد البته در زمانی که تایمر در مد PWM باشد این پرچم برای دستیابی به مقدار TOP در رجیستر ICR1فعال میگردد
Example-17 تولید موج مربعی با T=512us بر روی پورت A #include<mega32.h> #define xtal 8000000 void delay() { TCCR0=0x02; // Timer Clock = CLK/8 TCNT0=0; while(TCNT0!=255); // Wait Until Overflow TCCR0=0x00; // Stop Timer0 } void main() { DDRA=0xFF; TCCR0=0x00; while(1){ PORTA.0=1; delay(); PORTA.0=0; delay(); } }
#include<mega32.h> #define xtal 8000000 interrupt [TIM0_OVF] void puls1(void) { PORTA.0=~PORTA.0; TCNT0=0X00; } void main() { DDRA=0xFF; TCCR0=0x02; TIMSK=0x01; #asm (“sei”) TCNT0=0X00; while(1); } مثال: حل مسئله قبل با استفاده از وقفه:
Timer 1 • این تایمر از نظر عملکرد تمامی خصوصیات تایمر صفر را دارد با این تفاوت که 16 بیتی است و مقدار TOP آن در مد های PWM قابل تنظیم است .همچنین این تایمر دارای ویژگی مهم capture است.این تایمر دارای رجیستر های 16 بیتیOCR1A/B,TCNT1و ICR1 و رجیستر های 8 بیتی TCCR1A/B می باشد. • واحد capture چیست؟ این واحد دارای ریجستر 16 بیتی ICR1 است .اگر بیت فعال کننده این واحد را در ریجستر B1TCCR فعال کرده باشیم در هنگام روشن کردن تایمر ،تایمر با توجه به سرعت کلاک خود شروع به شمارش میکند. حال اگر یک سیگنال خارجی در لحظه t به پایه ICP اعمال گردد محتوای ریجستر تایمر یک یعنی TCNT1 در همان لحظه t درون ریجستر ICR1 کپی می شود. نکته:این واحد را نیز میتوان به صورت داخلی و توسط واحد مقایسه کننده آنالوگ نیز تحریک کرد. نکته:این واحد با لبه تحریک شده و می تواند جهت جلوگیری از ورود نویز توسط یک فیلتر دیجتال در 4 سیکل ماشین عملیات نمونه برداری صورت گیرد (برای فعال کردن واحد حذف کننده نویز باید بیت ICNC1 (Input Capture Noise canceler)واقع در TCCR1B را یک کرد).
کاربرد های واحد capture • از جمله میتوان به مواردی مانند: • اندازه گیری duty cycle(سنسور smt160) • اندازه گیری زمان برگشت پالس متر دیجیتال(متر دیجیتال) • و...... اشاره کرد
تنظیمات کلاک برای تایمر 1 در ریجستر TCCR1
نحوه تعیین حالت خروجیدر مد NORMAL)یا(CTC
نحوه تعیین حالت خروجیدر مدPhase Correct
تنظیمات کلاک برای تایمر 2 در ریجستر TCCR2
تولید موج سینوسی به وسیله تایمرها: ولتاژ خروجی میکروکنترلر نمی تواند منفی شود، اما برای تولید ولتاژ سینوسی به مقادیر منفی نیاز داریم، لذا منابع سه فاز را مطرح می کنیم: اختلاف فاز موج سینوسی میان هر سه سیم، 120 درجه است و با این ایده میان هر دو سیمی که انتخاب کنیم موج کامل سینوسی را مشاهده می کنیم.
تولید موج سینوسی به وسیله تایمرها: • از یک تایمر برای تولید کمان و زاویه سینوسی مورد نظرمان استفاده می کنیم و از یک تایمر دیگر به عنوان تولید کننده موج PWM برای تولید ولتاژهای مختلف بر حسب زاویه سینوس استفاده می کنیم. • به یکی از خروجی ها موج سینوسی با اختلاف فاز 0 می دهیم و به دیگری موج سینوسی با اختلاف فاز 120 درجه می دهیم. • اما . . . خروجی این دو پایه را می بایست فیلتر کنیم!!
RTC تایمر شماره 2 دارای یک قابلیت وِِیژه است که توسط یک ریجستر کنترلی یه نام ASSRکنترل می شود این تایمر دارای یک مد عملکرد آسنکرون است.این آسنکرون بودن موجب میشود که این تایمر بتواند در این مد کلاک کاری خود را جدا از سیتم توسط دو پینTOSC1وTOSC2 با اتصال به یک کریستال ساعت32.768K تامین کند.لذا میتواند به صورت بسیار دقیق زمان واقعی را اندازه گیری کند.
ASSR(Asynchronous status register) • پیکره بندی RTC با این ریجستر انجام می شود
کانتر ها: • کانتر چیست؟ • در میکرو کنترلر های AVR دو پایه به نام t0, t1 داریم که به ازای اعمال یک لبه بالا رونده یا پایین رونده یک واحد به محتوای ریجستر تایمر یعنی tcntاضافه میکند.با خواندن این ریجستر در برنامه و ذخیره آن می توان پی به تعداد پالس مورد نظر مثلا از یک سنسور برد • چند مورد استفاده عملی از کانتر ها: 1-اندازه گیری فرکانس 2-اندازه گیری تعداد دور ماشین های الکتریکی 3-بدست آوردن اختلاف فاز دو سیگنال الکتریکی نسبن به یکدیگر 4-اندازه گیری مقدار سلف و خازن و... 5-بدست اوردن پارمتر های حیاتی مانند ضربان قلب یک بیمار 6-خواندن هرنوع سنسوری که بر حسب تغییرات فرکانسی عمل میکند
چگونگی استفاده از تایمر ها در مد کانتر: • برای استفاده از تایمر های میکرو کنترلر avrدر مد کانتر باید توسط ریجستر TCCR و بیت های پری اسکالر (cs00,cs01,cs02) این کار صورت پذیرد 0 1 1 پایه t0 کانتر با لبه پایین رونده 1 1 1 پایه t0 کانتر با لبه بالا رونده 0 1 1 پایه t1 کانتر با لبه پایین رونده 1 1 1 پایه t1 کانتر با لبه بالا رونده