Presentation is loading. Please wait.

Presentation is loading. Please wait.

Timer Counter 1 Lecturer: Reza Arjmandi Autumn 2015 Lecture 14, 15: Introduction Timer/Counter1 Registers, initialization.

Similar presentations


Presentation on theme: "Timer Counter 1 Lecturer: Reza Arjmandi Autumn 2015 Lecture 14, 15: Introduction Timer/Counter1 Registers, initialization."— Presentation transcript:

1 Timer Counter 1 Lecturer: Reza Arjmandi Autumn 2015 Lecture 14, 15: Introduction Timer/Counter1 Registers, initialization

2 AVR Microcontroller-General Structure AVR CPU BUS Flash Memory SRAM EEPROM Timer/ Counter Timer/ Counter USART TWI ADC MCU Control and Timing I/O Ports Interface I/O Ports Interface Watchdog Timer SPI ISP Interrupt Unit PORTDPORTCPORTBPORTA Internal Calibrated Oscillator Crystal Oscillator ATMEGA32 Block Diagram: DataSheet Page4

3 Timer/Counter1 Accuracy: 16 Bit Modes:1-Normal2-CTC (2 Mode) 3-FastPWM (5Modes)4-Phase correct PWM (5 Modes) 5-Phase & Frequency Correct PWM (2 Modes) Pins: T1: پایه ورودی برای اتصال منبع کلاک خارجی OC1A & OC1B: پایه خروجی برای تولید شکل موج ICP1: Input Capture Pin Prescalar N: 1, 8, 64, 256, 1024 TCNT1 رجیستر شمارش : OCR1A رجیستر مقایسه : OCR1B رجیستر مقایسه : نکته ! برای تولید شکل موج خروجی باید پین های مربوط به آن به صورت خروجی پیکره بندی شود Timer/ Counter1 Timer/ Counter1

4 Timer/Counter1-Modes-Normal Bottom Max(=0xFFFF) TOP(=Max) OC1A OCR1A Max=65535 TOP=Max Bottom= Change By TCNT1 OCR1x Update= Immediate Compare Match Interrupt A  OCF1A=1; OverFlow Interrupt  TOV1=1; Duty Cycle=50% Normal Mode Formula: F OC =F system /(2*N*(65536-Bottom)) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer Normal Mode Formula: F OC =F system /(2*N*(65536-Bottom)) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1B Compare Match Interrupt B  OCF1B=1; OC1B از این مد معمولا برای تولید شکل موج استفاده نمیشود و بیشتر به عـنـوان Counter و نـیز Input Capture مورد استفاده قرار میگیرد

5 Timer/Counter1-Modes-CTC CTC: Clear Timer on Compare Match Bottom Max(=0xFFFF) OC1A Max=65535 TOP=Change By OCR1A or ICR1(2 Modes) Bottom= Change By TCNT1 OCR1x Update= Immediate OCR1A یا ICR1 Compare And Overflow interrupt  TOV1=1,OCF1A=1 or ICF1=1 Duty Cycle=50% CTC Mode Formula: F OCx =F system /2*N*(1+TOP) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1A-B or ICR1= مقدار تاخیر دلخواه / دوره تناوب CTC Mode Formula: F OCx =F system /2*N*(1+TOP) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1A-B or ICR1= مقدار تاخیر دلخواه / دوره تناوب مدکاری CTC معمولا برای ایجاد زمان های تاخیر دلخواه ونیز برای تولید شکل موج هایی با فرکانس های متفاوت استفاده میشود OCR1A یا ICR1 OCR1B OC1B Compare interrupt  OCF1B=1

6 Timer/Counter1-Modes-Fast PWM PWM: Pulse Width Modulation Duty Cycle= قابل تغییر Max=65535 TOP=5 Modes Bottom= Change By TCNT1 OCR1x Update= TOP Bottom Max(=0xFFFF) OC1A-B Non-Inverted Inverted Fast PWM Mode Formula: F PWM =F system /N*(1+TOP) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1A-B = %dutyCycle * TOP Fast PWM Mode Formula: F PWM =F system /N*(1+TOP) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1A-B = %dutyCycle * TOP از این مد بیشتر برای تولید شکل موج در خروجی استفاده میشود OverFlow Interrupt  TOV1=1; Compare Match Interrupt  OCF1A-B=1; OCR1A-B TOP = 5 حالت ModesTOP FastPWM-8Bit 0xFF FastPWM-9Bit 0x1FF FastPWM-10Bit 0x3FF FastPWM ICR1 FastPWM OCR1A

