1. Trang chủ
  2. » Công Nghệ Thông Tin

sử dụng timer counter

22 1,2K 4
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 22
Dung lượng 1,54 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trên các chip AVR, các bộ Timer/Counter còn có thêmchức năng tạo ra các xung điều rộng PWM Pulse Width Modulation, ở một số dòngAVR, một số Timer/Counter còn được dùng như các bộ canh ch

Trang 1

I, Mở đầu

Phần này, chúng ta sẽ học và nắm được các vấn đề sau:

• Nắm bắt cơ bản các bộ Timer/Counter có trên AVR

• Sử dụng các Timer/Counter như các bộ định thời

• Sử dụng các Timer/Counter như các bộ đếm

• Sử dụng các Timer/Counter như các bộ tạo xung điều rộng PWM

• Viết một ví dụ điều khiển động cơ RC servo bằng PWM

II, Tổng quan về các bộ timer/counter trên chip atmega16

Timer/Counter là các module độc lập với CPU Chức năng chính của các bộTimer/Counter, như tên gọi của chúng, là định thì (tạo ra một khoảng thời gian, đếmthời gian…) và đếm sự kiện Trên các chip AVR, các bộ Timer/Counter còn có thêmchức năng tạo ra các xung điều rộng PWM (Pulse Width Modulation), ở một số dòngAVR, một số Timer/Counter còn được dùng như các bộ canh chỉnh thời gian(calibration) trong các ứng dụng thời gian thực Các bộ Timer/Counter được chia theo

độ rộng thanh ghi chứa giá trị định thời hay giá trị đếm của chúng, cụ thể trên chipAtmega16 có 2 bộ Timer 8 bit (Timer/Counter0 và Timer/Counter2) và 1 bộ 16 bit(Timer/Counter1) Chế độ hoạt động và phương pháp điều khiển của từngTimer/Counter cũng không hoàn toàn giống nhau, ví dụ ở chip Atmega16:

Timer/counter0: Là một bộ định thời/đếm đa năng 8 bit Gồm các tính năng:

- Bộ đếm đơn kênh (Single Channel Counter)

- Xóa timer khi xảy ra bằng trong so sánh (Clear Timer On Compare Auto Reload)

Math Bộ tạo xung điều rộng (Glitch – Free, Phase Correct Pulse Width ModulatorMath PWM)

Modulator Bộ định thời (Frequency Generator)

- Bộ đếm sự kiện ngoài (External Event Counter)

- Bộ đếm gộp 10 bit (10-bit Prescaler)

- Ngắt tràn và ngắt so sánh (Overflow And Compare Math Interrupt TVO0 and OCF0)

Source-Timer/counter1: Là một bộ định thời/đếm đa năng 16 bit Gồm các tình năng:

- Chuẩn thiết kế 16 bit (True 16-bit Design)

- 2 bộ so sánh đầu ra độc lập ( Two Independent Output Compare Units)

- Các thanh ghi so sánh đầu ra kép (Double Buffered Output CompareRegisters)

- 1 bộ bắt giữ đầu vào (One Input Capture Unit)

- Bộ khử nhiễu đầu vào (Input Capture Noisy Canceler)

Trang 2

- Xóa timer khi sảy ra bằng trong so sánh (Clear Timer On Compare Auto Reload).

Math Bộ tạo xung điều rộng (Glitch – Free, Phase Correct Pulse Width ModulatorMath PWM)

Modulator Variable PWM period

- Bộ định thời (Frequency Generator)

- Bộ đếm sự kiện ngoài (External Event Counter)

- 4 Ngắt độc lập (TOV1, OCF1A, OCF1B, and ICF1)

Timer/counter2: Là bộ định thời/đếm đa năng 8 bit Gồm các tính năng:

- Bộ đếm đơn kênh (Single Channel Counter)

- Xóa timer khi sảy ra bằng trong so sánh (Clear Timer On Compare Auto Reload)

Math Bộ tạo xung điều rộng (Glitch – Free, Phase Correct Pulse Width ModulatorMath PWM)

Modulator Bộ định thời (Frequency Generator)

- Bộ đếm gộp 10 bit (10-bit Prescaler)

- Ngắt tràn và ngắt so sánh (Overflow And Compare Math Interrupt TVO0 and OCF0)

Source Cho phép xung nhịp ngoài 32 kHz hoạt động độc lập với xung nhịp I/O (Ứngdụng thời gian thực)

III, Sử dụng timer/counter.

