Các chế độ hoạt động của TIMER/COUNTER

Một phần của tài liệu Giáo trình vi điều khiển (Trang 57)

4.3.1 CHẾ ĐỘ BÌNH THƯỜNG (NORMAL)

Đây là chế độ hoạt động đơn giản nhất, bộ counter sẽ đếm từ BOTTOM (0x00) tới MAX (0xFF) và lặp lại từ BOTTOM. Cờ tràn TOV0 sẽ tự động bật lên 1 khi bộ counter đếm từ 255 về 0, muốn xóa cờ tràn này ta phải viết logic 1 vào nó, khi sử dụng ngắt thì cờ tràn sẽ tự động xóa về 0, thời gian đếm phụ thuộc vào bộ chia (prescaler) được cài đặt bởi thanh ghi TCCR0, có thể bằng 1, 8, 64, 256 hoặc 1024.

Hình 4.6 Giản đồ thời gian trong hoạt động NORMAL

Bài tập ví dụ: Viết chương trình định thời thời gian là 10 giây, tần số thạch anh là 2Mhz.

Bài giải:

Chu kì máy: = = . = 0.5

Vậy số CKM để chạy trong 10 giây là: ∗

. = 2 ∗ 10 CKM Vậy ta phải chọn bộ chia là 1024 để có được số xung tối thiểu, Số xung tối thiểu = ∗ = 19531.

Vậy ta cần 19531 xung để có được bộ định thời 10 giây.

Nếu sử dụng bộ định thời 8 bit (timer0/timer2) thì ta có: = 76 Vậy cờ tràn TOV0 sẽ có 76 lần bật lên 1.

Vậy ta chọn biến đếm là unsigned char. Chương trình được viết như sau

#include <mega16.h>

unsigned char index;

bit key;

// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) {

// Place your code here

index++; PORTD++; if(index == 76) { PORTC.0 = 1; PORTD = 0; index = 0; key = 1; } }

void main(void) {

PORTA=0x00;

DDRA=0x00; //PORTA là ngõ vào

PORTB=0x00; DDRB=0x00; //PORTB là ngõ vào PORTC=0x00; DDRC=0xFF; //PORTC là ngõ ra PORTD=0x00; DDRD=0xff; //PORTD là ngõ ra TIMSK=0x01; //Cho phép ngắt tràn

ACSR=0x80; //Không sử dụng mode so sánh // Global enable interrupts

#asm("sei")

while (1) {

// Place your code here

TCCR0 = 0; while(PINA.0); TCCR0 = 0x05; //chế độ là normal, bộ chia 1024 PORTC.0 = 0; while(!PINA.0); //chờ nhã phím } }

4.3.2. Chế độ CTC: (xóa khi so sánh bằng) bộ timer/counter sẽ đếm lên, khi giá trị trong thanh ghi counter (TCNT0) bằng với thanh ghi OCR0 (đã cài đặc trước) thì bộ counter thanh ghi counter (TCNT0) bằng với thanh ghi OCR0 (đã cài đặc trước) thì bộ counter sẽ bị xóa về 0 và tiếp tục đếm lên, cờ ngắt OCF0 nếu có sẽ xảy ra khi bộ counter đạt giá trị Max (bằng với OCR0).

Hình 4.8 Giản đồ thời gian trong hoạt động CTC

Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức năng Ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode này được mô tả trong bảng sau:

COM01 COM00 Description (Mô tả)

0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O 0 1 Chân OC0 đảo trạng thái khi TCNT0 = OCR0 (toggle)

1 0 Chân OC0 = 0 khi bằng

1 1 Chân OC1 = 1 khi bằng

Bảng 4.3 Ngõ ra OC0 trong hoạt động CTC

Tần số trên chân OC0 được tính bởi công thức sau:

(3) Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024). Xem bài tập ví dụ 2

4.3.3 Chế độ PWM PHASE CORRECT

Chu kỳ hoạt động của bộ counter là hoạt động kép nghĩa là bộ counter sẽ đếm từ BOTTOM (0x00) đến MAX (0xFF) sau đó đếm từ MAX về BOTTOM và quá trình này lặp lại bất chấp bộ counter lớn hơn, nhỏ hơn hay bằng với OCR0.

Đối với hoạt động ngõ ra không đảo: khi bộ counter (thanh ghi TCNT0) bằng với thanh ghi OCR0 thì OC0 sẽ được xóa về 0, nếu bộ counter đang đếm lên, khi bộ counter đếm xuống thì OC0 sẽ bằng 1.

Đối với hoạt động đảo thì OC0 sẽ hoạt động ngược lại.

Hình 4.9 Giản đồ thời gian trong hoạt động PWM – PHASE CORRECT

Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức năng ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode này được mô tả trong bảng 4.1.

COM01 COM00 Description (Mô tả)

0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O

0 1 Không sử dụng

1 0 OC0 = 0 khi TCNT0 = OC0 trong khi đếm lên OC0 = 1 khi TCNT0 = OC0 trong khi đếm xuống 1 1 OC0 = 1 khi TCNT0 = OC0 trong khi đếm lên OC0 = 0 khi TCNT0 = OC0 trong khi đếm xuống

Bảng 4.4 Ngõ ra OC0 trong hoạt động PWM – PHASE CORRECT

Tần số trên chân OC0 được tính bởi công thức sau:

(4) Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024). Bài tập ví dụ: cho biết thanh ghi OCR0 = 145 và thanh ghi TCCR0 = 0x01100010