7 Timer/Counter1-Modes-Phase Correct PWM Bottom Max(=0xFFFF) TOP=5 حالت Duty Cycle= قابل تغییر Max=65535 TOP=5 Modes Bottom= Change By TCNT1 OCR1x Update= TOP OverFlow Interrupt  TOV1=1; Compare Match Interrupt  OCF1A-B=1; Phase Correct PWM Mode Formula: F PWM =F system /2*N*TOP F timer =F system /N T timer =1/F timer T overflow =(256-Bottom)*T timer OCR1A-B=%dutyCycle * TOP Phase Correct PWM Mode Formula: F PWM =F system /2*N*TOP F timer =F system /N T timer =1/F timer T overflow =(256-Bottom)*T timer OCR1A-B=%dutyCycle * TOP OCR1A-B OC1A-B Non-Inverted Inverted ModesTOP PWM-8Bit 0xFF PWM-9Bit 0x1FF PWM-10Bit 0x3FF PWM ICR1 PWM OCR1A

8 Timer/Counter1-Modes-Phase & Frequency Correct PWM Bottom Max(=0xFFFF) TOP=2 حالت Duty Cycle= قابل تغییر OverFlow Interrupt  TOV1=1; Compare Match Interrupt  OCF1A-B=1; OCR1A-B OC1A-B Non-Inverted Inverted ModesTOP PWM ICR1 PWM OCR1A Phase & Frequency Correct PWM Mode Formula: F PWM =F system /2*N*TOP F timer =F system /N T timer =1/F timer T overflow =(256-Bottom)*T timer OCR1A-B=%dutyCycle * TOP Phase & Frequency Correct PWM Mode Formula: F PWM =F system /2*N*TOP F timer =F system /N T timer =1/F timer T overflow =(256-Bottom)*T timer OCR1A-B=%dutyCycle * TOP Max=65535 TOP=2 Modes Bottom= Change By TCNT1 OCR1x Update= Bottom

9 Timer/Counter1-Input Capture فرمان Capture: صدور فرمان Capture باعث کپی شدن محتوای رجیستر TCNT1 در رجیستر ICR1 میشود. امکان فعال سازی یک وقفه داخلی نیز وجود دارد فرمان Capture از طریق پایه ICP1 و یا خروجی مقایسه کننده ‌ ی آنالوگ (Analog Comparator) صادر شود. ( به طور پیش فرض دریافت فرمان Capture به عهده ‌ ی ICP1 است ) واحد Input Capture به منظور « تشخیص زمان وقوع یک رخداد خارجی » به کار برده میشود. تشخیص زمان وقوع یک رخداد میتواند برای محاسبه ‌ ی فرکانس، duty cycle و... به کار رود معمولا از این واحد در مد نرمال به راحتی استفاده میشود حس شدن فرمان Capture توسط پایه ICP1 مستلزم آن است که این پایه به صورت ورودی تعریف شود اندازه گیری زمان بین دو رخداد بوسیله واحد Input Capture ( فرمول ها برای مد نرمال ) : اگر TimeOld>TimeNew : T total = (n * 65535) + (TimeNew – TimeOld) اگر TimeOld<TimeNew : T total = ((n – 1) * 65535) + (TimeNew – TimeOld)

10 Timer/Counter1-Input Capture-Noise Canceler واحد Input Capture از یک امکان سخت افزاری برای حذف نویز بهره میبرد که Noise Canceler نام دارد. در صورت فعال بودن این سخت افزار از سیگنال اعمال شده به پایه ICP1 چهار نمونه ‌ ی یکسان گرفته شده و در صورت برابری آن ها فرمان Capture صادر میشود. بنابراین سیگنال ورودی روی پایه ICP1 باید برای چهار پالس سیستم معتبر باشد

11 Timer/Counter1-Interrupt 1- Overflow Interrupt بیت Flag: TOV1 بیت فعال ساز اختصاصی : TOIE1 بردار وقفه در IAR: TIMER1_OVF_vect 2- Compare Match Interrupt A بیت Flag: OCF1A بیت فعال ساز اختصاصی : OCIE1A بردار وقفه در IAR: TIMER1_COMPA_vect 3- Compare Match Interrupt B بیت Flag: OCF1B بیت فعال ساز اختصاصی : OCIE1B بردار وقفه در IAR: TIMER1_COMPB_vect 4- Capture Interrupt بیت Flag: ICF1 بیت فعال ساز اختصاصی : TICIE بردار وقفه در IAR: TIMER1_CAPT_vect

12 Timer/Counter1-Register 1- TCCR1A 2- TCCR1B 3- TCNT1 4- OCR1A 5- OCR1B 6- ICR1 7-TIMSK 8-TIFR 9-SFIOR for Timer/Counter1 for All Timer/Counters

