RasPi Pico: Frequenz GPIO IN > 4kHz?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
D-Platoon
User
Beiträge: 3
Registriert: Montag 30. September 2019, 00:43

Hallo zusammen,

ich versuche mich gerade an einem Drehzahlsensor mittels einer Gabellichtschranke und einer Lochscheibe.
Um zu schauen, wie viele Löcher die Lochscheibe haben darf, hab ich die LED der Gabellichtschranke an den Funktionsgenerator und den Fototransistor an den Pico angeschlossen.
Wenn ich nun die Frequenz hoch drehe, merke ich ab ca. 4,2kHz, dass er anfängt, sich zu verschlucken (das passiert übrigens auch, wenn ich den FUG direkt an den Pico anschließe - am verwaschenen Transistorsignal liegts also nicht).
Jetzt meine Frage an euch: ist es normal, dass der Pico nicht mehr als rund 4kHz schafft, oder hab ich einfach einen saumäßig langsamen Code?

Hier mal noch meinen Code (ist noch nicht der Weisheit letzter Schluss, aber zum Testen reichts erstmal):

Code: Alles auswählen

from machine import Pin
import utime
from functions import int2bool

iPulse = Pin(2, Pin.IN)
LED = Pin(25, Pin.OUT)

bTimeStarted = False
bPulse = False
bPulseLastCycle = False
nTimeStarted = 0
nTimeLastPulse = 0
nPulses = 0
nResult = 0
cnZykluszeit = 1000000
cnMinute = 60000000
nTastgrad = 0

while True:
    bPulse = int2bool(iPulse.value())
    
    if bPulse and not bTimeStarted:
        nPulses = 0
        bTimeStarted = True
        nTimeStarted = utime.ticks_us()
    
    if bPulse and not bPulseLastCycle:
        nTimeLastPulse = utime.ticks_us()
        nPulses = nPulses + 1
    
    bPulseLastCycle = bPulse
    
    if bTimeStarted and (utime.ticks_us() > (nTimeStarted + cnZykluszeit)):
        nTastgrad = (nTimeLastPulse - nTimeStarted) / cnZykluszeit
        nResult = ((cnMinute * nTastgrad) / 50) / ((nTimeLastPulse - nTimeStarted) / nPulses)
        bTimeStarted = False
        print("#######")
        print(nTastgrad, "%")
        print(nPulses, "Hz")
        print(nResult, "U/min")
    
Viele Grüße,
D-Platoon
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Theoretisch kann der Pico das auch so ausprogrammiert, aber da wird dir MicroPython im Weg sein. Vor allem, weil du auch so viel machst in jedem Zyklus. IRQs wuerden die Last da etwas reduzieren. Wuerdest du C nehmen, dann ginge es.

Aber man macht das eh so nicht. Man verschwendet keinen Kern auf das simple zaehlen von Pulsen. Dazu hat der Pico seine PIO-Einheiten, mit denen sowas quasi kostenlos nebenbei. Ein Einfuehrung findet sich zB hier: https://www.digikey.at/en/maker/project ... 97642e0831
D-Platoon
User
Beiträge: 3
Registriert: Montag 30. September 2019, 00:43

Hallo __deets__!
Vielen Dank für die schnelle Antwort!
In dem Fall werde ich mich jetzt mal in die PIO-Thematik einlesen und schauen, wie ich damit zurande komme. Vermutlich muss ich mich dann nochmal melden...
Antworten