4.3.4 Chế độ Fast PWM

Chu kỳ hoạt động của bộ counter sẽ là hoạt động đơn, nghĩa là bộ counter sẽ đếm từ BOTTOM đến MAX sau đó reset về BOTTOM và đếm lên tiếp, quá trình này lặp lại bất chấp bộ counter lớn hơn, nhỏ hơn hay bằng với OCR0.

Ở chế độ không đảo OC0 sẽ bị xóa về 0 khi bộ counter trùng với OCR0, và bằng 1 khi bộ counter bằng BOTTOM.

Ở chế độ đảo thì ngược lại.

Hình 4.10 Giản đồ thời gian cho hoạt động FAST PWM

Tín hiệu OC0 sẽ không được xuất ra trên chân OC0 (PB3) nếu ta không cài đặt chức năng ouput cho chân này (xem thanh ghi DDRB), các trạng thái của OC0 trong mode này được mô tả trong table 40.

COM01 COM00 Mô tả (Description)

0 0 Chân OC0 không kết nối, hoạt động như chức năng I/O

0 1 Không sử dụng

1 0 OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0 OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0 1 1 OC0 = 1 khi TCNT0 bằng OCR0, OC0 = 0 khi TCNT0 = 0 OC0 = 0 khi TCNT0 bằng OCR0, OC0 = 1 khi TCNT0 = 0

Bảng 4.5 Ngõ ra oc0 trong hoạt động FAST PWM

Tần số trên chân OC0 được tính bởi công thức sau:

(5) Với N là giá trị được xác định bởi thanh ghi TCCR0 N = (1, 8, 64, 256 hoặc 1024).

4.4 Bài tập ví dụ

Ví dụ 1: Trong chế độ Normal, tần số thạch anh là 1 Mhz, sử dụng bộ chia là 64, hỏi trong 1 giây timer tràn bao nhiêu lần.

Giải: Dựa vào hình vẽ 4.3 ta nhận thấy rằng, 1 xung ngõ ra của bộ chia bằng 64 chu kì máy (CKM).

Ta có 1CKM = 1/fosc = 1 (us) 1 xung = 64 CKM = 64us

Thời gian tràn là 255 xung = 255.64 = 16.320 us Vậy số lần tràn trong 1 giây là: 61 lần

Ví dụ 2: Viết chương trình tạo tần số 5Khz trên chân PB.3, thạch anh 4Mhz

Giải: Vì yêu cầu mạch thiết kế tần số nên ta chọn mode CTC, OC0 ngõ ra dạng toggle.

Mode CTC: WGM01 = 1; WGM00 = 0 (xem bảng 4.1)

Ngõ ra dạng toggle: COM00 = 1; COM01 = 0. (xem bảng 4.3)

Hình 4.11 Dạng xung cho tần số 5Khz

Chu kì máy = = 1

Để thực hiện 100us ta phải mất 100CKM < 255 nên ta chọn bộ chia = 1 Vậy