13 Timer/Counter1-Register-TCCR1A & TCCR1B TCCR: Timer/Counter Control Register توسط این رجیستر تنظیمات مربوط به انتخاب مدکاری، انتخاب منبع پالس، پیکره بندی پایه ‌ های خروجی و تنظیمات واحد Input Capture انجام میشود.

14 Timer/Counter1-Register-TCCR1A & TCCR1B بیت های انتخاب منبع پالس (CS12~10): CS: Clock Select

15 Timer/Counter1-Register-TCCR1A & TCCR1B بیت های انتخاب مد کاری (WGM13~10): WGM: Waveform Generation Mode

16 Timer/Counter1-Register-TCCR1A & TCCR1B بیت های تعیین وضعیت پایه های OC1A و OC1B(COM1xx) COM: Compare Output Mode

17 بیت تغییر اجباری پایه خروجی OC1A و OC1B : FOC: Force Output Compare match Timer/Counter1-Register-TCCR1A & TCCR1B این بیت فقط زمانی set میشود که یک حالت non-PWM (Normal-CTC) را انتخاب کرده باشید. در هنگام set کردن این بیت (FOC1A) ، یک تغییر وضعیت روی پایه OC1A ایجاد میشود در زمان Set شدن این بیت Flag مقایسه خروجی OCF1A ست نمیشود و وقفه ‌ ای بوجود نخواهد آمد این بیت در کل هیچ تاثیری بر هیچ رجیستر و Flag ی ندارد و فقط وضعیت پایه OC0 را با توجه به تنظیمات آن تغییر میدهد در زمان set کردن بیت FOC1B نیز حالت مشابهی برای پایه OC1B رخ میدهد.

18 Timer/Counter1-Register-TCCR1A & TCCR1B بیت های مربوط به واحد Input Capture: بیت فعال ساز برای حذف نویز (Noise Canceler) در واحد Input Capture: ICNC: Input Capture Noise Canceler بیت انتخاب نوع تریگر روی پایه ورودی ICP1: ICES: Input Capture Edge Select در صورت Set شدن این بیت تریگر پایه ICP1 بصورت پالس با لبه ‌ ی بالارونده (rising edge) انجام میشود و در صورت Clear شدن این بیت تریگر پایه ICP1 بصورت پالس با لبه ‌ ی پایین رونده (falling edge) انجام می ‌ پذیرد.

