Độ chính xác của đồng hồ thời gian Arduino


9

Tôi hiện đang cố gắng tạo đồng hồ thời gian Arduino bằng cách sử dụng thư viện Thời gian PJRC ( http://www.pjrc.com/teensy/td_libs_Time.html ). Tôi biết rằng vì hầu hết các bo mạch Arduino đang chạy với xung nhịp 16 MHz và một bộ cộng hưởng duy nhất, thời gian có thể trở nên "không đồng bộ" sau một khoảng thời gian nhất định.

Tuy nhiên, tôi đã tự hỏi liệu có ai có ý tưởng về độ chính xác của thư viện Time khi được sử dụng trên Arduino DUE với xung nhịp 84 MHz không. Tôi đã thử nghiệm nó và cho đến nay, đồng hồ đã được giữ đồng bộ trong một vài giờ. Cảm ơn!


Những hạn chế về độ chính xác của thư viện phụ thuộc vào độ chính xác của tinh thể. Giả sử bạn có một tinh thể tắt 0,5 giây mỗi giờ, rất tốt trong thời gian ngắn, nhưng nếu bạn mở rộng hơn một năm thì thời gian đó sẽ giảm hơn 1 giờ. Nếu bạn muốn thứ gì đó giữ thời gian chính xác trong một khoảng thời gian dài, tôi đề xuất đồng hồ thời gian thực (chúng vẫn không chính xác), mô-đun GPS hoặc kết nối internet để đồng bộ hóa.
Jesse Laning

@jamolnng Cảm ơn câu trả lời của bạn. Bạn có biết độ chính xác của tinh thể trên Arduino DUE hoặc nơi tôi có thể đi tìm nó không?
KK6FSL

Độ chính xác tốt nhất bạn sẽ nhận được là 84 MHz, khi họ chế tạo hoặc nấu, tinh thể họ chỉ có thể làm cho nó ở một mức độ chính xác nhất định, cũng là môi trường của tinh thể (nhiệt độ, độ ẩm, v.v.) đóng vai trò trong độ chính xác của nó.
Jesse Laning

@jamolnng Vậy tôi có thể mong đợi độ chính xác cao hơn với tinh thể 84 MHz thay vì tinh thể 16 MHz trên hầu hết các Arduinos khác không?
KK6FSL

5
"Độ chính xác tốt nhất bạn sẽ nhận được là 84 MHz" - điều đó không có ý nghĩa nhiều với tôi!
Cyberg Ribbon

Câu trả lời:


9

Những hạn chế về độ chính xác của thư viện phụ thuộc vào độ chính xác của tinh thể. Khi họ chế tạo, hoặc nấu, tinh thể họ chỉ có thể làm cho nó ở một mức độ chính xác nhất định, cũng như môi trường của tinh thể (nhiệt độ, độ ẩm, v.v.) đóng một vai trò trong độ chính xác của nó. Giả sử bạn có một tinh thể tắt 0,5 giây mỗi giờ, rất tốt trong thời gian ngắn, nhưng nếu bạn mở rộng hơn một năm thì thời gian đó sẽ giảm hơn 1 giờ. Nếu bạn muốn thứ gì đó giữ thời gian chính xác trong một khoảng thời gian dài, tôi đề xuất đồng hồ thời gian thực (chúng vẫn không chính xác), mô-đun GPS hoặc kết nối internet để đồng bộ hóa.

Để biết thêm thông tin, hãy xem bài viết trên wikipedia về tinh thể thạch anh

Việc sử dụng tinh thể 84 MHz so với tinh thể 16 MHz sẽ không nhất thiết cải thiện độ chính xác của đồng hồ Arduino vì tần số của tinh thể là một chỉ số về tốc độ xử lý hơn độ chính xác. Độ chính xác của đồng hồ Arduino chủ yếu phụ thuộc vào độ chính xác của bộ dao động tinh thể.

EDIT: Tôi không phải là chuyên gia về dao động tinh thể vì vậy nếu bạn thấy có gì sai ở đây xin vui lòng cho tôi biết


5

Truy cập lại một câu hỏi cũ ... khi tôi tìm thấy một bài đăng blog rất nhiều thông tin làm sáng tỏ nó. Nhưng trước tiên hãy để tôi cung cấp một số bối cảnh trước khi đưa ra liên kết.

Khi đánh giá chất lượng của cơ sở thời gian, có thể là tinh thể, bộ cộng hưởng gốm hoặc tiêu chuẩn tần số cấp phòng thí nghiệm, có hai khái niệm cần được phân biệt:

  • độ chính xác : tần số của cơ sở thời gian gần với giá trị danh nghĩa của nó
  • ổn định : tần số đó trôi theo thời gian bao nhiêu

Độ chính xác rất quan trọng nếu bạn muốn đồng hồ của mình đưa ra thời gian chính xác ra khỏi hộp. Tuy nhiên, nếu bạn sẵn sàng dành thời gian để hiệu chỉnh đồng hồ của mình, thì bạn không thực sự quan tâm vì bạn sẽ hiệu chỉnh bất kỳ sự không chính xác nào mà bạn đo được. Câu trả lời của jfpoilpret cung cấp một ví dụ về giao thức hiệu chỉnh bằng tay của Pháp, điều này là do sự cần thiết khá dài. Nếu bạn có thể mượn mô-đun GPS có đầu ra 1PPS, việc hiệu chỉnh có thể được thực hiện trong vài giây.

Sự ổn định là một vấn đề nghiêm trọng hơn. Nếu tần số của cơ sở thời gian trôi ngẫu nhiên, điều này sẽ đánh bại các nỗ lực hiệu chuẩn của bạn. Về cơ bản, hiệu chuẩn sẽ cho bạn biết tốc độ hoặc làm chậm đồng hồ của bạn đang chạy ngay bây giờ , nhưng nó sẽ không cho phép bạn dự đoán như thế nào nhanh hay chậm nó sẽ chạy trong tương lai .

Đây là liên kết được hứa hẹn: độ chính xác tần số đồng hồ Arduino , bởi Joris van Rantwijk.

Những gì Joris đã làm là đo độ chính xác và ổn định của Arduino Pro Mini (tắt bộ cộng hưởng gốm) và một Duemilianove cũ (tinh thể thạch anh). Từ quan điểm của tôi, các bài học chính là:

  • cả hai đồng hồ đều không chính xác, do đó cả hai sẽ cần hiệu chuẩn người dùng để được sử dụng làm đồng hồ
  • Tinh thể thạch anh của Duemilianove có độ ổn định khá, tốt hơn 1,5e-8 ở thời điểm trung bình 6 giờ
  • Độ ổn định của bộ cộng hưởng gốm của Pro Mini rất thảm hại, kém hơn hai bậc so với tinh thể, khiến cho nó về cơ bản trở nên vô dụng như một mảnh thời gian

Dưới đây là âm mưu lệch Allan của anh ta , đo lường sự mất ổn định của đồng hồ như là một hàm của thời gian quan sát:

Độ lệch Allan của tần số xung nhịp Arduino
(nguồn: jorisvr.nl )

Mặc dù nghiên cứu này có một số hạn chế (chỉ có hai bảng đã được thử nghiệm và thời gian quan sát quá ngắn), nhưng nó được suy nghĩ kỹ và rất nhiều thông tin. Tôi khuyến khích bạn đọc nó toàn bộ.


1
Tần số tinh thể thạch anh thay đổi một chút theo nhiệt độ. Nếu bạn có thể kiểm soát nhiệt độ, nó sẽ giúp giữ tần số ổn định.
Duncan C

3

Cách tốt nhất để biết độ chính xác của bộ cộng hưởng của bảng của bạn là tự đo.

Để làm như vậy, bạn có thể sử dụng millis()chức năng Arduino của bảng của bạn và viết một bản phác thảo nhỏ sẽ:

  1. cho phép bạn đặt thời gian bắt đầu để đo thời gian trôi (ví dụ với một nút ấn đơn giản); bạn sẽ kích hoạt nút dựa trên cơ sở thời gian chính xác .
  2. sau đó liên tục gọi millis () cho đến ít nhất 120h ("giờ arduino", tức là khoảng 5 ngày) đã trôi qua
  3. hiển thị tín hiệu khi hết 120 giờ (bản phác thảo của bạn có thể sẽ "cảnh báo" bạn trước khi đạt được thời gian chính xác để bạn sẵn sàng đo)
  4. khi hết 120 giờ, hãy kiểm tra thời gian tham chiếu của bạn (được sử dụng trong bước 1.) và kiểm tra xem đã hết bao nhiêu thời gian (nên là 120h +/- epsilon)
  5. một khi bạn biết sự trôi dạt của đồng hồ và với điều kiện bảng của bạn sẽ chạy trong cùng điều kiện môi trường (chủ yếu là nhiệt độ) của biện pháp của bạn, bạn có thể sử dụng nó trong bản phác thảo của mình để điều chỉnh millis()giá trị mỗi giờ hoặc lâu hơn.

Tất nhiên, cách tiếp cận này không hoàn hảo vì nó cần có sự can thiệp của con người và do đó sẽ tạo ra các lần trôi thời gian bổ sung trong các phép đo, đó là lý do tại sao bạn cần đo thời gian trôi của đồng hồ trong một khoảng thời gian dài.

Một cách tiếp cận được cải tiến sẽ là kết nối đồng hồ RTC có độ chính xác cao (độ chính xác phải được chọn dựa trên độ chính xác bạn cần cho ứng dụng của bạn) với bảng của bạn và điều chỉnh bản phác thảo để nó tự động tính toán độ trôi. Khi bạn có được thời gian trôi, bạn có thể làm tương tự như bước 5 ở trên trong bản phác thảo của mình và ngắt kết nối đồng hồ RTC khỏi bảng của bạn.

Điểm quan trọng :

  • đo thời gian trôi trên bảng sẽ cần điều chỉnh đồng hồ sau này (nếu bạn có nhiều bảng, bạn phải đo một lần trôi trên mỗi bảng)
  • đảm bảo sự ổn định của môi trường mà bảng của bạn sẽ được sử dụng

Cuối cùng, nếu bạn thực sự cần độ chính xác cao, thì chắc chắn kết nối nguồn đồng hồ bên ngoài (ví dụ: đồng hồ RTC, GPS, NTP) với bảng của bạn và sử dụng nó làm SyncProvider cho thư viện PJRC.


2

Tinh thể đồng hồ hệ thống trung bình của bạn sẽ tắt vài chục ppm (một phần triệu. Chúng rất tốt cho thời gian tín hiệu ổn định và chính xác, nhưng rất ấn tượng để giữ thời gian chính xác. Nếu không có quy định đặc biệt, tinh thể hệ thống có thể tắt vài giây mỗi ngày.

Giải pháp là sử dụng Đồng hồ thời gian thực thích hợp, được điều khiển bởi thứ thường được gọi là tinh thể đồng hồ 32768Hz. Những tinh thể này dễ dàng là một yếu tố 10 chính xác hơn. Bạn có thể thiết lập bộ tạo dao động của riêng mình làm gián đoạn bộ xử lý chính và tiếp tục đếm trong bản phác thảo Arduino của bạn hoặc bạn tìm thấy bảng đột phá RTC.

Hai ví dụ ngẫu nhiên xuất hiện trong Google với cụm từ tìm kiếm "RTC breakout":

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.