Khi cài đặt bộ định thời phần cứng là ngắt, tôi nên chọn giá trị bộ đếm gộp thấp hơn hoặc CTC thấp hơn?


7

Tôi hiện đang chơi với bộ hẹn giờ phần cứng của Arduino và một câu hỏi xuất hiện trong đầu tôi. Hãy để tôi giải thích một chút.

Giả sử tôi muốn một chức năng nhất định để thực hiện mỗi 1024 tick đồng hồ. AFAIK, tôi có thể đạt được điều này theo nhiều cách, chơi với giá trị bộ đếm gộp cho Timer2 và CTC của nó:

  1. Đặt bộ đếm gộp thành 1 và CTC thành 1024
  2. Đặt bộ đếm gộp thành 8 và CTC thành 128
  3. ...
  4. Đặt bộ đếm gộp thành 1024 và CTC thành 1.

Tất cả những cách này sẽ đạt được những gì tôi muốn, nhưng, cách nào hiệu quả hơn? Hay nó không thành vấn đề?

Cảm ơn trước vì đã chia sẻ kiến ​​thức của bạn: P


1
Các giá trị của bộ đếm gộp lớn hơn sẽ dẫn đến việc giảm mức tiêu thụ năng lượng rất nhỏ vì bất kỳ mạch nào được kết nối với đầu ra của bộ đếm gộp sẽ chuyển đổi ở tần số thấp hơn và mức tiêu thụ điện tỷ lệ thuận với cv ^ 2 f.
alex.forencich

CTC không phải là số, đây là chế độ hoạt động của bộ đếm (chế độ 2). Bạn đặt thời gian của bộ hẹn giờ bằng cách cài đặt OCR2A, khoảng thời gian thực tế là (OCR2A+1)×prescalerchu kỳ CPU. Do đó, nếu bạn đặt bộ đếm gộp thành 8, bạn phải đặt OCR2A=127.
Edgar Bonet

Câu trả lời:


2

Nếu 'số đếm đồng hồ' (ở đây là 1024), độ rộng của bộ đếm thời gian và đồng hồ MCU được sử dụng là không đổi (một giá trị cố định), tôi sẽ không sử dụng tùy chọn cuối cùng, ví dụ như prescalar 1024 và CTC là 1. Đây là lý do của tôi (đặc biệt dành cho Arduino)

1) Khi CTC gần bằng 0 (như 1-> 10), đôi khi bộ định thời hoạt động như thể đếm bằng 0 và tạo ra sóng vuông (với tỷ lệ nhiệm vụ 50%) với một nửa tần số yêu cầu. Vì vậy, làm cho CTC hợp lý lớn. Nhưng một lần nữa chọn tần số xung nhịp cao (vô hướng 1) cũng có thể hiển thị độ chính xác giảm. Một lựa chọn trung gian tôi nghĩ là tốt hơn.

2) Khi đếm CTC thay đổi linh hoạt trong một quy trình, nên chọn vô hướng trước bộ đếm thời gian sao cho số đếm CTC sẽ luôn nhỏ hơn hoặc bằng độ rộng của bộ định thời trên toàn bộ quá trình.

tức là 'số lần đánh dấu thời gian' tối đa phải được điều chỉnh thoải mái bởi bộ hẹn giờ với chiều rộng cho trước. Ngay cả ở đây tình trạng khó xử tương tự lại xảy ra, sau đó lựa chọn dựa trên điểm 1 là tốt hơn.

Nếu điều này là không đủ, thì cách duy nhất tôi nghĩ là thực hiện từng trường hợp và kiểm tra xem sự kết hợp nào mang lại cho bạn kết quả tốt nhất. Kết quả thực tế tôi nghĩ là đáng tin cậy hơn (có thể bạn sẽ có được một sự kết hợp hiệu quả cụ thể của hội đồng quản trị!)


1
Tôi không thấy bất kỳ nguyên nhân gốc hợp lý nào để xác nhận nhận xét của bạn về các giá trị CTC thấp có thể làm giảm độ chính xác. Cụ thể, "đôi khi bộ đếm thời gian hành xử ..." rõ ràng là sai: tại sao bộ định thời trong kiến ​​trúc AVR sẽ không có hành vi lặp lại trong trường hợp này?
jfpoilpret

Tôi đã nói vô hướng tiền thấp (không phải giá trị CTC) có thể làm giảm độ chính xác. Giá trị CTC thấp có thể cung cấp đầu ra không mong muốn từ bộ định thời.
Janakiram