19 Timer/Counter1-Register-TIMSK & TIFR TIMSK: Timer/Counter Interrupt Mask Register TIFR: Timer/Counter Interrupt Flag Register Timer/Couner1 Interrupts: 1- Overflow Interrupt بیت Flag: TOV1 بیت فعال ساز اختصاصی : TOIE1 بردار وقفه در IAR: TIMER1_OVF_vect 2- Compare Match Interrupt A بیت Flag: OCF1A بیت فعال ساز اختصاصی : OCIE1A بردار وقفه در IAR: TIMER1_COMPA_vect 3- Compare Match Interrupt B بیت Flag: OCF1B بیت فعال ساز اختصاصی : OCIE1B بردار وقفه در IAR: TIMER1_COMPB_vect 4- Capture Interrupt بیت Flag: ICF1 بیت فعال ساز اختصاصی : TICIE بردار وقفه در IAR: TIMER1_CAPT_vect void main(void) { TCCR1B|=(1<<CS11); TIMSK|=(1<<TOIE1); //overflow interrupt enable; asm(“sei”); while(1) … } #pragma vector=TIMER1_OVF_vect __interrupt void function(void) {code for overflow}

20 Timer/Counter1-Register-SFIOR SFIOR: Special Function I/O Register PSR10: Prescaler for timer/counter 0 and 1 هنگامی که مقدار بیت صفر از این رجیستر برابر 1 است واحد prescaler مربوط به تقسیم پالس برای تایمر / کانتر صفر و یک درحال ریست میباشد این بیت بصورت خودکار تغییر میکند و نمیتوان در آن تغییری ایجاد کرد

21 Timer/Counter1-Example1 با استفاده از مد CTC ، دو موج مربعی با فرکانس 1KHz و اختلاف زمانی 400us بر روی پایه های OC1A و OC1B ایجاد نمایید ( کلاک سیستم 8MHz است و N=8 انتخاب شود ( #include void main(void) { DDRD|=(1<<PD4)|(1<<PD5);//Output OC1A and OC1B OCR1A=499;//set for 1000 count OCR1B=99;//to 100 us delay TCCR1A=((1<<COM1A0)|(1<<COM1B0));//CTC top=OCR1A TCCR1B=((1<<WGM12)|(1<<CS11));//prescale: 8 //OC1A output: toggle //OC1B output: toggle } 1KHz = 8MHz / 2 * 8 * (1 + TOP)  TOP = OCR1A = 499 Ftimer = 8MHz / 8 Ttimer = 1 / 1MHz = 1us  OCR1B = 99 CTC Mode Formula: F OCx =F system /2*N*(1+TOP) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1A-B or ICR1= مقدار تاخیر دلخواه / دوره تناوب CTC Mode Formula: F OCx =F system /2*N*(1+TOP) F timer =F system /N T timer =1/F timer T overflow =(65536-Bottom)*T timer OCR1A-B or ICR1= مقدار تاخیر دلخواه / دوره تناوب

22 Timer/Counter1-Example2 :Wave Generator تولید موج سینوسی، شرایط مسئله به صورت زیر میباشد : Mode: FastPWM 8-bit Fsystem= 8MHz TOP=0xFF OC1A: Set at TOP, clear on compare #include __flash char sinewave[]={ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23, 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c, 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c, 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae, 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8, 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5, 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7, 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc, 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3, 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83, 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51, 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27, 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a, 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01 }; char i=0; void main(void) { DDRD=0xFF; TCCR1A=(1<<COM1A1)|(1<<WGM10); TCCR1B=(1<<WGM12)|(1<<CS10); TIMSK=(1<<OCIE1A); asm("sei"); while (1); } #pragma vector=TIMER1_COMPA_vect __interrupt void tmp(void) { OCR1A=sinewave[i]; i++; if(i==255)i=0; }

23 Timer/Counter1-Example3 :Wave Analyzer با استفاده از واحد Input capture تایمر / کانتر یک سیستمی طراحی کنید که امکان اندازه گیری دوره تناوب و عرض پالس موج های مربعی را اندازه گرفته و روی LCD نمایش دهد

24 Timer/Counter1-Example3 #include #include "LCDCHR_lib.c" #include #define ICP1 PIND_Bit6 int start_time,stop_time,period,pulse_width; void main(void) { LCDinit(); PORTD|=(1<<PD6); TCCR1B|=(1<<CS11)|(1<<ICES1); TIMSK|=(1<<TICIE1); asm("sei"); while(1) { LCDclr(); LCDGotoXY(0,0); LCDstring("Period: "); LCD_intnum(period); LCDGotoXY(0,1); LCDstring("PW: "); LCD_intnum(pulse_width); __delay_cycles(8000000); } #pragma vector=TIMER1_CAPT_vect __interrupt void isr(void) { TCCR1B^=(1<<ICES1); if(ICP1==1) { period=ICR1 - start_time; pulse_width = stop_time - start_time; start_time=ICR1; } else stop_time=ICR1; }

25 Timer/Counter-PWM Application انتقال اطلاعات الکترونیک قدرت منابع تغذیه سوییچینگ کنترل دور موتور کنترل شدت نور کاربرد های صوتی

26 Timer/Counter-PWM Application-DC Motor With BrushBrushless

27 Timer/Counter-PWM Application-DC Motor کنترل دور موتور DC:

28 Timer/Counter-PWM Application-DC Motor کنترل دور موتور DC: #include unsigned char __flash SEG[]={0xC0,0xF9,0xA4, 0xB0,0x99,0x92,0x83,0xF8,0x80,0x90}; unsigned long int i,j,k; main() { DDRA=0xFF; PORTA=SEG[0]; DDRD|=(1<<PD5)|(1<<PD0); PORTD|=(1<<PD2); TCCR1A|=(1<<WGM10)|(1<<WGM11)|(1<<COM1A1);//Phase Correct PWM 10 bit TCCR1B|=(1<<CS10)|(1<<CS11); OCR1A=1; asm("sei"); while(1) { if(PIND_Bit2==0) { while(PIND_Bit2==0); if(i==9) { i=0; PORTA=SEG[0]; } else { i+=1; PORTA=SEG[i]; OCR1A=i*113+5; } }

29 Timer/Counter-PWM Application-Servo Motor کنترل موتور سروو : #include main() { DDRD|=(1<<PD5); TCCR1A|=(1<<COM1A1); //PWM, Phase & Freq Correct with ICR1 TOP TCCR1B|=(1<<WGM13)|(1<<CS11); ICR1=20000; while(1) { for(OCR1A=1000;OCR1A<2000;OCR1A++) __delay_cycles(20000); for(OCR1A=2000;OCR1A>1000;OCR1A--) __delay_cycles(20000); }

30 Contact us www.e-system.ir Info@e-system.ir


Download ppt "Timer Counter 1 Lecturer: Reza Arjmandi Autumn 2015 Lecture 14, 15: Introduction Timer/Counter1 Registers, initialization."

Similar presentations


Ads by Google