Đếm RPM / Tần số / Xung trên các cổng GPIO (Tối đa?)


7

Tôi đang dự định đếm RPM của Xe RC được điều khiển bằng PI B +.

Nhưng trong khi lập kế hoạch cho câu hỏi xảy ra, làm thế nào để đếm RPM. Ý tưởng của tôi là thông qua Bộ cảm biến, cung cấp cho Xung mỗi vòng và để tính điều đó qua Phần mềm.
Vấn đề của tôi bây giờ là, tôi đã không tìm thấy Thông tin đáng tin cậy, về việc tôi có thể đếm các thay đổi GPIO nhanh như thế nào và tôi không biết nóng để thực hiện điều đó một cách hiệu quả.

Ngay bây giờ tôi muốn sử dụng Python với RPI.GPIO, vì hầu hết những thứ bạn tìm thấy được làm như thế này.

Theo Câu trả lời này , có thể đạt tới 1 MHz (nên là 1M RPS, mà tôi không nên đạt tới).
Những người khác nói tối đa 9 kHz (9k RPS) là một Thứ nguyên hoàn toàn khác và tôi nghĩ rằng tôi cũng đã đọc các giá trị thấp hơn trong khi nghiên cứu ...

Ý tưởng về Mã của tôi là thêm một hàm gọi lại sự kiện vào một hàm, chỉ đơn giản là đếm một bộ đếm và trong luồng chính tôi đọc và đặt lại bộ đếm đó cứ sau 0,5 giây (và đo thời gian). Hơn nữa, tôi sẽ giữ ba giá trị cuối cùng và tính trung bình.


Vì vậy, tôi hy vọng Ai đó có thể cho tôi lời khuyên, làm thế nào để có được RPM một cách tốt nhất và về số lượng xung mỗi giây tôi có thể đếm tối đa / chắc chắn


2
Bạn dự định sử dụng ngôn ngữ nào? Ngoài ra, hầu hết các hệ điều hành Raspberry Pi không phải là thời gian thực, vì vậy việc đọc tần số tối đa của bạn có thể phụ thuộc vào tải bộ xử lý từ các tác vụ khác.
kiểm tra

Tôi muốn sử dụng Python (như đã viết ở trên), nhưng nếu ai đó giải thích cho tôi cách làm mọi thứ trong C ++, tôi sẽ xem xét chuyển sang C ++, nhưng hầu hết các ví dụ bạn tìm thấy đều bằng Python và cũng là API cho IC tôi dự định để sử dụng trong Python
XoMEX

Câu trả lời:


7

Bạn đã hiểu nhầm bài đăng có đề cập đến 1 MHz. Tất cả những gì thực sự được nói là mô-đun thời gian Python có thể trả lại thời gian hiện tại thành một phần triệu giây. Nó không nói gì về việc có bao nhiêu chuyển đổi gpio có thể được phát hiện trong một giây.

Tôi tin rằng con số khoảng 9 K gpio thay đổi mỗi giây của tôi vẫn chính xác cho Python chạy trên Pi. Như đã nói trong bài đăng được liên kết khác, bạn có thể làm tốt hơn rất nhiều (khoảng 100 K sự kiện mỗi giây) nếu bạn thực hiện sự kiện này trên Pi nhưng tắt tải xử lý cho PC.

Với C trên Pi, bạn sẽ có thể đạt được 250 K sự kiện mỗi giây trở lên.

http://www.raspberrypi.org/forums/viewtopic.php?f=37&t=90243&p=632413&hilit=+hall#p632413 hiển thị Python sử dụng cảm biến Hall để đếm số vòng quay của động cơ. RPM tối đa là khoảng 9000.


Dưới đây là một ví dụ nhân tạo nhưng cho thấy pigpio đếm 260 k sự kiện mỗi giây (cũng như tạo ra một cú đâm trong việc hiển thị dữ liệu đã chụp). Việc chụp (pigpio daemon) là trên Pi. Python và piscope đang chạy trên máy tính xách tay.

http://abyz.me.uk/ideo/pig_cb.webm

Kịch bản lệnh thiết lập một cuộc gọi lại mặc định cho nhiều gpios và khởi động PWM ở tần số tối đa trên mỗi. Các cuộc gọi lại đếm các chuyển đổi cấp độ đến một cạnh tăng theo mặc định.

Tần số PWM tối đa được đặt bằng cách yêu cầu giá trị quá cao là 100000. Tần số có thể đạt được gần nhất sẽ được đặt. Các tần số có thể đạt được tùy thuộc vào tốc độ lấy mẫu mà daemon pigpio được bắt đầu.

#!/usr/bin/env python

import time

import pigpio

GPIO=[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

NGPIO = len(GPIO)

cb = [0]*NGPIO
last = [0]*NGPIO
now = [0]*NGPIO

pi = pigpio.pi()

for i in range(NGPIO):
   pi.set_PWM_frequency(GPIO[i], 100000) # set maximum frequency.
   pi.set_PWM_dutycycle(GPIO[i], 128) # square wave.
   cb[i] = pi.callback(GPIO[i])
   last[i] = 0

while True:

   time.sleep(1.0)
   total = 0
   for i in range(NGPIO):
      now[i] = cb[i].tally()
      total = total + now[i] - last[i]
      last[i] = now[i]
   print(total)

1
Tôi biết rằng loại công cụ "cảm ơn bạn vì điều này" không thực sự mong muốn trên SE, nhưng nhiều lần tôi muốn tìm hiểu sâu về những gì tôi đang cố gắng đạt được, và câu trả lời của bạn cứ lặp đi lặp lại ở đây và những nơi khác Chúc mừng.
stevieb

Bạn có thể vui lòng giải thích mã, mục đích của danh sách GPIO, NGPIO và tất cả các chức năng và biến số
Lalit Verma

2
  1. Đây thực sự không phải là một câu hỏi Pi.
  2. Bạn chưa thực sự xác định vấn đề của bạn.

Phạm vi bạn đang mong đợi là gì? Độ chính xác nào bạn yêu cầu?

Tôi sẽ chỉ đo thời gian của mỗi xung, rút ​​ra thời lượng kể từ trước đó và đảo ngược điều này.

Nếu động cơ chạy ở tốc độ 6000 vòng / phút, điều này sẽ cung cấp 1 xung cứ sau 10mS là khả thi. Bạn cần biết rằng Linux không phải là một hệ điều hành thời gian thực, do đó, các ngắt xảy ra sẽ ảnh hưởng đến độ chính xác.


Vấn đề của tôi là, tôi không biết nợ nhiều xung mà pi có thể xử lý mỗi giây và làm thế nào để đếm chúng hiệu quả. Nếu tôi đang sử dụng phương pháp của mình, tôi nghĩ rằng một vài rps có thể bị mất. Đối với tính toán của tôi, tôi có thể nghĩ về 8-20kRPM (150-333 RPS tôi không mong đợi nó sẽ ở mức thấp trước đó). (Có thể nhiều hơn, nhưng tôi không nghĩ mình có thể nhận được hơn 80kRPM / 1333RPS bao giờ)
XoMEX
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.