Một số định nghĩa quan trọng cần nắm bắt trước khi sử dụng timer/counter

− BOTTOM: Giá trị thấp nhất mà một T/C có thể đạt được, luôn là 0

− MAX: Giá trị lớn nhất mà một T/C có thể đạt được, tùy mỗi T/C VD: T/C0,T/C 2 là các T/C 8 bit nên MAX = 0xFF = 255 = 2^8 – 1 T/C1 là T/C 16 bit nênMAX = 0xFFFF = 65525 = 2^16 – 1

− TOP: là giá trị mà khi T/C đạt đến nó sẽ thay đổi trạng thái, giá trị này khôngnhất thiết là số lơn nhất 8 bit hay 16 bit như MAX, giá trị của TOP có thể thanh đổibằng cách điều khiển các bit điều khiển tương ứng hoặc có thể nhập trừ tiếp thông quamột số thanh ghi Chúng ta sẽ hiểu rõ về giá trị TOP trong lúc khảo sát hoạt động củaT/C

1, Timer/Counter0.

Để điều khiển hoạt động của T/C0 ta dùng đến 5 thanh ghi: TCCR0, TCNT0,OCR0, TIFR, TIMSK

1.1, Thanh ghi điều khiển T/C0 – TCCR0 (Timer/Counter Control Register).

Bit 7 – FOC0: Force Output Compare.

Trang 3

Bit FOC0 chỉ hoạt động khi bit WGM00 được sét ở chế độ non-PWM Tuy nhiên,

Để đảm bảo tính tương thích, bit này phải được sét về 0 khi TCCR0 được ghi ở chế độPWM

Bit 6, 3 – WGM00, WGM01: Waveform General Mode

Các bit điều khiển quá trình hoạt động của bộ đếm, giá trị lớn nhất (TOP) của bộđếm, và dạng tín hiệu được sử dụng Các phương thức hoạt động của timer/countergồm có: Chế độ bình thường (Normal Mode), Chế độ xóa timer khi sảy ra bằng trong

so sánh (TCT), và 2 chế độ tạo xung điều rộng (PWM)

Bảng các phương thức hoạt động:

Bit 5, 4 – COM01, COM00: Compare Math Ouput Mode.

Các bit điều khiển kiểu so sánh Nếu một trong hai bit được sét, đầu ra OC0 sẽ ghi

đè lên chức năng của cổng được kết nối Tuy nhiên, cần chú ý bit thanh ghi hướng dữliệu (DDR) của chân kết nối phải là chân ra

Compare Output Mode, non-PWM Mode

:

Compare Output Mode, Fast PWM Mode:

Compare Output Mode, Phase Correct PWM Mode:

Trang 4

Bit 2:0 – CS02:0: Clock select:

3 bit dùng để chọn xung nhịp hoạt động cho Timer/Counter0

Clock Select Bit Description

:

Nếu chế độ dùng xung ngoài được chọn, thì chân T0 sẽ được nối với xung ngoài vàdùng để đếm sự kiện nếu nó được cài đặt là chân ra (bộ đếm sự kiện)

1.2, Thanh ghi Timer/Counter – TCNT0 (Timer/Counter Register).

Thanh ghi TCNT0 cho phép truy cập trực tiếp, cả đọc và ghi

1.3, Thanh ghi so sánh đầu ra – OCR0 (Output Compare Register).

Thanh ghi OCR0 chứa một giá trị 8 bit để so sánh với giá trị của thanh ghi TCNT0

Nó có thể dùng để tạo ra một tín hiệu ngắt, hoặc một dạng tín hiệu ra ở chân OC0

Trang 5

1.4, Thanh ghi mặt nạ ngắt T/C – TIMSK (Timer/Counter Interrupt Mask Register)

Bit 1 - OCIE0: Timer/Counter0 Output Compare Match Interrupt

Enable

Khi bit OCIE0 được ghi lên 1, và bit I của thanh ghi SREG được sét, ngắt

so sánh của T/C0 được bật các ngắt tương ứng được thực thi nếu một so sánh phù

hợp trong Timer/Counter0 xảy ra, tức là, khi bit OCF0 được sét trong thanh ghi cờngắt T/C – TIFR

Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable

Khi bit TOIE0 được viết lên 1, và bit I của thanh ghi SREG được set, Ngắttràn của T/C0 sẽ được bật Các ngắt tương ứng được thực thi nếu sảy ra tràn trongT/C0, tức là, khi bit TOV0 được set trong thanh ghi cờ ngắt T/C – TIFR