Thanh ghi TCCR0 = 0b00011001 = 0x19; Thanh ghi OCR0 = 100;

Ví dụ 3: Hãy xác định thanh ghi TCCR2, biết rằng vi điều khiển sử dụng bộ chia 64, chế độ hoạt động Fast PWM, ngõ ra OC2 = 0 khi bằng.

Giải: Sử dụng bộ chia 64 nên: CS02, CS01, CS00: 011 (xem bảng 4.2) Chế độ hoạt động Fast PWM: WGM01,00 = 11 (xem bảng 4.1)

4.4 CÂU HỎI ÔN TẬP HẾT CHƯƠNG

Câu 1: Hãy nêu các thời điểm xảy ra hoạt động ngắt (ngắt bằng và ngắt tràn) trong hoạt động Timer/Counter.

Câu 2: Vi điều khiển có bao nhiêu chân điều xung, kể tên các chân đó. Câu 3: Khi sử dụng đếm sự kiện tín hiệu vào phải ở chân nào?

Câu 4: Hãy cho biết sự khác nhau và giống nhau giữa 2 mode Fast PWM và Phase correct PWM.

Câu 5: Hãy viết chương trình tạo tần số 20 Khz trên chân OC0 (PB3) với duty cycle là 50%, tần số thạch anh là 2Mhz.

Câu 6: Viết chương trình tạo bộ định thời chính xác 10 giây, tần số thạch anh là 1Mhz (gợi ý: sử dụng chế độ CTC)

Câu 7: Hãy viết chương trình tạo tần số 8 Khz trên chân OC0 (PB3) với duty cycle là 75%.

Câu 8: Hãy viết chương trình đếm sản phẩm trên chân T0 sử dụng chức năng timer/counter (tác động cạnh lên), khi đếm đến 100 sản phẩm thì sẽ xuất tín hiệu trên chân PORTD.7 = 1 trong khoảng 5 giây, sau đó lặp lại từ đầu.

Câu 9: Hãy viết chương trình điều khiển động cơ từ tốc độ thấp nhất đến cao nhất, từ cao nhất đến thấp nhất rồi lặp lại.

Chương 5

BỘ SO SÁNH TÍN HIỆU TƯƠNG TỰ

5.1 GIỚI THIỆU

Là bộ so sánh mức điện áp trên chân AIN0 với mức điện áp trên chân AIN1, khi điện áp trên chân AIN0 lớn hơn chân AIN1 thì bit ngõ ra ACO (Analog Comparator Ouput) trong thanh ghi ACSR bằng 1. Kết quả so sánh này cũng có thể kích hoạt chức năng đọc giá trị đếm của counter trong bộ timer/counter1, và nó cũng có thể kích hoạt hoạt động ngắt.

5.2 CÁC THANH GHI LIÊN QUAN

 Thanh ghi SFIOR kết hợp với thanh ghi ADCSRA dùng để chọn chân thay thế cho chân AIN1

 Thanh ghi ACSR : Thanh ghi điều khiển hoạt động so sánh

V.2.1 THANH GHI SFIOR

Bit 7 6 5 4 3 2 1 0

ADTS2 ADTS1 ADTS0 ADHSM ACME PUD PSR2 PSR10 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 5.2 Thanh ghi SFIOR

Bit ACME Analog Comparator Multiplexer Enable, cho phép chọn ngõ vào thay cho chân AIN1, dựa vào sơ đồ trên ta nhận thấy rằng khi bit ADEN = 0 (ADC bị ngưng hoạt động) và bit ACME = 1, thì việc chọn ngõ vào thay cho chân AIN1 phụ thuộc vào 3 bit MUX2..0 của thanh ghi ADMUX.

5.2.2 Thanh ghi ADCSRA

Bit 7 6 5 4 3 2 1 0

ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 5.3 Thanh ghi ADCSRA

Bit ADEN kết hợp với bit ACME để chọn các chân thay thế cho AIN1 ACME ADEN MUX2.0 Ngõ vào chân có điện áp âm

0 x xxx AIN1 1 1 xxx AIN1 1 0 000 ADC0 1 0 001 ADC1 1 0 010 ADC2 1 0 011 ADC3 1 0 100 ADC4 1 0 101 ADC5 1 0 110 ADC6 1 0 111 ADC7

