vài dòng góp ý về cái timer1:
để đo độ rộng xung thì mình dùng chế độ input capture (ở đây là xung vuông).
khi vào đầu chương trình thì mình set xung clock cho T1, cần chú ý đến tần số này, vì T1 chạy được 16 bit và độ rộng xung lớn nhất mà nó đo được là 2^16*Fck.
giả sử bạn chọn xung clock là 1Mhz thì độ rộng xung tối đa mà nó đo được là 65 535us.
cho nó chạy ở mode nomal 16 bit.
khởi tạo cho phép ngắt ICP, tác động cạnh lên.
khi có ngắt xảy ra: xóa TCNT1,cho T1 chạy, đổi cạnh tác động cho ICP. (cạnh xuống) thoát khỏi ngắt.
đến ngắt tiếp theo xóa TCNT1,cho T1 chạy, đổi cạnh tác động cho ICP (cạnh lên), đọc ICR1 (đây là thời gian xung ở mức cao),thoát khỏi ngắt.
đến ngắt tiếp theo: đọc ICR1 (đây là thời gian xung ở mức thấp) ...
đây là cách để đo độ rộng của xung cần capture, thường được sử dụng để capture tín hiệu hồng ngoại của các remote.
còn khi muốn đo tần số hay chu kì của xung thì mình sẽ sử dụng chế độ counter, nghĩa là cho T1 chạy bởi nguồn xung ngoài đưa vào chân T1, chứ ko phải chân ICP. dùng một timer khác để định thời gian đếm.
giả sử dùng timer 0 và cho tràn trong 100ms trước khi cho T0 chạy thì mình xỏa TCNT1, và thiết lập các thông số cho nó chạy xung ngoải ở chân T1,
khi tràn ngắt T0 thì mình đọc về TCNT1, đây là số xung đếm được trong 100ms, từ đó tính ra tần số hay chu kì..
cần chú ý là tùy vào tấn số của xung cần đếm mà mình sẽ set thời gian tràn của T0 cho thích hợp. khi xung cần đếm có tần số lớn thì set thời gian tràn T0 nhỏ và ngược lại để bảo đảm T1 ko bị tràn và sai số đo là nhỏ.
một số chú ý.
chế độ capture chỉ nên sử dụng khi cần biết chính xác độ rộng xung. như là khi capture tín hiệu hồng ngoại, không nên sử dụng để đo tần số hay chu kì xung.
khi muốn đo tần số hay chu kì thì sử dụng chế độ counter với nguồn xung từ T1.
tần số xung lớn nhất mà AVR nhận được là Fosc/2. cần chú ý điều này để tránh bị lỗi trong quá trình thiết kế và viết phần mềm.
để đo độ rộng xung thì mình dùng chế độ input capture (ở đây là xung vuông).
khi vào đầu chương trình thì mình set xung clock cho T1, cần chú ý đến tần số này, vì T1 chạy được 16 bit và độ rộng xung lớn nhất mà nó đo được là 2^16*Fck.
giả sử bạn chọn xung clock là 1Mhz thì độ rộng xung tối đa mà nó đo được là 65 535us.
cho nó chạy ở mode nomal 16 bit.
khởi tạo cho phép ngắt ICP, tác động cạnh lên.
khi có ngắt xảy ra: xóa TCNT1,cho T1 chạy, đổi cạnh tác động cho ICP. (cạnh xuống) thoát khỏi ngắt.
đến ngắt tiếp theo xóa TCNT1,cho T1 chạy, đổi cạnh tác động cho ICP (cạnh lên), đọc ICR1 (đây là thời gian xung ở mức cao),thoát khỏi ngắt.
đến ngắt tiếp theo: đọc ICR1 (đây là thời gian xung ở mức thấp) ...
đây là cách để đo độ rộng của xung cần capture, thường được sử dụng để capture tín hiệu hồng ngoại của các remote.
còn khi muốn đo tần số hay chu kì của xung thì mình sẽ sử dụng chế độ counter, nghĩa là cho T1 chạy bởi nguồn xung ngoài đưa vào chân T1, chứ ko phải chân ICP. dùng một timer khác để định thời gian đếm.
giả sử dùng timer 0 và cho tràn trong 100ms trước khi cho T0 chạy thì mình xỏa TCNT1, và thiết lập các thông số cho nó chạy xung ngoải ở chân T1,
khi tràn ngắt T0 thì mình đọc về TCNT1, đây là số xung đếm được trong 100ms, từ đó tính ra tần số hay chu kì..
cần chú ý là tùy vào tấn số của xung cần đếm mà mình sẽ set thời gian tràn của T0 cho thích hợp. khi xung cần đếm có tần số lớn thì set thời gian tràn T0 nhỏ và ngược lại để bảo đảm T1 ko bị tràn và sai số đo là nhỏ.
một số chú ý.
chế độ capture chỉ nên sử dụng khi cần biết chính xác độ rộng xung. như là khi capture tín hiệu hồng ngoại, không nên sử dụng để đo tần số hay chu kì xung.
khi muốn đo tần số hay chu kì thì sử dụng chế độ counter với nguồn xung từ T1.
tần số xung lớn nhất mà AVR nhận được là Fosc/2. cần chú ý điều này để tránh bị lỗi trong quá trình thiết kế và viết phần mềm.
Comment