1.5, Thanh ghi cờ ngắt T/C – TIFR (Timer/Counter Interrupt Flag Register).

- Bit 1 – OCF0: Output Compare Flag 0

Bit OCF0 được sét khi sảy ra bằng trong so sánh giữa giá trị của T/C0 và dữ liệu ở OCR0 (Output Compare Register0) OCF0 bị xóa khi đang sử lí vector ngắt tương ứng hoặc viết một giá trị logic vào cờ Khi bit I ở thanh ghi SREG, bit OCIE0 và bit OCF0 được set, Ngắt so sánh của T/C0 được bật

- Bit 0 – TOV0: Timer/Counter0 Overflow Flag

Bit TOV0 được sét khi có một sự kiện tràn sảy ra ở T/C0 Bit TOV0 bị xóa khi đang sử lí vector ngắt tương ứng hoặc ghi một giá trị logic vào cờ Khi bit I ở thanh ghi SREG, bit TOIE0 và bit TOV0 được set, Ngắt tràn của T/C0 được bật Ởchế độ Phase Correct PWM, bit này được set khi T/C0 đổi chiều đếm ở 0x00

1.6, Thanh ghi chức năng vào/ra đặc biệt – SFIOR (Special Function I/O Register)

Trang 6

Bit 0 – PSR10: Prescaler Reset Timer/Counter1 and Timer/Counter0

Khi bit này được ghi lên 1, bộ đếm gộp T/C1 và T/C0 sẽ được reset Bit bị xóasau khi quá trình thực hiện hoàn thành Ghi giá trị 0 vào bit này sẽ không có tácdụng gì

Chú ý: T/C1 và T/C2 có bộ đếm gộp giống nhau và một reset của bộ đếm gộp

sẽ tác động lên cả 2 Bit này luôn bằng 0

1.7, Bộ định thời

Chúng ta có thể tạo ra 1 bộ định thì để cài đặt một khoảng thời gian nào đó Ví dụbạn muốn rằng cứ sau chính xác 1ms thì chân PB0 thay đổi trạng thái 1 lần (nhấpnháy), bạn lại không muốn dùng các lệnh delay như trước nay vẫn dùng vì nhượcđiểm của delay là “CPU không làm gì cả” trong lúc delay, vì thế trong nhiều trườnghợp các lệnh delay rất hạn chế được sử dụng Bây giờ chúng ta dùng T/C0 để làm việcnày, ý tưởng là chúng ta cho bộ đếm T/C0 hoạt động, khi nó đếm đủ 1ms thì nó sẽ tựkích hoạt ngắt tràn, trong trình phục vụ ngắt tràn chúng ta hay đổi trạng thái chânPB0 Tôi minh họa ý tưởng như trong hình 1

Hình 1: so sánh 2 cách làm việc

(CPU nop: trong khoảng thời gian này CPU không làm gì cả)

Một vấn đề nảy sinh lúc này, T/C0 chỉ đếm từ 0 đến 255 rồi lại quay về 0 (xảy ra

1 ngắt tràn), như thế dường như chúng ta không thể cài đặt giá trị mong muốn bất kỳcho T/C0? Câu trả lời là chúng ta có thể bằng cách gán trước một giá trị cho thanh ghiTCNT0, khi ấy T/C0 sẽ đếm từ giá trị mà chúng ta gán trước và kết thúc ở 255 Tuynhiên do khi tràn xảy ra, TCNT0 lại được tự động trả về 0, do đó việc gán giá trị khởitạo cho TCNT0 phải được thực hiện liên tục sau mỗi lần xảy ra tràn, vị trí tốt nhất làđặt trong trình phục vụ ngắt tràn

Việc còn lại và cũng là việc quan trọng nhất là việc tính toán giá trị chia(prescaler) cho xung nhịp của T/C0 và việc xác định giá trị khởi đầu cần gán chothanh ghi TCNT0 để có được 1 khoảng thời gian định thì chính xác như mong muốn.Trước hết chúng ta sẽ chọn prescaler sao cho hợp lí nhất (chọn giá trị chia bằng cáchset 3 bit CS02,CS01,CS00) Giả sử nguồn xung clock “nuôi” chip của chúng ta làclkI/O=8MHz tức là 1 nhịp mất 1/8us, nếu chúng ta để prescaler=1, tức là tần số củaT/C0 (tạm gọi là fT/C0) cũng bằng clkI/O=8MHz, cứ 1/8us T/C0 được kích vàTCNT0 sẽ tăng 1 đơn vị Khi đó giá trị lớn nhất mà T/C0 có thể đạt được là 256 x