5.2.3 Thanh ghi ACSR

Bit 7 6 5 4 3 2 1 0

ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0 Read/ Write RW RW R RW RW RW RW RW Giá trị ban đầu 0 0 N/A 0 0 0 0 0

Hình 5.4 Thanh ghi ACSR

 Bit 7 – ACD Analog Comparator Disable: khi bit này bằng 1 thì bộ so sánh không hoạt động, khi bit này bằng 0 thì được phép hoạt động. Bit này được bật lên 1 ở bất kỳ thời điểm nào điều này giúp cho vi điều khiển tiết kiệm được điện áp tiêu thụ trong hoạt động Idle.

 Bit 6 – ACBG Analog Comparator Bandgap Select: Khi bit này bằng 1 điện áp tham chiếu (1.15v – 1.35v) sẽ được kết nối với chân dương của bộ so sánh, khi bằng 0 thì chân AIN0 được kết nối với bộ so sánh.

 Bit 5 – ACO Analog Comparator Ouput: ngõ ra của bộ so sánh.

 Bit 4 – ACI Analog Comparator Interrupt Flag: cờ ngắt của bộ so sánh phụ thuộc vào 2 bit ACIS1 và ACIS0. Cờ ngắt trong hoạt động so sánh được thực hiện khi bit ACIE và bit I trong thanh ghi SREG được cài đặc lên 1. Ở chế độ ngắt cờ này tự động xóa về 0, ngược lại cờ này được xóa khi viết mức logic 1 vào nó.

 Bit 3 – ACIE Analog Comparator Interrupt Enable: Bit này cho phép ngắt khi = 1.  Bit 2 – ACIC Analog Comparator Input Capture Enable: khi bit này = 1 nó cho phép

đọc giá trị trong counter của bộ timer/counter1.

 Bit 1,0 – ACIS1, ACIS0: Analog Comparator Interrupt Mode Select ACIS1 ACIS0 Các dạng ngắt

0 0 Ngắt khi có sự thay đổi ngõ ra 0 1 Không sử dụng

1 0 Ngắt xảy ra tại cạnh xuống 1 1 Ngắt xảy ra tại cạnh lên Bảng 5.2 Cài đặt ngắt trong hoạt động AC

5.2.4 Bài tập ví dụ

Viết chương trình khi điện áp trên chân PB2 lớn hơn chân PB3 thì PORD.0 = 1, ngược lại thì =0; Hình 5.5 Bài tập ví dụ 1 Chương trình mô phỏng /***************************************************** Project : Hoạt động AC Date : 15/02/2014

Author : LÂM QUANG CHUYÊN

*****************************************************/ #include <mega16.h>

// Analog Comparator interrupt service routine interrupt [ANA_COMP] void ana_comp_isr(void) { PORTD.0 = ~PORTD.0; } void main(void) { PORTA=0x00; DDRA=0xFF; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xFF;

// Analog Comparator initialization // Analog Comparator: On

// Interrupt on Output Toggle ACSR=0x08;

SFIOR=0x00;

// Global enable interrupts #asm("sei")

while (1) {

// Place your code here }

}

5.3 CÂU HỎI ÔN TẬP HẾT CHƯƠNG

1. Hãy phân tích hình vẽ 5.1

2. Hãy cài đặc chương trình để có ngõ AIN1 là chân ADC5

3. Hãy viết chương trình khi điện áp chân PB.2 lớn hơn điện áp trên chân PA.2 thì đèn trên chân PD.0 sáng, ngược lại đèn tắt.

Chương 6

BỘ BIẾN ĐỔI TƯƠNG TỰ SANG SỐ

6.1 GIỚI THIỆU 6.1.1 Giới thiệu

Bộ biến đổi ADC là biến đổi tín hiệu từ tương tự sang tín hiệu số, tùy thuộc vào độ phân giải (số bit được biến đổi) và tốc độ biến đổi và độ sai số mà ta có chất lượng biến đổi khác nhau, và cũng tùy vào từng ứng dụng cụ thể mà ta có thể chọn các bộ biến đổi ADC cho phù hợp với công việc của mình.

Việc biến đổi tín hiệu từ tương tự sang số có rất nhiều ứng dụng trên thực tế: Đo lường nhiệt độ, độ ẩm, cân điện tử, biến đổi tín hiệu âm thanh để lưu trữ sang dạng số…

