PDA

View Full Version : Dùng prescaler đếm tần số


tuan795
14-01-2006, 10:34 AM
bác nào hiểu nguyên lý dùng prescaler để đếm tần số không chia sẽ với tôi với. Cám ơn

falleaf
14-01-2006, 03:05 PM
Không phải prescaler là nguyên lý, mà chỉ là một bộ chia, để có thể lựa chọn được độ phân giải của timer/counter. Việc đếm tần số, em sử dụng ngắt để thực hiện. Khi có cạnh xuống, hoặc cạnh lên (tuỳ theo em lựa chọn), em có thể dùng timer, capture, ngắt.. để xác định khoảng thời gian đó.

Kết quả, em có thể biết được thời gian giữa hai cạnh lên, hoặc 2 cạnh xuống của xung. Khi đó, em xác định được tần số. f = 1/T

Chúc vui.

tuan795
08-02-2006, 04:30 PM
em chưa hiểu nhiều về prescaler anh có thể giúp em cám ơn

falleaf
08-02-2006, 06:08 PM
Nếu xung nhịp của em là 4MHz, tức là một chu kỳ máy sẽ là 1us.

Khi em bật timer, thì bình thường cứ 1us nó sẽ đếm lên 1 đơn vị. Nếu như em setup prescaler, giả sử là 2 (em xem trong bảng prescaler để biết cách setup). Trong trường hợp này, thì 2us timer sẽ đếm lên 1 đơn vị. Tương tự, prescaler = 4 thì 4us timer mới tăng lên 1 đơn vị.

Như vậy, để hẹn giờ thời gian dài. Nếu bình thường với 8 bit, em chỉ hẹn giờ được 256us, thì nếu em muốn hẹn giờ lên đến 1ms thì bắt buộc em phải dùng prescaler.

Đơn giản như vậy thôi. Không có gì phức tạp cả.

Chúc vui.

tuan795
13-02-2006, 08:31 AM
giả sử rằng em dùng thạch anh 4Mhz như vậy chu kỳ máy là 1us. nếu em dùng pin RA4 để đưa tín hiệu cần đo tần số vào(và dĩ nhiên tín hiệu này đã được chuẩn hóa thành dạng sóng vuông là 5v).nếu em dùng timer0 để đếm xung của tín hiệu vào thì trong 1s khả năng đếm nhiều nhất của timer0 là 1 triệu xung hay tần số là 1Mhz.
phương pháp để đếm tần số cao hơn là phải dùng thạch anh có giá trị cao hơn. Hoặc dùng prescaler để chia tần số xuống .
nh]ng cách chia này em chưa hiểu rành lắm mong anh giúp em cám ơn.

falleaf
13-02-2006, 03:15 PM
Uhm, vì hiện nay công cụ viết bài của diễn đàn chưa được hoàn chỉnh nên hơi khó vẽ hình cho bạn.

Tuy nhiên bạn xét như sau:

Nếu như để chế độ không chia, thì bạn phải đếm từ 1 đến 1,000,000 thì mới đủ 1 giây. Đúng vậy không?

Nếu giờ bạn dùng bộ chia 2 chẳng hạn. Như vậy, cứ 2us nó mới đếm lên 1 đơn vị. Như vậy, bạn chỉ cần đếm từ 1 đến 500,000 là nó đủ 1s rồi.

Tương tự như vậy, nếu bạn đặt bộ chia là 4, thì chỉ đếm đến 250,000 là đủ...

Nhưng mà khổ một cái, đó là nó không cho bộ chia kiểu 200, 20000, 10000... mà chỉ cho cài đặt bộ chia theo số mũ của 2.

Vậy tối đa, bạn đặt bộ chia là 256 thì bạn sẽ đếm ra được con số lẻ. X chẳng hạn.

khi đó 256X ~ 1,000,000, vd, F nói là 999,938 chẳng hạn... vì F không tiện tính ra con số là bao nhiêu.

Khi đó, còn khoảng mấy chục us, thì làm sao tính được? Khi yêu cầu bắt là chính xác?

Bởi vậy, bạn hoàn toàn có thể cài đặt một timer khác đếm song song, với độ phân giải nhỏ hơn để tranh sai số.

Hoặc giả, bạn có thể đặt thêm biến bất kỳ để đếm đến 256, thì tăng giá trị biến lên... Rất nhiều thuật toán và cách xử lý có thể dùng ở đây, tùy theo yêu cầu của bài toán.

Bạn có thể viết các phân tích ra đây, chúng ta cùng tính và cùng sửa. Quản trọng nhát là bạn nắm được bản chất công việc mình làm, còn việc viết lệnh thì không phải là vấn đề cần quan tâm.

Chúc vui.

tuan795
13-02-2006, 04:55 PM
giả sử rằng ta cần đếm tần số của tín hiệu vào >40Mhz và ta có thể khai báo trong phần mềm là có 3 thanh ghi để lưu trữ số đếm như vậy số đếm cao nhất có thể lên đến 2 mũ 24
giả sử rằng ta đặt bộ chia là 256. và trong phần mêm ta phải giám sát bộ đếm sau khi bộ đếm đến 256, thì ta sẽ add thêm một thanh ghi mới để lưu trữ số đếm và như vậy cho đến khi kết thúc quá trình đếm.
một vấn đề thứ nhất là làm sao chúng ta lấy lại kết quả đếm được từ 3 thanh ghi này để biến đổi chúng từ mã binary sang bcd để xuất ra lcd chẳng hạn.
vấn đề thứ hai như trong datasheet của pic16f84a có nói prescaler Là một bộ đếm 8 bit Prescaler không thể đọc hay ghi được như vậy bộ đếm này có thể lưu trữ số đếm được không.