Trang 7

1/8us=32us, giá trị này nhỏ hơn 1ms mà ta mong muốn Nếu chọn prescaler=32 (xembảng 1) nghĩa là cứ sau 32 nhịp (4us) thì TCNT0 mới tăng 1 đơn vị, khả năng lớn nhất

mà T/C0 đếm được là 256 x 4us=1024us, lớn hơn 1ms, vậy ta hoàn toàn có thể sửdụng prescaler=32 để tạo ra một khoảng định thì 1ms Bước tiếp theo là xác định giátrị khởi đầu của TCNT0 để T/C0 đếm đúng 1ms (1000us) Ứng với prescaler=32chúng ta đã biết là cứ 4us thì TCNT0 tăng 1 đơn vị, dễ dàng tính được bộ đếm cầnđếm 1000/4=250 lần để hết 1ms, do đó giá trị ban đầu của TCNT0 phải là 256-250=6

Đầu tiên hãy mắc mạch điện như hình vẽ:

int ms = 0,ss = 0,mm = 0,hh = 0; // bien ngoai

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void) // ngat tran khi TCNT0 tran{

// Reinitialize Timer 0 value

TCNT0=0x79; // set gia tri bot cua TCNT0 la 0x79 = 121

// Place your code here

ms++;

}

Đoạn code cho timer trong hàm main:

TCCR0=0x03; // prescaler la xung nhip cua chip chia cho 64

TCNT0=0x79; // set gia tri bot cua TCNT0 la 0x79 = 121

OCR0=0x00;

TIMSK=0x01; // Bat ngat cua timer/counter0

ACSR=0x80; // set bit I len 1

Trang 8

- Thứ hai: việc khai báo sử dụng LCD tôi đã nói ở bài trước, nếu bạn nào quên thìđọc lại.

- Thứ ba: hàm lcd_putnum(so) không phải là 1 hàm được định nghĩa sẵn trong thưviện lcd.h mà phải tự xây dựng

1.8 Bộ đếm sự kiện

Như đã trình bày ở trên, T/C0 còn có thể được dùng như là một bộ đếm sự kiện sảy

ra từ bên ngoài bằng cách sử dụng xung kích bên ngoài TCCR0 = 0x06 (đếm cạnhxuống) hoặc TCCR0 = 0x07 (đếm cạnh lên) Chân nhận xung kích từ bên ngoài đó làchân T0 Khi có 1 tín hiệu kích vào ở T0 thì TCNT0 sẽ tự động được tăng lên 1 Việc

sử dụng ngắt hay không là tùy vào mục đích sử dụng

Chúng ta sẽ khảo sát ví dụ sau: nối một nút ấn vào chân T0 để tạo tín hiệu kích,dùng LCD để hiển thị giá trị của TCNT0 lên màn hình, một nút reset để đưa giá trịTCNT0 về 0

Trang 9

ta không dùng đến ngắt nên TIMSK = 0x00.

1.9 Phase correct PWM (Điều rộng xung với pha chính xác).

Đây là mode hoạt động rất quan trọng của các bộ timer, thường được dùng trongcác ứng dụng điều khiển động cơ Khi mode này được kích hoạt, một tín hiệu dạngxung sẽ được xuất ra ở chân OC0, tín hiệu này phụ thuộc vào các giá trị mà ta sétcho nó Thanh ghi TCNT0 tự động tăng lên từ giá trị BOTTOM đến TOP và tựđộng giảm từ giá trị TOP về BOTTOM, tốc độ đếm của TCNT0 ở chế độ này cũng

Trang 10

giống với chế độ hoạt động của bộ định thời Giá trị của TCNT0 sẽ được so sánhvới giá trị của thanh ghi OCR0 để điều khiển tín hiệu ra ở chân OC0.

Bit 5, 4 – COM01, COM00 dùng để điều khiển các chế độ làm việc của modePhase correct PWM (khi mode này đang được dùng)

• COM01 = 0, COM00 = 0: disconnect OC0, không xuất tín hiệu ra chânOC0

• COM01 = 0, COM00 = 1: Reserved, chế độ chờ

• COM01 = 1, COM00 = 0: Xóa OC0 về 0 nếu sảy ra bằng trong so sánhkhi đếm lên, và sét lên 1 nếu sảy ra bằng trong so sánh khi đếm xuống

