Làm thế nào chính xác là thời gian của PulseIn ()?


8

Tôi đã sử dụng pulseIn()chức năng này để xử lý mã hóa dữ liệu nhị phân dựa trên PWM. Nó hoạt động tốt để phân biệt các xung có độ dài khác nhau đáng kể, ví dụ 500us so với 1500us. Điều đó làm cho nó quá đủ để xử lý các điều khiển từ xa IR điển hình.

Tuy nhiên, tôi muốn tạo một hệ thống IR của riêng mình có thể sử dụng nhiều hơn 2 độ dài xung để việc truyền dữ liệu có thể diễn ra nhanh hơn. Lý tưởng nhất là tôi muốn sử dụng 8 độ dài xung khác nhau để mã hóa bát phân (ví dụ 200us, 400us, 600us, v.v.).

Tôi đã nhận thấy các biến thể khá đáng kể trong các giá trị được trả về pulseIn()mặc dù (+/- 10%). Tôi hy vọng ít nhất một số được giới thiệu bởi các mô-đun máy phát và máy thu IR, nhưng tôi không có thiết bị đủ tốt để xác minh điều đó.

Giả sử tôi có thể giảm thiểu lỗi bên ngoài đó, pulseIn()có khả năng đủ chính xác để phân biệt các xung tương tự như vậy không?

Câu trả lời:


11

Hàm Pulsein () rất mất mát, trong đó nó là một vòng lặp cứng và trả về một số * chu kỳ đồng hồ giả định cần cho mỗi vòng lặp

...
// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
  if (numloops++ == maxloops)
    return 0;
  width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16); 

Phương pháp chính xác nhất để nắm bắt thời gian của mã PIN là sử dụng tính năng TÍNH NĂNG INPUT. Nhìn vào ví dụ này . Nó cho phép chụp đầu vào ở mức 1x CPU để có độ phân giải tối đa và mỗi cạnh của chân đầu vào sẽ ghi giá trị xung nhịp của bộ đếm thời gian để đọc từ dịch vụ Ngắt được tạo. Nó cũng cho phép ngắt tràn bộ đếm thời gian để duy trì thời gian tuyệt đối lớn, được chụp. Vì 1x sẽ cuộn khá nhanh. Các ảnh chụp lưu trữ thời gian thành một mảng để đọc theo vòng lặp chính.


Trường hợp tín hiệu qua IR, thư viện điển hình sẽ sử dụng là thư viện shirriff / Arduino-IRremote . Trong đó nó có một vài bản demo sẽ đọc và gửi IR từ tín hiệu được giải điều chế. Để cho phép một người xây dựng một bản phác thảo thiết kế của riêng họ. Mã này ban đầu tạo ra một bộ đếm thời gian ngắt thăm dò chân đầu vào với tốc độ xác định bởi

#define USECPERTICK 50  // microseconds per clock interrupt tick

trong tệp IRremote.h. Đối với mục đích của tôi, tôi đã thay đổi nó thành 25 chúng tôi. Nơi tôi tìm thấy điều này vẫn có thể bị mất liên tục các luồng xung.

Lưu ý giải điều chế được thực hiện tốt nhất trong máy thu IR, từ đó đưa ra tín hiệu đáng quan tâm này. Nơi để thêm một số nền. Sử dụng điều chế 38KHz điển hình, tương đương với độ phân giải tối thiểu 26,3uS trên mỗi chu kỳ của xung. Thư viện của sherriff cho thấy hầu hết các baud hoặc bit theo thứ tự hơn 10 xung. Mà xuất hiện để đáp ứng thời gian mong muốn của bạn.

công cụ microtherion / Arduino-IRremote của shirriff cải thiện việc tiếp nhận bằng cách thay thế việc bỏ phiếu ngắt thời gian của pin bằng việc sử dụng PinChangeInterrupts. Mà tôi đã hợp nhất vào ngã ba mpflaga / Arduino-IRremote của riêng tôi , có thêm một số tính năng khác.

Vì vậy, bạn có thể sử dụng bất kỳ thư viện trên. Hoặc tạo ứng dụng của riêng bạn sử dụng một trong các cách bên dưới để chụp các cạnh.

  1. các cuộc thăm dò về một sự kiện Timer (ví dụ 50uS)
  2. chụp micros () trên PinChangeInterrupt
  3. sử dụng Ngắt bắt đầu vào để lấy thời gian chính xác

1
Rực rỡ trả lời. Arduino-IRremote là một thư viện chất lượng rất cao. Dễ đọc, và có rất nhiều thiết kế được nghĩ ra có nghĩa là nó rất đáng tin cậy.
Cyberg Ribbon

2

Dưới đây là một số dữ liệu kiểm tra của một pulseInbài kiểm tra. Một Arduino đã gửi những gì được cho là xung 14us và cái còn lại tiết lộ dữ liệu này:

18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18,24,19,18,18,18,18,18,24, 18,18,18,19,18,18,12,18,18,19,18,18,18,18,18,18,18,18,18,18,18,19,18,19,24, 18,18,18,18,18,18,18,24,18,18,18,18,18,18,18,18,18,18,18,18,18,19,18,18,18, 18,18,18,18,18,18,18,19,18,18,18,11,18

Như bạn có thể thấy, các xung không có nghĩa là chính xác. Thời gian sẽ chính xác hơn nếu kết thúc gửi và nhận được viết bằng cách lắp ráp hoặc thậm chí giảm tải cho bộ xử lý của riêng họ.

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.