Đối với vi điều khiển atmega16 ta có các thông số sau:

 Là bộ biến đổi tín hiệu tương tự (0 – VCC) sang tín hiệu số với giá trị tương ứng, độ phân giải tối đa 10 bit ~ 1023 bước.

 Độ chính xác ± 2LSB

 Các chân biến đổi ADC từ PA.0 đến PA.7 và tại mỗi thời điểm chỉ có 1 chân được biến đổi.

 Mối quan hệ giữa điện áp ngõ vào (điện áp cần biến đổi), điện áp tham chiếu và độ phân giải: b ref in V V a  .2 (6.1) Trong đó:

o a: Giá trị số sau khi biến đổi (thay đổi từ 0 đến 1023)

o Vin: Điện áp ngõ vào (0 – 5VDC)

o Vref: Điện áp tham chiếu (0 – 5VDC)

Việc chọn điện áp tham chiếu phụ thuộc vào độ phân giải và số bit của thiết bị và được tính như sau:

b ref dpg

V  .2 (6.2)

Với: dpg: độ phân giải của thiết bị, cảm biến

Hình 6.1 Tín hiệu tương tự và tín hiệu số 6.1.2 Bài tập ví dụ

Ví dụ 1: Một bộ biến đổi ADC có điện áp ngõ vào là 1,35 volt, độ phân giải là 5mv, số bit biến đổi là 10 bit, hỏi giá trị ngõ ra và điện áp tham chiếu là bao nhiêu? Giải: Dựa vào công thức 6.2 ta có điện áp tham chiếu là:

Vref = dpg.2b = 0.005.210 = 5.12 (volt) Giá trị ngõ ra theo công thức 6.1 là:

270 1024 * 12 . 5 35 . 1 2 .    b ref in V V a

Ví dụ 2: Sau khi biến đổi ADC, ngõ ra nhận được là: 0x253, hỏi điện áp tham chiếu và giá trị điện áp ngõ vào là bao nhiêu, biết số bit sử dụng là 8 bit, độ phân giải 10mVolt.

Giải: Điện áp tham chiếu theo công thức 6.2 là: Vref = dpg.2b = 0.01.28 = 2.56 (volt) Điện áp ngõ vào theo công thức 6.1 là:

volt V a V bref in 1.49 1024 56 . 2 * 595 2 .   

6.2 CÁC THANH GHI LIÊN QUAN 6.2.1 Thanh ghi ADMUX 6.2.1 Thanh ghi ADMUX

Bit 7 6 5 4 3 2 1 0

REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 Read/ Write RW RW RW RW RW RW RW RW

Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 6.2 Thanh ghi ADMUX

 Bit 7 – 6: REFS0.1 chọn điện áp tham chiếu xem bảng bên trên.

Stt REFS1 REFS0 Nguồn điện áp tham chiếu 0 0 0 AREF, không sử dụng điện áp tham chiếu nội 1 0 1 AVCC với tụ được đặt tại chân AREF

2 1 0 Không sử dụng

3 1 1 Điện áp tham chiếu nội 2.56V với tụ ngoài tại chân AREF

BẢNG 6.1 Chọn điện áp tham chiếu

 Bit 5: ADLAR (ADC Left Adjust Result): bit này dùng để chọn byte cao, byte thấp của dữ liệu, khi ADLAR = 0, ADCL lưu bit0..7, ADCH lưu bit8.9. Khi ADLAR = 1 thì ngược lại.

Hình 6.3 Thanh ghi dữ liệu ADC khi ADLAR = 0

 Bit 4:0 MUX4:0 Dùng chọn kênh ngõ vào và độ lợi của biến đổi ADC MUX4..0 Single Ended Input Positive Differential Input Negative Differential Input Gain 00000 ADC0 KHÔNG SỬ DỤNG 00001 ADC1 00010 ADC2 00011 ADC3 00100 ADC4 00101 ADC5 00110 ADC6 00111 ADC7 01000 KHÔNG SỬ DỤNG ADC0 ADC0 10x

Một phần của tài liệu Giáo trình vi điều khiển (Trang 57)

Tải bản đầy đủ (PDF)

(126 trang)