• COM01 = 1, COM00 = 1: Sét OC0 lên 1 nếu sảy ra bằng trong so sánhkhi đếm lên, và xóa về 0 nếu sảy ra bằng trong so sánh khi đếm xuống.Khi sử dụng mode Phase correct PWM ta chủ yếu sử dụng 2 chế độ hoạt độngcuối của nó (COM01 = 1)

Đoạn chương trình sau dùng để khởi tạo C/T0 ở chế độ Phase correct PWM:

32 (Codevision là 64)

 Dòng 3 là giá trị ban đầu của TCNT0

 Dòng 4 là giá trị của thanh ghi OCR0 dùng để so sánh với TCNT0

Điều cần chú ý ở đây là giá trị OCR0 là thanh ghi 8 bít, giá trị của thanh ghi cóthể thay đổi trực tiếp, trong lập trình ta sẽ thay đổi giá trị của thanh ghi này để tạocác xung điều rộng khác nhau

Bây giờ chúng ta sẽ làm một ví dụ nhỏ để hiểu rõ phương thức hoạt động củachế độ Phase correct PWM

Mạch mô phỏng:

Trang 11

Ở đây dùng một dụng cụ để kiểm tra tín hiệu ngõ ra tên là OSCILLOSCOPE:

Trang 12

Đầu tiên ra phải khởi tạo cho T/C0 hoạt động ở chế độ Phase correct PWM như

ở trên Trong hàm main viết đoạn chương trình sau để kiểm tra:

while(1){

1.10 Fast PWM (Điều rộng xung cao tần).

Chức năng nói chung là giống với chế độ Phase correct PWM, nhưng hoạt độngđược ở tần số cao Cũng gồm các chế độ hoạt động giống như Phase correct PWM.Tuy nhiên, cách hoạt động có khác một chút đó là thanh ghi TCNT0 chỉ đếm thựchiện đếm tăng khi đến TOP thì lại reset về 0

• COM01 = 0, COM00 = 0: Disconnect OC0, không xuất tín hiện ra chânOC0

• COM01 = 0, COM00 = 1: Reseved, chế độ chờ

• COM01 = 1, COM00 = 0: Clear OC0 on Compare math, set OC0 atTOP, xóa OC0 về 0 khi sảy ra bằng trong so sánh, set OC0 lên 1 khi đạtgiá trị TOP

• COM01 = 1, COM00 = 0: Set OC0 on Compare math, clear OC0 atTOP, set OC0 lên 1 khi sảy ra bằng trong so sánh, xóa OC0 về 0 khi đạtgiá trị TOP

Đoạn chương trình sau dùng để khởi tạo C/T0 ở chế độ Fast PWM:

Trang 13

CS02 = 0, CS01 = 1, CS00 = 1 tương ứng với Prescaler là chia cho 32(Codevision là 64).

 Dòng 3 là giá trị ban đầu của TCNT0

 Dòng 4 là giá trị dùng để so sánh với TCNT0 chứa trong OCR0

Làm ví dụ tương tự như với Phase correct PWM

1.11 CTC – Xóa timer khi sảy ra bằng trong so sánh.

Giống như tên gọi của nó, thanh ghi TCNT0 sẽ bị xóa về 0 khi sảy ra một

“Compare Math” TCNT0 tự động tăng lên khi có một tín hiệu kích cho đến khi giátrị trong TCNT0 bằng giá trị trong OCR0 thì một “Compare Math” sẽ sảy ra vàreset TCNT0 về 0, đồng thời một ngắt có thể sảy ra nếu đã được kích hoạt trước

đó Cách thức hoạt động của nó giống bộ định thời nếu tín hiệu kích sử dụng làxung nhịp chip và giống bộ đếm sự kiện nếu tín hiệu kích sử dụng là xung từ bênngoài

Ví dụ:

PORTB=0x01; // su dung dien tro keo len cho PB0

DDRB=0x00; // PB la cong nhan tin hieu

PORTC=0x00;

DDRC=0xFF; // PC la cong xuat tin hieu

TCCR0=0x0E; // Su dung che do CTC, tin hieu kich tu ben ngoai canh xuongTCNT0=0x00;

OCR0=0x07; // Gia tri dung de so sanh voi TCNT0

Ngày đăng: 06/07/2014, 09:01

HÌNH ẢNH LIÊN QUAN

Hình 1: so sánh 2 cách làm việc. - sử dụng timer counter
Hình 1 so sánh 2 cách làm việc (Trang 6)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w