falleaf
13-02-2006, 05:06 PM
Cái thanh ghi prescaler thì không đọc ghi được, nhưng mà 3 cái bit để setup cho nó thì có thể đọc ghi được. Có nghĩa trong trường hợp này là một vòng hở. Mình setup bằng 3 bit quy định, hiển nhiên nó đúng, mình không thể ghi giá trị vào cái thanh ghi mang bộ chia được.

Còn về việc tính toán ra số, thì bây giờ giả sử chúng ta có 1000s ban có thể đổi ra ms được không? và ngược lại? Chẳng hạn, chúng ta có số 5, bạn có thể hiển thị số 5 lên BCD được không?

Cái đó, F chưa viết bài hướng dẫn ở đây, nên bạn xem trong www.dientuvietnam.net.

Một bài cũng trong luồng này vừa mới post của bạn gì đó, F có chỉ đường link đến việc thiết kế BCD bên dientuvietnam

Chúc vui.

tuan795
14-02-2006, 02:55 PM
như vậy prescaler 8 bit này không thể lưu trữ số đếm nó chỉ đóng vai trò là một bộ chia tần số của tín hiệu vào . Như vậy prescaler này có hoạt động giống như các IC prescaler đọc lập mà người ta thường dùng trong các máy frequency counter không và nguyên lý của bộ chia này hoạt động như thế nào

falleaf
14-02-2006, 05:22 PM
như vậy prescaler 8 bit này không thể lưu trữ số đếm nó chỉ đóng vai trò là một bộ chia tần số của tín hiệu vào . Như vậy prescaler này có hoạt động giống như các IC prescaler đọc lập mà người ta thường dùng trong các máy frequency counter không và nguyên lý của bộ chia này hoạt động như thế nào

Cũng giống như việc tích hợp ADC vào trong chip, việc tích hợp bộ chia cũng rất hợp lý. Như vậy, ADC ngoài và ADC nội khác nhau những gì? Chẳng qua là phần tương tác với vi điều khiển và dữ liệu lưu vào thanh ghi. Vậy thì prescaler cũng vậy, nguyên lý hoạt động của nó hoàn toàn như nhau.

Về nguyên lý prescaler thì có nhiều cách làm, nhưng bản chất nó đều là logic. Về chi tiết kỹ thuật prescaler của pic thì F không nắm rõ.

Chúc vui.

tuan795
16-02-2006, 11:44 AM
giả sử rằng em dùng thuật toán như anh nói là ta có thể đặt thêm biến bất kỳ để đếm đến 256, thì tăng giá trị biến lên... nếu có 3 thanh ghi lưu trữ số đếm thuật toán để tính toán lại giá trị này? và phương pháp chuyển đổi tối ưu nào để hiển thị giá trị này một cách tốt nhất

vtt
18-03-2007, 03:24 PM
Cho em hỏi một chút, tại sao một số tài liệu nói là PIC 16f876A co thể đếm tần số đến 50Mhz. Như anh nói ở trên thì thàng 876 chỉ có thể đếm tần số ngoài là 5Mhz được thôi, vi tần số thạch anh của nó tối đa là 20Mhz. Anh có thể giải thích cụ thể được không, và nói rõ cách đo thể nào để đo được tần số 50Mhz?
Thanks!

namqn
18-03-2007, 07:32 PM
Cho em hỏi một chút, tại sao một số tài liệu nói là PIC 16f876A co thể đếm tần số đến 50Mhz. Như anh nói ở trên thì thàng 876 chỉ có thể đếm tần số ngoài là 5Mhz được thôi, vi tần số thạch anh của nó tối đa là 20Mhz. Anh có thể giải thích cụ thể được không, và nói rõ cách đo thể nào để đo được tần số 50Mhz?
Thanks!
Bạn thử chỉ ra một vài tài liệu đó để chúng tôi xem qua rồi mới có thể giải thích được cho bạn vì sao họ nói như vậy.

Thân,

thucthuan
26-03-2011, 10:18 AM
Các bác đo bằng cách nào mà được tần số cao vậy ? Em dùng PIC 16f877A, thạch anh 20M. Chỉ đo đựoc tần số <50k thoi ah.
Cách đo của em là lấy xung đưa vào ngắt ngoài INT (RB0) để đếm , dùng bộ định thời TIMER0 để định 1s và tính toán ra tần số.

Các bác cho em hỏi có cách nào khác để đo được tần số cao hơn không ạ

tay mơ
06-04-2011, 08:33 PM
50mhz thì không biết đo đc ko chứ 24Mhz thì làm đc rồi
pic16f877a_ thạch anh 20Mhz
timer1 xung clock ngoài, clock chia 8 , xung chuẩn phát từ thạch anh 24 mhz + cổng not 7404

thucthuan
14-04-2011, 12:55 AM
Ủa bác dùng counter ah,như vậy là cần 2 bộ Timer đúg ko a. Bác nói cho em qua về thuật toán dc ko.
Thank bác nhiều.

tay mơ
21-04-2011, 10:07 PM
code chương trình là file Ex_Freqc.c của CCS đó bạn, dùng 1 timer thôi, là timer 16bit, timer1 đó, còn thời gian để có 1s là do các lệnh delay tạo nên