Làm thế nào để nắm bắt chính xác thời gian đến của một cạnh đầu vào?


7

Trên Arduino / ATmega328p, các mô-đun Timer / PWM 16 bit có bộ phận bắt đầu vào cho phép ghi lại thời gian đến chính xác của cạnh đầu vào ngay cả khi bộ xử lý đang bận khi cạnh đầu vào đến. (Để biết chi tiết tham khảo bảng dữ liệu , phần 20.9 trên trang 155.)

Raspberry Pi có bất kỳ loại thiết bị ngoại vi phần cứng tương đương nào không, hoặc một số cách khác để đánh dấu thời gian chính xác một cạnh đầu vào xảy ra trong khi bộ xử lý đang bận? Tôi đã thử tìm kiếm thông qua bảng dữ liệu Ngoại vi ARM BCM2835 , nhưng tôi chưa thể tìm thấy bất cứ thứ gì phù hợp với nhu cầu của tôi cho đến nay.

Tôi cho rằng điều này có thể được thực hiện bằng cách sử dụng FIQ để kích hoạt DMA từ bộ hẹn giờ hệ thống sang một nơi khác, nhưng từ tài liệu đăng ký, có vẻ như FIQ chỉ có thể được thiết lập cho các ngắt GPU và cơ sở. Tôi không chắc chắn làm thế nào để FIQ kích hoạt các ngắt GPIO và ngay cả khi tôi biết cách, tôi không chắc liệu đây có phải là một cách chính xác để tiến hành hay không, nếu có cách nào khác để làm điều này sạch sẽ hơn.

Làm thế nào tôi có thể nắm bắt chính xác thời gian đến của một cạnh đầu vào?

Một độ trễ nhỏ liên tục không phải là vấn đề vì tôi chỉ có thể trừ nó ra, nhưng đối với ứng dụng của tôi, tôi cần độ chính xác ít nhất là micro giây hoặc tốt hơn.


"chính xác dấu thời gian một cạnh đầu vào xảy ra trong khi bộ xử lý đang bận" -> Vì GPIO là các ngắt phần cứng chính hãng và Pi thường chạy một HĐH đa tác vụ chính hãng đáp ứng thích hợp với các ngắt đó, nên bạn có thể nhận được một cái gì đó gần độ chính xác mức mili giây sử dụng các kỹ thuật bình thường. Nói cách khác, một Atmega328 "bận rộn" là một con quái vật rất khác so với BCM2835 "bận rộn" vì phần mềm họ có thể hỗ trợ.
goldilocks

Thật không may @goldilocks, độ chính xác ở mức mili giây không đủ tốt - các sự kiện tôi đo được chỉ cách nhau vài mili giây và tôi cần có thể tạo ra một chuỗi xung đầu ra với độ lệch thời gian rất chính xác từ bộ kích hoạt. (Đã thực hiện điều này trên ATMega328 bằng cách sử dụng các khối so sánh đầu ra PWM; một kỹ thuật tương tự sẽ hoạt động với Pi, miễn là tôi thực sự có thể lấy dấu thời gian ra khỏi bộ đếm thời gian PWM.)
AJMansfield

Chúng vẫn còn một chút táo và cam theo nghĩa là bạn có thể làm mọi thứ với cái này mà bạn không thể làm với cái kia. Nhưng chúng đi cùng nhau như sô cô la và bơ đậu phộng IMO - vì vậy nếu đó chỉ là dấu thời gian quan trọng và không có Pi phản ứng với mọi thứ trong thời gian thực với độ chính xác dưới một phần nghìn giây, sau đó cõng nano trên Pi. Có nhiều cách đơn giản khác nhau để họ giao tiếp (UART, I2C, SPI, gpio ngắt). Ở đây, bạn cần Pi cho những thứ bạn không thể làm với atmega, nhưng có thể sử dụng cả hai.
goldilocks

Câu trả lời:


7

Đối với một giải pháp chung, pigpio có lẽ là thứ tốt nhất bạn sẽ tìm thấy.

Nó sử dụng DMA để nắm bắt các mức GPIO và sử dụng DMA để đánh dấu thời gian sự kiện từ đồng hồ hệ thống 1 MHz.

Các mẫu mới nhất được báo cáo cho các quy trình quan tâm trong khối 1 mili giây. Điều đó có nghĩa là độ trễ trung bình là khoảng 500 Lời nói. Tuy nhiên, đó thường không phải là một vấn đề vì mỗi báo cáo đã được đóng dấu thời gian.

Nếu bạn đi theo tuyến gián đoạn, sẽ có độ trễ trung bình giữa sự kiện GPIO và thông báo quy trình trong khu vực 50 - 100s, tất nhiên các ngoại lệ có thể nhiều hơn, dễ dàng là 10 giây và bạn sẽ không biết đó là gì.

pigpio sẽ lấy mẫu với tốc độ 1Msps, nhưng tôi không khuyến nghị nếu hệ thống có thể đang bận làm công việc mạng, bạn sẽ nhận được jitter thời gian DMA khi bus bộ nhớ bắt đầu bận. Tôi sẽ đạt 500ksps hoặc ít hơn.

Tôi không thấy cách nào để đáp ứng mục tiêu 1 hay của bạn trong Linux.


Đoán tôi sẽ phải sử dụng một vi điều khiển phụ trợ để xử lý việc bắt đầu vào và chỉ cần nói chuyện với nó như I2C hoặc một cái gì đó.
AJMansfield

@AJMansfield Bạn mong đợi bao nhiêu thay đổi cấp độ? Ngay cả ở I2C nhanh nhất trên Pi cũng sẽ không xử lý lấy mẫu 1 MHz. SPI có thể nhưng trong cả hai trường hợp, Pi là chủ xe buýt. Bạn đang cố gắng để đạt được điều gì?
gia

bạn đúng nhưng tôi có thể thực hiện hầu hết việc xử lý thời gian thực trên mc bên ngoài mà không cần phải tham gia vào pi, vì tôi chỉ cần thay đổi cấu hình theo thứ tự mỗi giây một lần và nó chỉ cần báo cáo lại các số liệu thống kê cơ bản .
AJMansfield

Những gì tôi đang cố gắng làm là tạo ra một loạt các xung đầu ra với độ lệch thời gian rất chính xác từ tín hiệu kích hoạt đầu vào; mô hình xung sẽ không thay đổi thường xuyên.
AJMansfield
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.