Anzahl RPM / Frequenz / Impulse an GPIO-Ports zählen (Maximum?)


7

Ich plane, die Drehzahl eines RC-Car zu zählen, das mit einem PI B + gesteuert wird.

Bei der Planung stellt sich jedoch die Frage, wie die Drehzahl zu zählen ist. Meine Idee ist über einen Sensor, der jede Runde einen Impuls gibt, und diesen über Software zu zählen.
Mein aktuelles Problem ist, dass ich keine zuverlässigen Informationen darüber gefunden habe, wie schnell ich GPIO-Änderungen zählen kann, und ich weiß nicht, wie ich das effizient tun kann.

Im Moment möchte ich Python mit RPI.GPIO verwenden, da die meisten Dinge, die Sie finden, so gemacht sind.

Nach dieser Antwort ist es möglich, bis zu 1 MHz zu erreichen (das sollte 1 M RPS sein, was ich nicht erreichen sollte).
Andere geben ein Maximum von 9 kHz (9 k RPS) an, was eine völlig andere Dimension darstellt, und ich denke, ich habe bei der Recherche auch niedrigere Werte gelesen ...

Meine Idee des Codes ist es noch, einer Funktion einen Ereignisrückruf hinzuzufügen, der einfach einen Zähler hochzählt, und im Hauptthread lese und setze ich diesen Zähler ungefähr alle 0,5 Sekunden zurück (und messe die Zeit). Außerdem würde ich die letzten drei Werte behalten und einen Durchschnitt berechnen.


Ich hoffe also, jemand kann mir Ratschläge geben, wie man die Drehzahl am besten erreicht und wie viele Impulse pro Sekunde ich maximal / sicher zählen kann


2
Welche Sprache möchten Sie verwenden? Außerdem sind die meisten Raspberry Pi-Betriebssysteme nicht in Echtzeit verfügbar, sodass Ihr maximaler Frequenzwert möglicherweise von der Prozessorlast anderer Aufgaben abhängt.
Scruss

Ich würde gerne Python verwenden (wie oben beschrieben), aber wenn mir jemand erklärt, wie man alles in C ++ macht, würde ich in Betracht ziehen, zu C ++ zu wechseln. Die meisten Beispiele finden Sie jedoch in Python und auch die API für einen von mir geplanten IC zu verwenden ist in Python
XoMEX

Antworten:


7

Sie haben den Beitrag, in dem 1 MHz erwähnt wird, falsch verstanden. Alles, was tatsächlich gesagt wird, ist, dass das Python-Zeitmodul die aktuelle Zeit auf eine Mikrosekunde zurückgeben kann. Es sagt nichts darüber aus, wie viele GPIO-Übergänge in einer Sekunde erkannt werden können.

Ich glaube, dass meine Zahl von etwa 9 K gpio-Zustandsänderungen pro Sekunde für Python, das auf dem Pi ausgeführt wird, immer noch korrekt ist. Wie in dem anderen verlinkten Beitrag erwähnt, können Sie viel besser abschneiden (ca. 100.000 Ereignisse pro Sekunde), wenn Sie die Ereigniserfassungen auf dem Pi durchführen, aber die Verarbeitung auf einen PC laden.

Mit C auf dem Pi sollten Sie 250 K Ereignisse pro Sekunde oder mehr erreichen können.

http://www.raspberrypi.org/forums/viewtopic.php?f=37&t=90243&p=632413&hilit=+hall#p632413 zeigt Python, wie Hall-Sensoren zum Zählen von Motorumdrehungen verwendet werden. Die maximale Drehzahl betrug ca. 9000.


Das Folgende ist ein künstliches Beispiel, zeigt jedoch, wie Pigpio 260 k Ereignisse pro Sekunde zählt (und wie die erfassten Daten angezeigt werden). Das Capture (Pigpio Daemon) befindet sich auf dem Pi. Python und Piscope laufen auf einem Laptop.

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

Das Skript richtet einen Standardrückruf für mehrere GPios ein und startet PWM mit der maximalen Frequenz auf jedem. Die Rückrufe zählen standardmäßig die Pegelübergänge zu einer steigenden Flanke.

Die maximale PWM-Frequenz wird eingestellt, indem ein zu hoher Wert von 100000 angefordert wird. Die nächstgelegene erreichbare Frequenz wird eingestellt. Die erreichbaren Frequenzen hängen von der Abtastrate ab, mit der der Pigpio-Daemon gestartet wurde.

#!/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
Ich weiß, dass "Danke für dieses" Zeug auf SE nicht wirklich erwünscht ist, aber ich möchte immer wieder etwas ausführliches über das herausfinden, was ich persönlich erreichen möchte, und Ihre Antworten kommen hier immer wieder vor , und anderswo. Prost.
Stevieb

Können Sie bitte den Code erklären, was der Zweck der GPIO-Liste, NGPIO und aller Funktionen und Variablen ist
Lalit Verma

2
  1. Das ist wirklich keine Pi-Frage.
  2. Sie haben Ihr Problem nicht wirklich definiert.

Welchen Bereich erwarten Sie? Welche Genauigkeit benötigen Sie?

Ich würde einfach die Zeit jedes Impulses messen, die Dauer seit dem vorherigen ableiten und diese invertieren.

Wenn der Motor mit 6000 U / min läuft, würde dies alle 10 ms 1 Impuls geben, was machbar sein sollte. Sie müssen wissen, dass Linux kein Echtzeitbetriebssystem ist. Daher würden auftretende Interrupts die Genauigkeit beeinträchtigen.


Mein Problem ist, ich weiß nicht, wie viele Impulse der Pi pro Sekunde verarbeiten kann und wie man sie effizient zählt. Wenn ich meine Methode verwende, denke ich, dass ein paar RPS verloren gehen könnten. Für meine Berechnungen konnte ich an 8-20 kRPM denken (150-333 RPS, ich hatte nicht erwartet, dass es früher so niedrig sein würde). (Vielleicht mehr, aber ich glaube nicht, dass ich jemals über 80 kRPM / 1333RPS kommen könnte)
XoMEX
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.