Giới thiệu
Nói chung, chế độ so sánh được sử dụng để tạo ra các sự kiện định kỳ hoặc để tạo ra các dạng sóng.Trong chế độ so sánh, có một thanh ghi so sánh, nơi chúng ta có thể đặt giá trị để so sánh với giá trị thanh ghi Bộ định thời / bộ đếm. Khi giá trị so sánh khớp với giá trị thanh ghi bộ đếm thời gian / bộ đếm, một kết quả so sánh sẽ xảy ra. Sự kiện đối sánh so sánh này có thể được sử dụng để tạo dạng sóng.
Trong ATmega 16/32, Timer đếm lên cho đến khi giá trị của thanh ghi TCNT0 (Timer/counter register) bằng với nội dung của OCR0 (Compare register). Ngay sau khi TCNT0 bằng OCR0, một hoạt động so sánh xảy ra, sau đó timer sẽ bị xóa và cờ OCF0 sẽ được thiết lập.
Cờ OCF0 nằm trong thanh ghi TIFR.
Wave generation
Sử dụng Normal mode & CTC mode:TCCR0: Thanh ghi điều khiển Timer / counter
Sau khi thiết lập bit này, bộ đếm thời gian buộc phải khớp, tức là thiết lập cờ so sánh đầu ra.
Vì vậy, chúng ta có thể tạo ra một sóng vuông với các dạng sóng PWM trên chân OC0 (chân so sánh đầu ra) bằng cách sử dụng các chế độ khác nhau.
Bit 5, 4- COM01:00 (compare output mode)
COM01: 00 điều khiển hành vi của chân OC0, tuy nhiên, bit DDR của chân OC0 tương ứng phải được đặt để làm cho chân OC0 làm đầu ra.
Bit 2:0 - CS02:CS00: Clock Source Select
Các bit này được sử dụng để chọn nguồn xung nhịp. Khi CS02: CS00 = 000, thì bộ định thời sẽ dừng. Khi nó nhận giá trị trong khoảng từ 001 đến 101, nó sẽ nhận được nguồn xung nhịp và bắt đầu làm bộ timer.
Tạo sóng vuông
1. Sóng vuông sử dụng mode Normal:Để tạo sóng vuông ở mode Normal, chúng ta có thể đặt bit COM làm chế độ bật tắt (COM01: 00 = 01), do đó chân OC0 sẽ được bật tắt trên mỗi lần so sánh và sóng vuông sẽ được tạo ra.
void main ( )
{
DDRB = DDRB|(1<<3);
TCCR0 = 0x11; /* normal mode, clk- no pre-scaling */
OCR0 = 100; /* compare value */
while (1);
}
![]() |
Tạo dạng sóng bằng mode Normal |
Ở chế độ bình thường, khi một trận đấu xảy ra, chân OC0 sẽ chuyển đổi và bộ đếm thời gian tiếp tục đếm lên cho đến khi nó đạt đến giá trị cao nhất.
Tần số của sóng vuông:
- Giả sử dạng sóng Fosc = 8MHz, T = 0,125 μs.
- Khoảng thời gian của sóng vuông: 2 x 256 x 0,125 μs = 64 μs
- Tần số của sóng = 1/64 μs = 15,625 kHz.
![]() |
Tạo dạng sóng bằng chế độ CTC |
void main ( )
{
DDRB = DDRB|(1<<3); /* PB3 (OC0) as output */
TCCR0 = 0x19; /* CTC mode, toggle on compare match,
clk- no pre-scaling */
OCR0 = 200; /* compare value */
while (1);
}
- Giả sử dạng sóng Fosc = 8MHz, T = 0,125 μs.
- Khoảng thời gian của sóng vuông: 2 x (OCR0 + 1) x 0,125 μs = 2 x 201 x 0,125 μs = 50,25 μs
- Tần số của sóng vuông = 1 / 50,25 μs = 19,9 KHz.
void main ( )
{
DDRB |= (1<<3); /*PB3 (OC0) as output */
while (1)
{
OCR0 = 69;
/* CTC, set on match, no prescaler */
TCCR0 = 0x39; <=> TCCR0 = (1<<WGM01)|(1<<COM01)|(1<<COM00)|(1<<CS00);
while ((TIFR&(1<<OCF0)) == 0); /* monitor OCF0 flag */
TIFR = (1<<OCF0);/* Clear OCF0 by writing 1 */
OCR0 = 99;
/* CTC, clear on match, no prescaler */
TCCR0 = 0x29; <=> TCCR0 = (1<<WGM01)|(1<<COM01)|(0<<COM00)|(1<<CS00);
while ((TIFR&(1<<OCF0)) == 0);
TIFR = (1<<OCF0);/* Clear OCF0 by writing 1 */
}
}