'Đôi khi' ở đây có nghĩa là 'một số bảng' của Arduino. Tôi đã sử dụng từ này bởi vì câu hỏi không được yêu cầu cho hội đồng cụ thể. Tôi đã nhiều lần làm việc với bộ định thời 'Arduino Do', với tần số hẹn giờ 10,5 MHz và bất cứ khi nào tôi đưa ra bộ đếm thời gian CTC dưới 15 (hoặc gần bằng) đều cho tôi một sóng vuông, vì vậy lý do rõ ràng là số đó được tính bằng 0. Đây không phải là toán học mà là một quan sát thực tế. Như đã nói, tôi chỉ làm việc với 'Do' vì mục đích của tôi là ARM (không phải là AVR với tần số xung nhịp thấp hơn được sử dụng trong Arduino) và vì vậy tôi sử dụng 'đôi khi' là hợp lệ.
Janakiram

2

Có sự đánh đổi giữa độ phân giải và tần số có thể đạt được. Bạn đề cập đến Timer 2, nhưng trên Atmega328P Timer 2 là bộ hẹn giờ 8 bit, do đó bạn sẽ không thể đặt CTC thành 1024.

Giả sử chúng ta đang nói về bộ định thời 16 bit, như Timer 1 trên Atmega328P. Với bộ đếm gộp trước là một, bạn có thể đặt thời gian (giả sử đồng hồ 16 MHz) từ 1 đến 65536 "tích tắc", tức là 62,5 ns lên đến 4096 trận.

Đây sẽ là phép đo chính xác nhất bởi vì bạn đang sử dụng một đồng hồ (bộ xử lý) trên mỗi đồng hồ bấm giờ (bộ đếm trước của một).

Tuy nhiên, nếu bạn có kế hoạch thời gian hơn 4.096 ms thì bạn cần phải nâng cấp bộ đếm gộp. Bộ đếm trước tiếp theo trên Timer 1 là 8, vì vậy bây giờ bạn có thể tính thời gian trong khoảng thời gian gấp 8 lần (32768 Sự thay đổi) tuy nhiên độ chính xác (độ chính xác) của bạn hiện đã giảm đi 8 lần. Độ chi tiết của bộ định thời đã tăng từ 62,5 ns đến 62,5 * 8 ns, tức là 500 ns.

Nếu bạn cần thời gian dài hơn 32,768 ms thì bộ đếm trước phải lớn hơn một lần nữa, lần tiếp theo là 64. Vì vậy, bây giờ bạn có thể có thời gian lên tới 262144, nhưng với độ chi tiết là 62,5 * 64, là 4000 ns (4 điều ).

Đề nghị của tôi sẽ là sử dụng bộ đếm gộp thấp nhất mà bạn có thể, nhưng vẫn có được khoảng thời gian bạn muốn. Vì vậy, rõ ràng bạn không thể sử dụng một bộ đếm gộp từ một đến 10 ms.


Tôi có một cuộc thảo luận về bộ tính giờ trên http://www.gammon.com.au/timers .

Trên trang đó là một biểu đồ giúp trực quan hóa các hiệu ứng của các bộ đếm trước khác nhau:

Bộ hẹn giờ và bộ đếm trước

Phần trên cùng (đếm một) có hiệu quả cung cấp cho bạn độ chi tiết của từng bộ đếm gộp. Ví dụ, một bộ đếm gộp 256 có độ chi tiết là 16.000 ns (16 12s). Một số tần số nhất định (lũy thừa 2) sẽ tự cho vay kết hợp (ví dụ: bộ đếm trước 1 với số lượng 256 hoặc bộ đếm trước 256 với số lượng 1).

Tuy nhiên, đối với các tần số không có thuộc tính đó, bộ đếm gộp nhỏ hơn sẽ (nếu có thể được sử dụng) sẽ cho độ chi tiết mịn hơn.


Sử dụng một bộ đếm gộp cao hơn không làm mất đi độ chính xác nào cả. Bạn nhận được độ chi tiết lớn hơn, nhưng nếu bạn nhắm mục tiêu số chu kỳ là sức mạnh của hai (như trong câu hỏi), thì độ chi tiết không phải là vấn đề.
Edgar Bonet

Nhưng nếu không, thì bộ đếm gộp thấp hơn cho phép bạn đến gần mục tiêu hơn. Nói rằng bạn muốn thời gian 30 chu kỳ đồng hồ. Bộ đếm trước 1 cho phép bạn nhập số 30 trực tiếp. Bộ đếm gộp 8 có nghĩa là bạn phải sử dụng 30/8 (3,75) mà bạn không thể nhập trực tiếp vào thanh ghi, do đó mất độ chính xác.
Nick Gammon

Câu hỏi được đặt ra với 1024 số đếm, vì vậy nhận xét của tôi không áp dụng cho điều đó, nhưng tôi đã cố gắng đưa ra một câu trả lời chung chung hơn, trong trường hợp thực tế là 1024 là một trường hợp khá đặc biệt là không rõ ràng.
Nick Gammon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.