# Optischer Geschwindigkeitssensor



## somann88 (23 November 2020)

Hallo,

ich versuche gerade zu verstehen, wie ich den optischen Geschwindigkeitssensor der Schlauchpumpe anschließen muss.

Siehe Datenblatt: https://www.boxerpumps.com/fileadmin/dateien/peristaltic/25K/Schlauchpumpe_25K.pdf

Optionale Sensoren -> 1 Optischer Geschwindigkeitssensor


Aus der Pumpe kommen vier Kabel raus mit den, bei der Schaltung angegebenen Farben Schwarz, Rot und Weiß, Grün.

Aus der Tabelle darunter kann ich nur die Stromaufnahme der Diode, den Kollektorschaltstrom und die max. Kollektor-Emitter-Spannung von 30V sehen.

Woher weiß ich jetzt, wieviel Spannung die Diode braucht? Und was muss ich jetzt allgemein wo anschließen?


Wäre super, wenn mir da jemand auf die Sprünge helfen könnte.


----------



## Heinileini (23 November 2020)

Das ist anscheinend eine Lichtschranke mit einer LED und einem FotoTransistor.
Die Anode der LED über einen VorWiderstand an "plus" einer Gleichspannung (z.B. 24 V) anlegen, Cathode an -.
VorWiderstand = (24 V - a V)/ b mA; a ca. 2V, b ca. 20 mA, also ca. 1,2 kOhm, 0,5 W.

Collector an +24 V, Emitter an Digital-Eingang.

Impulse am DigitalEingang (ggfs - je nach max. Drehzahl - einer ZählerKarte) zählen (12 pro Umdrehung).
Laut Abbildung würde ich ziemlich kurze Impulse erwarten mit relativ langen Pausen zwischen den Impulsen.
Das spricht auch für die Verwendung einer ZählerKarte.


----------



## somann88 (24 November 2020)

Hallo Heinileini,

danke für deine schnelle und ausführliche Antwort.

Dachte mir auch schon, dass es eine Lichtschranke sein muss, aber mit der Diodenspannung war ich mir nicht sicher.

Hab jetzt mal ca. 2V an die Diode und an den Collector 5V angelegt. Dann hab ich die Pumpe erstmal von Hand langsam gedreht und konnte sehen, dass die 5V immer wieder durchgelassen und wieder gesperrt wurden - also funktioniert bestens so.

Wie ich die Impulse dann registriere, muss ich mir noch überlegen, da die Pumpe ungefähr mit 500Upm laufen wird und pro Umdrehung 12 Impulse gegeben werden => 6000 Impulse/min => 100 Impulse/s


----------



## Heinileini (24 November 2020)

somann88 schrieb:


> Hab jetzt mal ca. 2V an die Diode und an den Collector 5V angelegt.
> 
> Wie ich die Impulse dann registriere, muss ich mir noch überlegen, da die Pumpe ungefähr mit 500Upm laufen wird und pro Umdrehung 12 Impulse gegeben werden => 6000 Impulse/min => 100 Impulse/s


Bitte Vorsicht mit den "ca. 2 V an der Diode"! Das ist nur ein PiQuadratMalDaumen-Wert, um den SpannungsAbfall an der Diode bei der Berechnung des Vorwiderstandes nicht gänzlich zu ignorieren.
Kleine Schwankungen der Spannung an der Diode (in DurchlassRichtung) sind schon der Unterschied zwischen "Leben" (= leuchten) und "Tod" (= unumkehrbarer Defekt) einer Diode!
Bitte immer einen VorWiderstand benutzen (oder eine hochohmige "StromQuelle" im Gegensatz zu einer niederohmigen "SpannungQuelle").
Welche Spannung sich an der LED beim gewünschten Strom einstellt, das kann von LED zu LED recht unterschiedlich sein, je nach LichtFarbe und je nach dem verwendeten Material (GaAs u.s.w.).

Zu den am Collector angelegten 5 V:
Das hängt davon ab, welche Spannung die Eingänge der von Dir verwendeten Eingangs- bzw. Zähler-Karte verlangen. Aber unter den angegebenen 30 V bleiben.

Welche ZyklusZeit hat Deine PLC? Sie muss kürzer als die minimale ImpulsDauer (und kürzer als die minimale PausenDauer zwischen zwei Impulsen) der LichtSchranke sein, damit die Impulse direkt von der PLC (d.h. ohne Verwendung einer ZählerKarte) gezählt werden können. Das könnte schon "sportlich", also grenzwertig sein. Am besten mal die Impulse bei der maximal vorkommenden Drehzahl oszilloskopieren, um keine unliebsamen Überraschungen erleben zu müssen.


----------



## somann88 (30 November 2020)

Ich hab jetzt nochmal mit dem Hersteller Rücksprache gehalten. Die gehen von 1,5 V aus.

Ich verwende keine SPS, sondern ein Raspberry Pi 3B+

Die Diode bekommt jetzt 1,5 V und am Collector liegen 3,3V vom Raspberry Pi an. An sich funktioniert das jetzt auch gut.

Ich habe ein Python-Script geschrieben, was mit Hilfe der GPIO Library und der Funktion "add_event_detect" auf eine Änderung am GPIO Pin achtet und dann bei einer steigenden Flanke den Zähler eins hochzählt. Die Impulse kann der Pi auch alle erfassen - mein Problem ist jetzt nur noch, dass zuviele Impulse erkannt werden. Habe es schon mit der bouncetime versucht und dann funkioniert es schon besser, aber richtig zufriedenstellend ist es nicht, da die bouncetime dann auch noch in Abhänigkeit der Drehzahl angepasst werden muss und die Drehzahl auch nicht von Anfang an bei 100% liegt, also auch hier wieder falsch gezählte Impulse.

Wahrscheinlich bin ich hier jetzt nicht mehr ganz richtig, da es in diesem Forum ja weniger bis garnicht um Raspbery Pi geht, aber vielleicht hast du / jemand ja trotzdem einen Tipp dazu.

Ich hab auch schon was von Zähler-ICs oder Kondensatoren davor schalten gelesen...

Falls es von Interesse ist, hab ich hier mal mein Python-Script:


```
[COLOR=#D4D4D4][FONT=Menlo][COLOR=#6a9955]#!/usr/bin/python[/COLOR]
[COLOR=#c586c0]import[/COLOR] RPi.GPIO [COLOR=#c586c0]as[/COLOR] GPIO
[COLOR=#c586c0]import[/COLOR] math, time, sys, json

[COLOR=#6a9955]# Status-Variable, die angibt, ob die Füllmenge erreicht wurde[/COLOR]
DesiredFillingLevelReached = [COLOR=#569cd6]False[/COLOR]

[COLOR=#6a9955]# Impuls-Zähler-Variable[/COLOR]
CurrentFillingLevelImpulses = [COLOR=#b5cea8]0[/COLOR]

[COLOR=#6a9955]# Füllmenge pro Impuls[/COLOR]
FillingLevelPerImpulse = [COLOR=#b5cea8]0.35[/COLOR] [COLOR=#6a9955]# 4,20ml pro Umdrehung (12 Impulse) => 4,20ml/12 = 0,35ml[/COLOR]

[COLOR=#6a9955]# Startzeit in ms[/COLOR]
StartTime = [COLOR=#4ec9b0]int[/COLOR]([COLOR=#dcdcaa]round[/COLOR](time.time() * [COLOR=#b5cea8]1000[/COLOR]))

[COLOR=#569cd6]def[/COLOR] [COLOR=#dcdcaa]get_desired_filling_level_as_impulses[/COLOR]([COLOR=#9cdcfe]DesiredFillingLevel[/COLOR]):
    [COLOR=#569cd6]global[/COLOR] FillingLevelPerImpulse
    [COLOR=#c586c0]return[/COLOR] math.ceil(DesiredFillingLevel / FillingLevelPerImpulse)

[COLOR=#569cd6]def[/COLOR] [COLOR=#dcdcaa]main[/COLOR]():
    [COLOR=#dcdcaa]print[/COLOR]([COLOR=#ce9178]'Warte auf Impulse...'[/COLOR])

    [COLOR=#6a9955]# Anzahl Impulse für die gewünschte Füllmenge ermitteln[/COLOR]
    DesiredFillingLevelImpulses = get_desired_filling_level_as_impulses([COLOR=#b5cea8]100[/COLOR]) [COLOR=#6a9955]# in ml[/COLOR]

    [COLOR=#6a9955]# Pinreferenz waehlen[/COLOR]
    GPIO.setmode(GPIO.BCM)

    [COLOR=#6a9955]# GPIO als Eingang definieren und Pull-Down Widerstand aktivieren[/COLOR]
    GPIO.setup([COLOR=#b5cea8]18[/COLOR], GPIO.IN, [COLOR=#9cdcfe]pull_up_down[/COLOR] = GPIO.PUD_DOWN)

    [COLOR=#6a9955]# Callback-Funktion[/COLOR]
    [COLOR=#569cd6]def[/COLOR] [COLOR=#dcdcaa]Interrupt[/COLOR]([COLOR=#9cdcfe]channel[/COLOR]):
        [COLOR=#569cd6]global[/COLOR] CurrentFillingLevelImpulses
        [COLOR=#569cd6]global[/COLOR] DesiredFillingLevelReached
        [COLOR=#6a9955]# CurrentFillingLevelImpulses um eins erhöhen[/COLOR]
        CurrentFillingLevelImpulses = CurrentFillingLevelImpulses + [COLOR=#b5cea8]1[/COLOR]
        [COLOR=#dcdcaa]print[/COLOR] ([COLOR=#ce9178]'FillingLevelImpulses: '[/COLOR] + [COLOR=#4ec9b0]str[/COLOR](CurrentFillingLevelImpulses) + [COLOR=#ce9178]' / '[/COLOR] + [COLOR=#4ec9b0]str[/COLOR](DesiredFillingLevelImpulses))
        [COLOR=#c586c0]if[/COLOR] CurrentFillingLevelImpulses >= DesiredFillingLevelImpulses:
            DesiredFillingLevelReached = [COLOR=#569cd6]True[/COLOR]


    [COLOR=#6a9955]# Interrupt-Event hinzufügen, steigende Flanke[/COLOR]
    GPIO.add_event_detect([COLOR=#b5cea8]18[/COLOR], GPIO.RISING, [COLOR=#9cdcfe]callback[/COLOR] = Interrupt, [COLOR=#9cdcfe]bouncetime[/COLOR]=[COLOR=#b5cea8]10[/COLOR])

    [COLOR=#c586c0]while[/COLOR] DesiredFillingLevelReached == [COLOR=#569cd6]False[/COLOR]:
        [COLOR=#c586c0]pass[/COLOR]

    GPIO.cleanup()
    EndTime = [COLOR=#4ec9b0]int[/COLOR]([COLOR=#dcdcaa]round[/COLOR](time.time() * [COLOR=#b5cea8]1000[/COLOR])) - StartTime
    [COLOR=#dcdcaa]print[/COLOR]([COLOR=#ce9178]'CurrentFillingLevelImpulses = '[/COLOR] + [COLOR=#4ec9b0]str[/COLOR](CurrentFillingLevelImpulses) + [COLOR=#ce9178]', Time = '[/COLOR] + [COLOR=#4ec9b0]str[/COLOR](EndTime))

[COLOR=#6a9955]# Prozess starten[/COLOR]
[COLOR=#c586c0]if[/COLOR] [COLOR=#9cdcfe]__name__[/COLOR] == [COLOR=#ce9178]'__main__'[/COLOR]:
    main()
[/FONT][/COLOR]
```


----------



## Heinileini (30 November 2020)

somann88 schrieb:


> ... mein Problem ist jetzt nur noch, dass zu viele Impulse erkannt werden. Habe es schon mit der bouncetime versucht und dann funkioniert es schon besser, aber richtig zufriedenstellend ist es nicht, da die bouncetime dann auch noch in Abhänigkeit der Drehzahl angepasst werden muss und die Drehzahl auch nicht von Anfang an bei 100% liegt, also auch hier wieder falsch gezählte Impulse.


Ja, das Dilemma ist, dass Du die "richtigen" und die "falschen" Impulse nicht unterscheiden kannst. Kommen (zu) häufig Impulse, so gehst Du von einer höheren Drehzahl aus und verringerst dementsprechend die "bouncetime" und schon erfasst Du noch mehr Impulse, ohne aber zu wissen, ob dies "ernstzunehmende" Impulse sind oder irgendwelche "StörImpulse".

Es kann sein, dass die Lichtschranke eine tatsächlich vorhandene Bewegung meldet, obwohl eigentlich Stillstand herrscht. Ein Zittern oder Vibrieren der Lochscheibe, die durch die Lichtschranke abgetastet wird, kann dazu führen. Egal, ob durch Erschütterungen aus der Umgebung oder Hin- und Her-Zucken des Motors durch die Regelung des Motors erzeugt.

Es kann aber auch sein, dass Schwankungen (z.B. "Welligkeit") der BetriebsSpannung den Unterschied machen zwischen der Erkennung eines (scheinbar) eindeutigen 1-Signals und der Erkennung eines (scheinbar) eindeutigen 0-Signals.

Nicht Hysterie, aber Hysterese ist hier angesagt. Betreibst Du die LED und den FotoTransistor an derselben BetriebsSpannung?
Dann wäre es ziemlich einfach, die Helligkeit der LED bzw. den Strom durch die LED in Abhängigkeit des vom FotoTransistor empfangenen Signals zu steuern. 
Eine Mitkopplung in dem Sinne, FotoTansistor empfängt ein Signal und erhöht den Strom durch die LED ein wenig, FotoTransistor empfängt kein Signal und vermindert den Strom durch die LED ein wenig.
Damit erhältst Du eine Hysterese in dem Sinne, dass der FotoTransistor bei weniger Abdeckung des Lichtstrahls als zuvor auf 1-Signal schaltet und bei mehr Abdeckung als vorher auf 0-Signal.

Ein weiterer positiver Effekt ist, dass durch die Mitkopplung schneller zwischen den beiden Pegeln (1-Signal und 0-Signal) umgeschaltet wird.
Ein längerer "Aufenthalt" im Bereich zwischen eindeutig als 1-Signal erkannt einerseits und eindeutig als 0-Signal erkannt andererseits, sollte unbedingt vermieden werden, da ein Digital-Signal in genau dieser Phase am störanfälligsten ist. Deshalb sollte man es auch vermeiden, digitale Signale über TiefPässe (RC-Glied) zu "verlangsamen". Es führt oft nicht zur beabsichtigten Verringerung der StörAnfälligkeit, sondern zum genauen Gegenteil.

Durch Verdrillen der Leitung und durch Abschirmung lässt sich die Empfindlichkeit gegen StörImpulse ausserdem verringern.


----------



## somann88 (30 November 2020)

Heinileini schrieb:


> Betreibst Du die LED und den FotoTransistor an derselben BetriebsSpannung?



Ja, die LED und der FotoTransistor werden beide von der 3,3 V Spannung vom RPi versorgt.
Vor der LED ist ein 39 Ohm Widerstand.
Der FotoTransistor bekommt die vollen 3,3 V.

Dein Idee mit der Mitkopplung hört sich interessant an, aber ich bin mir nicht ganz sicher, wie du dir die Umsetzung davon vorstellst.

Meinst du, dass der Transistor die LED "selbstständig" mitsteuert, oder sollte das beispielsweise per Digital/Analog-Converter geregelt werden?


----------



## Thomas_v2.1 (30 November 2020)

Skizziere doch mal bitte deine Schaltung wie du den Fototransistor an den Raspberry angeschlossen hast "Der FotoTransistor bekommt die vollen 3,3 V" hört sich etwas seltsam an.
Der Pulldown-Widerstand im Raspberry selber hat 50 kOhm, das bekommt mal u.U. mit einem kleineren Widerstandswert etwas störfester


----------



## somann88 (30 November 2020)

Thomas_v2.1 schrieb:


> Skizziere doch mal bitte deine Schaltung wie du den Fototransistor an den Raspberry angeschlossen hast "Der FotoTransistor bekommt die vollen 3,3 V" hört sich etwas seltsam an.
> Der Pulldown-Widerstand im Raspberry selber hat 50 kOhm, das bekommt mal u.U. mit einem kleineren Widerstandswert etwas störfester



Ja, war vielleicht etwas zu Umgangssprachlich ausgedrückt...

Hier der Schaltplan auf die schnelle erstellt:


----------



## Thomas_v2.1 (30 November 2020)

Ich würde testweise vom GPIO Pin mal einen externen Widerstand von 10 kOhm (als Anfangswert) nach Masse schalten, damit etwas mehr Strom durch den Transistor fließt. Den internen Pull-Down könntest du dann abschalten, oder auch aktiv lassen. Du kannst theoretisch mit dem Wert auch noch weiter runter gehen, weil bis zu 30 mA erlaubt sind. Ich würde aber auch bei der LED wenn nicht notwendig an den Maximalwert gehen, das geht auf die Lebensdauer.


----------



## somann88 (1 Dezember 2020)

Thomas_v2.1 schrieb:


> Ich würde testweise vom GPIO Pin mal einen externen Widerstand von 10 kOhm (als Anfangswert) nach Masse schalten, damit etwas mehr Strom durch den Transistor fließt. Den internen Pull-Down könntest du dann abschalten, oder auch aktiv lassen. Du kannst theoretisch mit dem Wert auch noch weiter runter gehen, weil bis zu 30 mA erlaubt sind. Ich würde aber auch bei der LED wenn nicht notwendig an den Maximalwert gehen, das geht auf die Lebensdauer.



Ich hab jetzt mal einen 10 kOhm Widerstand als externen Pull-Down an den GPIO Pin geschalten und den internen deaktiviert. Es scheint etwas besser zu sein, aber es werden trotzdem noch mehrere Impulse erkannt, wenn sich ein Schlitz durch die Lichtschranke bewegt. Ich kann die Pumpe erst morgen früh wieder laufen lassen - zu laut. Wenn ich mit dem Finger die Scheibe mit den Schlitzen ein Stück, schnell drehe, sodass ein Schlitz durch die Lichtschranke geht, werden 2 Impulse erfasst.

Werde ich auf jeden Fall morgen nochmal weiter testen...

Die LED ist mit 39 Ohm nicht ganz am Limit. 46 mA ungefähr, aber ja, stimmt schon, da kann ich auch noch einen größeren Widerstand verwenden.

Was meinst du genau mit "Du kannst theoretisch mit dem Wert auch noch weiter runter gehen, weil bis zu 30 mA erlaubt sind." ?

Im Datenblatt steht ja, dass der Kollektorschaltstrom 30mA beträgt, aber das bedeutet ja, dass er ab 30mA schaltet und nicht, dass max. 30mA fließen dürfen, oder?


----------



## Heinileini (1 Dezember 2020)

somann88 schrieb:


> Meinst du, dass der Transistor die LED "selbstständig" mitsteuert, ...?


Ja, genau daran hatte ich gedacht. Möglichst nah an der Quelle einzugreifen.  
Habe nach 'OPB8340W datasheet Optek Technology' geguckelt und ... nichts gefunden, was der Bezeichnung OPB8340W allzu nahe kommt. Habe mich auf 'OPB830_OPB840' eingeschossen und das Datenblatt heruntergeladen. Leider hilft mir das auch nicht weiter. Auch mit RasPi-Erfahrung bin ich leider nicht "vorbelastet". 
Hast Du denn schon eine Vorstellung oder Beispiele, wie Du den FotoTransistor am RasPi anschliessen willst/müsstest? Irgendwie irritiert mich Deine Formulierung "Der FotoTransistor bekommt die vollen 3,3 V.". 

Gruss Heinileini

PS:
Da haben sich ja schon von mir unbemerkt diverse Beiträge angesammelt, die ich, als ich schrieb, noch nicht sehen konnte.


----------



## somann88 (1 Dezember 2020)

Heinileini schrieb:


> Ja, genau daran hatte ich gedacht. Möglichst nah an der Quelle einzugreifen.
> Habe nach 'OPB8340W datasheet Optek Technology' geguckelt und ... nichts gefunden, was der Bezeichnung OPB8340W allzu nahe kommt. Habe mich auf 'OPB830_OPB840' eingeschossen und das Datenblatt heruntergeladen. Leider hilft mir das auch nicht weiter. Auch mit RasPi-Erfahrung bin ich leider nicht "vorbelastet".
> Hast Du denn schon eine Vorstellung oder Beispiele, wie Du den FotoTransistor am RasPi anschliessen willst/müsstest? Irgendwie irritiert mich Deine Formulierung "Der FotoTransistor bekommt die vollen 3,3 V.".
> 
> ...



Nach dem Datenblatt hab ich am Anfang auch gleich gesucht, aber nichts gefunden.

Mir ist nur noch nicht ganz klar, wie ich diese Mitkopplung umsetzen könnte...

Dich irritiert die Aussage also auch?  War wohl etwas unglücklich formuliert... ich meinte damit einfach, dass im Gegensatz zur LED, am Fototransistor die vollen 3,3 V (also ohne Vorwiderstand) anliegen.

Mit Vorwiderstand = nicht die vollen 3,3 V
Ohne Vorwiderstand = die vollen 3,3 V

Nachvollziehbar? 


Gesendet von iPhone mit Tapatalk


----------



## Heinileini (1 Dezember 2020)

somann88 schrieb:


> Im Datenblatt steht ja, dass der Kollektorschaltstrom 30mA beträgt, aber das bedeutet ja, dass er ab 30mA schaltet und nicht, dass max. 30mA fließen dürfen, oder?


Keineswegs! Maximal 30 mA, also auch hier weniger Strom anpeilen!


----------



## Heinileini (1 Dezember 2020)

Ich will mich nicht davor drücken, aber es fällt mir schwer, zumal dies nur auf dem Papier (bzw. in Excel) entstanden ist:




So in etwa würde ich anfangen zu experimentieren. 
Im Gegensatz zu Deiner Schaltung wird hier das Signal invertiert. Wäre das ein Problem ... oder könntest Du dies im RasPi "kompensieren"?


----------



## somann88 (1 Dezember 2020)

Erstmal danke für deine intensive Hilfe!

Das Problem ist, dass ich gerade nur NPN Transistoren da hab. Muss ich also erst bestellen.

Die einzigen zwei PNP Transistoren, die ich hab, sind welche, die ich mal irgendwo aus nem Verstärker oder so ausgebaut hab:

https://datasheetspdf.com/datasheet/B772P.html

und

https://datasheetspdf.com/pdf/545690/WuxiYoudaElectronics/D882P/1

Die Widerstandswerte bekomme ich ungefähr hin.


Wie meinst du "das Signal ist invertiert"?


Jetzt noch was Neues:

Ich hab heute nochmal viel getestet. Unter Anderem mit meinem Arduino Uno, ob er das besser macht, aber auch hier bekam ich erstmal zu viele Impulse. Dann hab ich mal statt einem 10 kOhm Pull-Down Widerstand, einen 5 kOhm Widerstand genommen und die Werte waren um einiges besser. Keine doppelten Impulse mehr. Danach hab ich noch weitere Versuche mit dem Pull-Down gemacht und kann jetzt sagen, dass unter 5 kOhm nichts mehr erkannt wird.

Also hab ich alles wieder umgebaut und das Ganze mit dem Raspberry Pi probiert. Und es funktioniert echt gut mit dem 5 kOhm Pull-Down.

Werde jetzt nochmal die Pumpe laufen lassen und checken, ob auch wirklich alle Impulse erkannt werden und melde mich dann nochmal zurück.


----------



## Heinileini (1 Dezember 2020)

somann88 schrieb:


> Wie meinst du "das Signal ist invertiert"?


Ursprüngliche Schaltung: Schlitz in der Scheibe wird mit Hi-Signal gemeldet, sonst Lo-Signal am GPIO.
Also *positive Flanke* zu Beginn des Impulses und negative Flanke am Ende des Impulses.

Mein SchaltungVorschlag: Schlitz in der Scheibe wird mit Lo-Signal gemeldet, sonst Hi-Signal am GPIO.
Also negative Flanke zu Beginn des Impulses und *positive Flanke* am Ende des Impulses.

Du schriebst:


> "... was mit Hilfe der GPIO Library und der Funktion "add_event_detect" auf eine Änderung am GPIO Pin achtet und dann bei einer *steigenden Flanke *den Zähler eins hochzählt ..."


Du zählst somit nach der SchaltungsÄnderung mit der negativen Flanke des Lichtstrahls. Ich weiss nicht, ob man das im RasPi - falls überhaupt erforderlich - anpassen könnte.
Dürfte aber keinen "lebenswichtigen" Unterschied machen.

Das Invertieren ist übrigens von mir nicht beabsichtigt, sondern nur eine "Nebenwirkung".

Nachtrag zu meiner Schaltung: 
Spannung am Collector des PNP gegen Masse (GND) messen, um sehen zu können, ob der PNP so wirkt, wie er soll:
- ca. 1,5 V (LED-Spannung), wenn der PNP nicht durchschaltet (wenn LichtSchranke unterbrochen = kein Schlitz)
- ca. 3 V, wenn der PNP durchschaltet (wenn LichtSchranke nicht unterbrochen = Schlitz)

Mit Deinen Links zu den PNPs bin ich nur mühsam voran gekommen, sah den Wald vor lauter irrelevanter Werbung etc. kaum noch.
1-A-Typen. Die brauchst Du nicht wirklich. BC557B o.ä. sollte gehen. Oder benötigst Du SMD-Typen (die Winzlinge ohne Beinchen, zum Auflöten)?

Auf das Thema PullUp-/PullDown-Widerstände kommen wir dann später zurück ...


----------



## somann88 (1 Dezember 2020)

Heinileini schrieb:


> Ursprüngliche Schaltung: Schlitz in der Scheibe wird mit Hi-Signal gemeldet, sonst Lo-Signal am GPIO.
> Also *positive Flanke* zu Beginn des Impulses und negative Flanke am Ende des Impulses.
> 
> Mein SchaltungVorschlag: Schlitz in der Scheibe wird mit Lo-Signal gemeldet, sonst Hi-Signal am GPIO.
> ...



Ich hab jetzt mal ein paar Bauteile bestellt. Kommt leider erst am Freitag an.

Also wenn ich dich richtig verstanden hab, muss ich ja dann nur auf die fallende Flanke achten, anstatt auf die steigende. Somit wäre das doch schon gelöst, oder? Und das geht ja im Programmcode.

Und die ganze Schaltung stellt dann einen Schmitt-Trigger dar?

Ja die Webseite für die Datenblätter ist wirklich mit Werbung zugemüllt. Gut, dass du dich trotzdem zurecht gefunden hast 

SMD-Bauteile müssen es nicht sein. Wird erstmal ein Prototyp, Ich löte dann später alles auf eine Lochrasterplatine.

Ich bin schon gespannt wie die Schaltung sich verhält.


----------



## Thomas_v2.1 (1 Dezember 2020)

Also der Raspberry hat sicherlich auch genug Rechenleistung um das alles in Software zu machen. Bevor ich da eine große Schaltung drumzustricke, würde ich mal sehen was in Software geht. Die Softwarelösung kostet dich einmal Zeit/Geld, wenn du es raus hast dann kannst du das so immer wiederverwenden.
Sinnvoll wäre hier aber mal mit einem Oszilloskop nachzuschauen, woher diese Fehl-Signale überhaupt kommen. Das ist schon etwas seltsam, dass eine optische Schaltung so viele Fehl-Signale ausgeben soll. Prellen kann dort schließlich nichts.


----------



## Heinileini (1 Dezember 2020)

somann88 schrieb:


> 1. Also wenn ich dich richtig verstanden hab, muss ich ja dann nur auf die fallende Flanke achten, anstatt auf die steigende. Somit wäre das doch schon gelöst, oder? Und das geht ja im Programmcode.
> 
> 2. Und die ganze Schaltung stellt dann einen Schmitt-Trigger dar?
> 
> 3. Ich bin schon gespannt wie die Schaltung sich verhält.


Zu 1.: "Im Prinzip ja". Ich habe mich durch den Begriff "Event" verleiten lassen, zu denken, dass vielleicht der RasPi (und nicht Dein Programm) auf eine positive Flanke prüft und dann einen Interrupt auslöst bzw. eine Task startet. Falls das so wäre, aber der RasPi dasgleiche nicht für negative Flanken könnte, dann ...

Zu 2.: Ja, das ist der Plan. Wobei aber ausnahmsweise die Mitkopplung auf optischem (Um-)Wege wirkt.

Zu 3.: Rat mal, wer noch.  Kann immerhin recht knifflig werden. Aber das Prinzip hast Du offensichtlich durchschaut.

Thomas' Vorschlag mit dem Oszilloskop lag mir schon länger auf der Zunge, hab's irgendwie immer wieder verdrängt ...
Seinen Ansatz, die Störungen per SW zu unterdrücken, halte ich nicht für aussichtslos. Das hängt sehr stark von der Art und der Ursache der Störungen ab.

Ich vermute die Ursache darin, dass wir eigentlich ein analoges Signal in ein digitales wandeln: das am FotoTransistor einfallende Licht dürfte zwischen 2 Pegeln wechseln mit an- und absteigenden Rampen. Und die Rampen sind ein Problem, erst recht, wenn der Motor mitten in so einer Rampe steht und das ausgegebene Signal irgendwo zwischen Hi und Lo steht.
Bei A/B-Signalen von "richtigen" Gebern bin ich übrigens weniger skeptisch. Dort sind die StörImpulse entweder so kurz, dass sie vom der SW gar nicht erst wahrgenommen werden, oder sie sind lang genug und führen dann zu einem Hin- und Her-Zählen, so dass die Störungen sich nicht nur in einer einzigen ZählRichtung auswirken, sondern "gegenseitig kompensieren".


----------



## somann88 (2 Dezember 2020)

Heinileini schrieb:


> Zu 1.: "Im Prinzip ja". Ich habe mich durch den Begriff "Event" verleiten lassen, zu denken, dass vielleicht der RasPi (und nicht Dein Programm) auf eine positive Flanke prüft und dann einen Interrupt auslöst bzw. eine Task startet. Falls das so wäre, aber der RasPi dasgleiche nicht für negative Flanken könnte, dann ...
> 
> Zu 2.: Ja, das ist der Plan. Wobei aber ausnahmsweise die Mitkopplung auf optischem (Um-)Wege wirkt.
> 
> ...



Zu 1.: Ok, dann hab ich dich schon richtig verstanden und ich kann definitiv steigende, fallende oder auch beide Flanken überwachen.

Was den Vorschlag von Thomas mit dem Oszilloskop angeht: ich würde wirklich gerne die Signale mal oszilloskopieren, aber ich hab leider keins...

Und Ja, ich würde es ja auch gerne Softwaretechnisch lösen. Ich hab nur keine Idee mehr wie. Die einzige Möglichkeit die vielen Impulse nach dem gültigen Impuls zu „ignorieren“, besteht doch darin, zu prellen - also letztendlich die bouncetime setzen. Aber dabei muss ich die Drehzahl beachten und zusätzlich bleibt es weiterhin mehr ein Annähern, als eine Berechnung, da die Drehzahl ja nicht sofort zu 100% da ist und die bouncetime beim Hochfahren der Drehzahl somit erstmal einen falschen Wert hat.

@Thomas: Wenn du irgendeine Idee hast, wie ich das sonst angehen könnte, dann probiere ich es gerne.

Übrigens hat mir der Support des Herstellers noch eine kleine Skizze geschickt. Auch wenn das jetzt keine bahnbrechenden Neuigkeiten sind:


----------



## Heinileini (2 Dezember 2020)

Die gehen also von 47 mA bei der LED aus und 12 bzw. 24 mA beim FotoTransistor.
Na ja. Behalten wird das im Hinterkopf. Ist denn die Lichtschranke als Ersatzteil gut erhältlich und ein Austausch leicht durchzuführen? 

Probier es bitte auf der FotoTransistor- bzw. RasPi-Seite gar nicht erst mit > 3,3 V. Da soll der RasPi absolut keinen Spass verstehen!

Ansonsten EmitterSchaltung statt KollektorSchaltung ... dann war ich wohl doch auf dem richtigen Wege?


----------



## Heinileini (2 Dezember 2020)

Mit Rücksicht auf die RasPi GPIOs war ich bisher gedanklich auf eine BetriebsSpannung von 3,3 V festgenagelt.
Mit einer 2. BetriebsSpannung von 5 V oder mehr eröffnen sich andere LösungsWege.
Der Hinweis auf das Bestellen-müssen eines PNP-Transistors hat meine grauen Zellen nochmal aktiviert - leider für Dich zu spät. 
Statt eines PNPs nun ein Opto-Koppler und 1 Widerstand eingespart:




Bei der angegebenen Dimensionierung und der BetriebsSpannung von 5V sollten sich Ströme von jeweils ca. 11 mA durch die VorWiderstände R1 und R2 ergeben.
Die LED der Lichtschranke wird entweder durch den mit R1 bestimmten oder durch beide Ströme (Summe!) durchflossen.
Diese Variante gefällt mir besser - bei der anderen bereitet mir das AusTarieren des "ArbeitsPunktes" des PNP weiterhin etwas KopfGrimmen.


----------



## somann88 (2 Dezember 2020)

Heinileini schrieb:


> Mit Rücksicht auf die RasPi GPIOs war ich bisher gedanklich auf eine BetriebsSpannung von 3,3 V festgenagelt.
> Mit einer 2. BetriebsSpannung von 5 V oder mehr eröffnen sich andere LösungsWege.
> Der Hinweis auf das Bestellen-müssen eines PNP-Transistors hat meine grauen Zellen nochmal aktiviert - leider für Dich zu spät.
> Statt eines PNPs nun ein Opto-Koppler und 1 Widerstand eingespart:
> ...



Ok, finde deine neue Idee gut, aber was genau bringen mir die 5V statt der 3,3V?
Meinst du jetzt, weil die Spannung an der LED damit ohne Transistor verändert werden kann, oder sind die 5V vielleicht besser nach dem Prinzip "viel bringt viel"? 

Ich verstehe es jetzt so:

1. Lichtschranke unterbrochen = kein Schlitz
   - Fototransistor schaltet nicht durch
   - Strom durch die LED = ca. 11mA
   - Transistor des Optokopplers schaltet nicht durch
   - eine 0 am GPIO

2. Lichtschranke nicht unterbrochen = Schlitz
   - Fototransistor schaltet durch
   - Strom durch die LED = ca. 11mA + ca. 19mA  = 30mA (oder 25mA? Weil die beiden Widerstände doch letztendlich parallel geschalten sind!? )
   - Transistor des Optokopplers schaltet durch
   - eine 1 am GPIO


----------



## Heinileini (2 Dezember 2020)

somann88 schrieb:


> 3. ... was genau bringen mir die 5V statt der 3,3V?
> 
> 1. Lichtschranke unterbrochen = kein Schlitz
> - Fototransistor schaltet nicht durch
> ...


Zu 1. & 2.: Am GPIO sieht es genau umgekehrt ("invertiert") aus!

Zu 2.: Nicht die Widerstände sind parallel geschaltet, sondern die Ströme, die durch diese Widerstände fliessen. Die Spannungen an den Widerständen sind jedoch unterschiedlich!

Zu 3.: Die LEDs sind in Reihe geschaltet! Darum haben wir bei einer BetriebsSpannung von 3,3 V so gut wie keinen Spielraum, den Strom durch die OptoKoppler-LED per VorWiderstand zu beeinflussen.

Zu 2.: Ursprünglich wollte ich die Elemente im Schaltbild anders anordnen, hätte dazu aber die beiden Bestandteile der LichtSchranke auseinanderreissen müssen. 
Die Übersichtlichkeit ist leider so oder so nicht wirklich überragend. 
Ich nehme an, Du kommst auf 19 mA, weil Du für den SpannungsAbfall an R2 einen zu grossen Wert für die Spannung genommen hast. Davon sind noch ...
- der SpannungsAbfall an der OptoKoppler-LED (ca. 1,5 V) und 
- der SpannungsAbfall am LichtSchranken-FotoTransistor (ca. 0,2 V) 
... abzuziehen.


----------



## somann88 (2 Dezember 2020)

Heinileini schrieb:


> Zu 1. & 2.: Am GPIO sieht es genau umgekehrt ("invertiert") aus!
> 
> Zu 2.: Nicht die Widerstände sind parallel geschaltet, sondern die Ströme, die durch diese Widerstände fliessen. Die Spannungen an den Widerständen sind jedoch unterschiedlich!
> 
> ...



Zu 1. & 2.: Ja stimmt, hab es falsch gesehen. Dachte es wäre ein Pull-Down Widerstand.

Zu 2.: Ok, passt.

Zu 3.: Verstehe.

Zu 2.: Ja, die zweite Diode hab ich erst garnicht beachtet. Hab übersehen, dass die Dioden ja dann in Reihe geschalten sind. Somit kommen dann statt 19mA, ca. 11mA dazu, richtig?


----------



## Heinileini (2 Dezember 2020)

:s12: . . . . .


----------



## Thomas_v2.1 (3 Dezember 2020)

somann88 schrieb:


> @Thomas: Wenn du irgendeine Idee hast, wie ich das sonst angehen könnte, dann probiere ich es gerne.



Nach ein paar Tests mit meinem Raspberry hier auf meinem Schreibtisch muss ich meinen Vorschlag mit der Softwarelösung zurückziehen. Ich habe nur mit einem Drehgeber (Bedienelement) getestet diesen mit den beiden Kanälen an zwei GPIO auszuwerten. Bei Raspberry sind schnelle zyklische Interrupts wie man so einen Geber normal auswerten würde nicht möglich, darum habe ich das auch mit dem Flanken-Interrupt probiert. Dabei kamen seltsame Ergebnisse heraus, wie dass obwohl wenn an einem Eingang eine steigende Flanke detektiert wurde, wenn ich im Interrupt den Signalzustand abfrage dieser wieder false hat - trotz diversen langen Debounce-Zeiten.

Mit etwas googeln gelangt man dann zur Information, dass die Auswertung der GPIO im Userland passiert, und mit entsprechend niedriger Priorität behandelt wird. Es kann als auch sein, dass das Ganze mal mehrere hundert ms verzögert wird. Ob dann auch Interrupts verloren gehen können habe ich nicht weiter nachgeforscht. Für mich ist nur wichtig, dass ich diese Eingänge höchstens für ein paar Schalter oder Taster verwenden kann, aber für nichts steuerungsrelevantes. Dazu wäre dann ein eigenes Kernel-Modul notwendig damit das entsprechend schnell bearbeitet wird. Aber bevor ich damit anfange, würde ich mal sehen ob die Codesys Runtime das fertig anbietet.


----------



## Heinileini (3 Dezember 2020)

Ich habe das jetzt so verstanden, Thomas, dass die Interrupts so schnell reagieren, dass die Informationen, auf die sie reagieren, im Programm noch gar nicht verfügbar sind?
Dann würde ich doch vorschlagen, alle 4 Flanken des A/B-Signals per Interrupt auszuwerten. Also ein "eigenes" Bit A mit der steigenden Flanke von Eingang A setzen und mit der fallenden Flanke von Eingang A rücksetzen. Dasgleiche Spiel mit Eingang B und einem "eigenen" Bit B. Diese "eigenen" Bits dann im Programm anstelle der Eingänge weiterverarbeiten. 
Das hilft aber wahrscheinlich nicht, wenn man nur 1 Signal und 1 Eingang wie im Fall der LS dieses Thread hat, da wir nach wie vor nicht erkennen, ob ein Impuls "nur" eine Störung oder "ernstzunehmen" ist.

Gruss, Heinileini

PS:
Hast Du da zum Testen einen "mechanischen" Geber mit prellenden (schleifenden) Kontakten?


----------



## Thomas_v2.1 (3 Dezember 2020)

Heinileini schrieb:


> Hast Du da zum Testen einen "mechanischen" Geber mit prellenden (schleifenden) Kontakten?


Mechanischer Geber, ja. Prellt etwas, aber nicht übermäßig. Ich habe auch nur einen Kontakt ausgewertet nur um mal zu testen was geht. Mit Flankeninterrupts ist die Auswertung beider Kanäle immer etwas wackelig, gibt bei mikrocontroller.net einen eigenen Artikel über die Probleme die bei der Flankenerkennung auftreten können.
Aber ein optisches Gerät sollte eigentlich überhaupt nicht prellen, oder da sind andere Störungen auf der Leitung (vom Motor?). Es gibt auch einige Forenbeiträge in denen berichtet wird, dass die Erkennung bei sich langsam ändernden Spannungen oft anspricht, weil da wohl nur eine sehr geringe Hysterese vorliegt wann 1 / 0 erkannt wird.


----------



## Heinileini (3 Dezember 2020)

Thomas_v2.1 schrieb:


> Aber ein optisches Gerät sollte eigentlich überhaupt nicht prellen, oder da sind andere Störungen auf der Leitung (vom Motor?). Es gibt auch einige Forenbeiträge in denen berichtet wird, dass die Erkennung bei sich langsam ändernden Spannungen oft anspricht, weil da wohl nur eine sehr geringe Hysterese vorliegt wann 1 / 0 erkannt wird.


Da gebe ich Dir Recht, Thomas. Prellen, wie bei mechanischen Kontakten, gibt es da nicht. Die "langsam sich ändernden Spannungen" sind tatverdächtig, denn das Signal ist letztlich ein AnalogSignal, das noch nicht auf DigitalSignal getrimmt ist. Viel Licht, Bisschen weniger Licht, mittelmässig Licht, Bisschen Licht, gar kein Licht. Entsprechende Spannung kommt am GPIO an und wird hier erst digitalisiert. Da kann man dem RasPi keine Vorwürfe machen ...
Danke für den Hinweis auf die "wackelige Auswertung der FlankenInterrupts". Schau ich mir mal an.

Gruss, Heinileini


----------



## Thomas_v2.1 (3 Dezember 2020)

Ich habe mal einen kleinen Testaufbau gemacht um zu prüfen was mit dem Raspberry überhaupt geht.

Ich habe einen Ausgang eines AVR Atmega an 5V über einen Optokoppler ISP847 an den GPIO17 eines Raspi 4 angeschlossen. LED Vorwiderstand 220 Ohm, Pulldown am GPIO 10 kOhm.
Der AVR Ausgang habe ich 2 ms ein, 8 ms aus, 100 mal Wiederholen, 5 Sekunden Pause, dann wiederholen.

Auswertung über Programm wie oben mit steigender Flankenerkennung über ein Python-Programm

Erkenntnis:
Mit einem print im Interrupt gehen etliche Impulse verloren. Hier sollte möglichst wenig passieren, zumindest kein print irgendwo hin.
Macht der Raspi sonst nichts außer über das Python Programm alle 5 Sekunden den Zählerstand auszugeben, geht ca. 1 von 10000 Impulsen verloren.
Wird der Raspberry verwendet, z.B. im Webbrowser das SPS-Forum aufgerufen, gehen etliche Impulse verloren, d.h. mehrere 10 für jeden 100er Schwall.

Sinnvoll verwenden lässt sich das meiner Meinung nach nicht, wenn du mit den gezählten Impulsen wirklich etwas berechnen willst.

Wenn man sich im Handbuch die Schlitze ansieht, dürften die Hellzeit auch nur sehr kurz sein, Verhältnis würde ich mal als 1:20 ansetzen.


----------



## roger34 (5 Dezember 2020)

Habe mir mal diese Thema durchgelesen.  
Ohne der Signalkontrolle per Oszi ist das Feststellen ob doppelimpule auftreten schwierig. 

Die schaltung von Heinileini mit Mitkopplung sieht ja mal nicht so schlecht aus.  Die Mitkoppling müsste aber schon über den nicht definierten Bereich des GPIO Eingangs liegen. Bei TTL als über 2,4V schon wirken. Damit wird der nicht definierte Bereich schnell durchgeschalten.

Deswegen wäre die Einfachste Lösung, nach dem Opto Transistor Ausgang (1te Schaltung) einen Tiefpass mit ca. 2kHz bis 5kHz und danach einen Schnittrigger baustein HC14 zu verwenden. 

Sollte der Pyton Schmitttrigger Eingänge haben, reicht ein RC Glied.


----------



## Heinileini (5 Dezember 2020)

roger34 schrieb:


> Die Mitkoppling müsste aber schon über den nicht definierten Bereich des GPIO Eingangs liegen. Bei TTL als über 2,4V schon wirken. Damit wird der nicht definierte Bereich schnell durchgeschalten.


Was bedeutet "... müsste über den nicht definierten Bereich des GPIO-Eingangs liegen"?
Das AusgangsSignal der Schaltung muss im RuheZustand unter dem nicht definierten Bereich liegen oder darüber und das Überqueren des Bereichs muss "zügig" geschehen.

Der EingangsPegel der Schaltung ist davon ganz unabhängig und der Bereich, in dem die Hysterese wirksam ist, muss so gelegt werden, dass die Schaltung sicher in dem Bereich arbeiten kann, den der FotoTransistor "hergibt".
Die Mitkopplung darf nicht so stark sein, dass die Schaltung an einem der Anschläge hängenbleibt und danach das Signal des FotoTransistors ignoriert.
Die Variante mit dem OptoKoppler sollte eigentlich auf Anhieb funktionieren - ggfs muss man die LED-Ströme noch ein wenig anheben.
Bei der Variante mit dem PNP-Transistor gehe ich davon aus, dass man den SpannungsTeiler noch "tunen" muss, von dem die Basis angesteuert wird.

Verdrillte, abgeschirmte Leitungen zum FotoTransistor einerseits und zur LED andererseits, wären mir wichtiger, als mit einem Tiefpass zu experimentieren.


----------



## Thomas_v2.1 (5 Dezember 2020)

Die elektrischen Spezifikationen des Raspberry sind sehr mangelhaft dokumentiert, viele Werte wurden von Benutzern nur durch Versuch und Irrtum herausgefunden.
Da die Auswertung mit dem GPIOs des Raspberry eh nicht zuverlässig funktioniert (zumindest nicht solange man Linux und die Auswertung mit Programmen im Userland macht), würde ich mich direkt nach einer anderen Lösung umsehen. Evtl. sind dann auch die ganzen anderen Phänomene mit erledigt.

Ich habe mir mal die Codesys Runtime auf meinen Raspberry aufgespielt, um zu sehen wie sich damit die Eingänge auswerten lassen, das sieht bei schnellen Signalen aber nochmal schlechter aus.
Ich bin ehrlich gesagt nach diesen Tests von Raspberry etwas enttäuscht. Im Grunde ist das nicht mehr als ein billiger PC, für kleine elektronische Spielereien ist damit meiner Meinung nach nichts zu holen, da viel zu spärlich dokumentiert, und das Linux oben drüber macht vieles schwer bis unmöglich.


----------



## roger34 (5 Dezember 2020)

Heinilein 
Nehmen wir TTL Pegel. Dann ist log High über 2.4V und Log Low unter 0.8V. Dazwischen ist der digitale Pegel nicht definiert. 
Der Opto Koppler wird aber durch die langsames Licht verschwinden und Licht kommen auch am Ausgang keinen definierten Pegel liefern. Wenn also der Pegel am Opto Koppler Ausgang von 0,8V auf 2,4V innerhalb geschätze 500us ansteigt, dann kann der Prozessor mehrere steigende Flanken erkennen. 

Nach dem Tiefpass ist ein Schitttrigger. Das heisst das Signal müsste merklich absinken um am schnitttrigger eine andere Flanke zu erzeugen.


----------



## roger34 (5 Dezember 2020)

Hier eine Simulation mit Tiefpass 100nFx2kOhm 
Am HC14 müsste sich die Spannung um 0,4V ändern um am Ausgang einen Anderen Zustand zu erzeugen.


----------



## somann88 (10 Dezember 2020)

Hallo Leute,

also ich hab mir jetzt mal ein billiges Oszilloskop aus China gekauft - ja ich weiß, Qualität kostet mehr ;-)

Trotz allem konnte ich damit jetzt mal die Rechteckspannung visualisieren und wer weiß - vielleicht ist es ja doch ganz nützlich das Signal etwas besser zu verstehen...

Ich hab mal ein kurzes Video gemacht, bei dem ich die Pumpe bei 0,4 V (entspricht 152 UPM) laufen lassen hab.

Auf dem Display vom Oszilloskop seht ihr ja die Einstellungen dazu.

Wenn ich irgendwas verändern soll bei der Anzeige oder der Spannung usw., dann sagt mir bitte kurz bescheid und ich mach gerne noch weitere Videos.

https://www.dropbox.com/s/l6hptd2gfat3e84/Oszilloskop1.mov?dl=0

---

Was die grundsätzliche Umsetzung mit dem Raspberry Pi angeht, verstehe ich schon, dass die GPIOs durch das darüber liegende Betriebssystem nicht 100% zuverlässig sind. Möglich wäre auch z.B. einen Arduino Due zu verwenden und mit dem Raspberry zu verbinden, dass der Arduino nur die Hardware-Steuerung übernimmt und der Raspberry Pi nur Daten anzeigt und Befehle an den Arduino weitergibt. Wäre doch eine mögliche Lösung oder?

Danke auf jeden Fall für eure große Hilfe!

---

EDIT:

Mir ist gerade aufgefallen, dass ich das Signal vor dem Pulldown-Widerstand genommen hab. Hier nochmal ein Video mit den selben Einstellungen, aber mit Pulldown.

Wenn ich das richtig interpretiere, dann wird das Signal dadurch doch geglättet!?

https://www.dropbox.com/s/pz72y494ymwu2xn/Oszilloskop2.mov?dl=0


----------



## Heinileini (10 Dezember 2020)

somann88 schrieb:


> Mir ist gerade aufgefallen, dass ich das Signal vor dem Pulldown-Widerstand genommen hab. Hier nochmal ein Video mit den selben Einstellungen, aber mit Pulldown.
> 
> Wenn ich das richtig interpretiere, dann wird das Signal dadurch doch geglättet!?


Wenn ich das richtig interpretiere, meinst Du mit "das Signal vor dem Pulldown-Widerstand" vor dem Einbauen des PullUps in die Schaltung.
Das Signal im 2. Video sieht für meinen Geschmack besser aus, weil sich das Signal zügiger dem Zustand 0 nähert. Eine Glättung (TiefPass) würde aber das Gegenteil bewirken.


----------



## somann88 (10 Dezember 2020)

Heinileini schrieb:


> Wenn ich das richtig interpretiere, meinst Du mit "das Signal vor dem Pulldown-Widerstand" vor dem Einbauen des PullUps in die Schaltung.
> Das Signal im 2. Video sieht für meinen Geschmack besser aus, weil sich das Signal zügiger dem Zustand 0 nähert. Eine Glättung (TiefPass) würde aber das Gegenteil bewirken.



Ja genau, ich hab das Kabel vor dem Pulldown-Widerstand rausgezogen und ans Oszilloskop angeschlossen, also war der Pulldown-Widerstand nicht angeschlossen.

Glättung war jetzt eher der falsche Begriff für das was ich meinte. Ich meinte damit, dass das Signal "sauberer" aussieht, also weniger Störungen (Zacken...) bei 0V und 3,3V.

Sorry, ich bin nicht der Vollprofi was das angeht, deshalb kann ich es nur so gut wie möglich beschreiben...

Ps: Ich hab auch mal deine erste Schaltung mit dem Transistor aufgebaut (den Optokoppler hab ich leider nicht nicht) - das Ergebnis sieht so aus:

https://www.dropbox.com/s/iic2mfefipzn4g1/Oszilloskop3.mov?dl=0


----------



## somann88 (10 Dezember 2020)

Heinileini,

Jetzt hab ich mal deine Transistor-Schaltung am GPIO verwendet und in meinem Python-Script von der steigenden zur fallende Flanke umgestellt. Und es sieht sehr gut aus. Absolut keine zusätzlichen Impulse mehr.

Wenn ich die Pumpe langsam weiterdrehe, wird jeder Impuls einmal erfasst und es gibt keine störenden Impulse mehr. Dann hab ich mal versucht 100 ml abzufüllen, also ca. 286 Impulse (12 Impulse = 4,2ml).

Funktioniert leider noch nicht wie gewünscht. Es kommen weniger als 100 ml dabei raus und die Füllmenge ist auch noch abhängig von der Drehzahl. Wenn es mehr wäre, würde ich vermuten, dass der Raspberry Pi zwischendurch mit etwas anderem beschäftigt ist und manche Impulse "nicht mitbekommt", aber da es weniger ist, versteh ich das Ergebnis gerade nicht wirklich...


----------



## Heinileini (10 Dezember 2020)

somann88 schrieb:


> Es kommen weniger als 100 ml dabei raus und die Füllmenge ist auch noch abhängig von der Drehzahl.


Ist die Abhängigkeit der Füllmenge von der Drehzahl reproduzierbar? Gleiche Drehzahl führt wieder zu der gleichen MinderMenge?
Können wir die Pumpe bzw. die Eigenschaften des Schlauchs als Ursache ausschliessen?


----------



## roger34 (10 Dezember 2020)

Um die Flanken besser sehen zu können, solltest du den Trigger nicht auf Auto stellen. Sondern Pos Flanke CH1. und die Zeitbasis auf 10us. Nur so kann man bewerten ob der Übergang von log auf high schnell genug ist, oder die Gefahr von Doppelflanken bestehen. 
Welche Schaltung wird nun verwendet ?


----------



## somann88 (10 Dezember 2020)

Heinileini schrieb:


> Ist die Abhängigkeit der Füllmenge von der Drehzahl reproduzierbar? Gleiche Drehzahl führt wieder zu der gleichen MinderMenge?
> Können wir die Pumpe bzw. die Eigenschaften des Schlauchs als Ursache ausschliessen?



Das teste ich morgen nochmal genau und sag dann Bescheid.



roger34 schrieb:


> Um die Flanken besser sehen zu können, solltest du den Trigger nicht auf Auto stellen. Sondern Pos Flanke CH1. und die Zeitbasis auf 10us. Nur so kann man bewerten ob der Übergang von log auf high schnell genug ist, oder die Gefahr von Doppelflanken bestehen.
> Welche Schaltung wird nun verwendet ?



Hab ich schon gesehen. Stell ich morgen mal so ein und poste dann ein Bild davon. Momentan verwende ich die erste Schaltung. Also mit dem Transistor - die Schaltung ohne Opto-Koppler.


----------



## Heinileini (11 Dezember 2020)

somann88 schrieb:


> Momentan verwende ich die erste Schaltung. Also mit dem Transistor - die Schaltung ohne Opto-Koppler.


Bitte auch mal am Collector des PNP "oszilloskopieren" ... schliesslich interessiert mich, ob der ZusatzAufwand überhaupt wirksam ist.


----------



## somann88 (11 Dezember 2020)

Heinileini schrieb:


> Bitte auch mal am Collector des PNP "oszilloskopieren" ... schliesslich interessiert mich, ob der ZusatzAufwand überhaupt wirksam ist.



Mach ich jetzt als nächstes ;-)

---

Ich hab jetzt mal mehrere Versuche gemacht und jeweils 100ml abgefüllt - also 286 Impulse * 0,35ml = 100,1ml

Die Pumpe würde ich mal als Fehlerursache ausschließen, da ich den D/A-Wandler auch nochmal überprüft hab und er wirklich sehr genau die Spannung von 0-5V in einer sehr feinen Abstufung ausgibt. Die letztendliche Ansteuerung des Motors übernimmt der Treiber, der mitgeliefert wurde.

Der Schlauch könnte natürlich dafür verantwortlich sein, dass pro Impuls keine 0,35ml, sondern mehr oder weniger durchfließen können, aber das wäre ja kein großes Problem, weil ich dann einfach die Durchflussmenge pro Impuls anpassen könnte.

Jedoch ist es ein Problem, dass noch sehr unterschiedliche Füllmengen rauskommen und auch in Abhängigkeit der Drehzahl.

Hier die Auswertung:


----------



## somann88 (11 Dezember 2020)

So, nach "kurzer" Einarbeitung in die Bedienung des super Oszilloskops, kann ich euch jetzt meine Ergebnisse präsentieren - 50µs war das mindeste, was ich hinbekommen hab. Bei 10µs hab ich (das Oszilloskop?) die Flanke nicht mehr erwischt.


Gemessen an der Basis des Transistors:

Steigende Flanke



Fallende Flanke



Gemessen am Collector des Transistors:

Steigende Flanke



Fallende Flanke


----------



## Thomas_v2.1 (11 Dezember 2020)

Mich würde eine Aufzeichnung ohne die ganze Elektronik drumherum im Ursprungszustand mal interessieren, ob da jetzt wirklich etwas "prellt".


----------



## Heinileini (11 Dezember 2020)

Ein Hub von 3 V an der Basis des PNP ist mir nicht plausibel. Ist das am Collector des FotoTransistors gemessen (also am Ausgang der Schaltung, der auf den GPIO geht)?

Immerhin schaltet der PNP. Der Hub ist etwas geringer als erwartet, wahrscheinlich begnügt sich die LED doch nicht mit nur 1,5 V?

Wo sehen wir auf den Bildern überhaupt die 0-V-Linie? Ich habe mir zusammengereimt, dass sie durch den grünen Pfeil am linken Rand markiert wird.

Zu Deiner VersuchsreihenTabelle:

Die Spalte 100 RPM stört ganz gewaltig. Ansonsten ein grober Konsens, dass die tatsächliche Menge ca. halb so gross ist, wie erwartet.
Die Spalte 300 RPM sieht mir am "verlässlichsten" aus. Faktor 1,89 ± 0,03 SchwankungsBreite über die 5 VersuchsReihen.

Könnte mir sehr gut vorstellen, dass die Verformung des Schlauchs unter Druck bzw. noch wesentlicher die Rückkehr zur UrsprungsForm beim Nachlassen des Drucks sehr wohl einen Einfluss auf die Fördermenge pro Umdrehung hat ... und auch die Temperatur des Schlauchs.
Was sagt denn der PumpenHersteller dazu? Oder bist Du selbst der "PumpenHersteller"? Woher kommt die Zahl 0,35 ml? Für welche Drehzahl soll die gelten?


----------



## somann88 (15 Dezember 2020)

Thomas_v2.1 schrieb:


> Mich würde eine Aufzeichnung ohne die ganze Elektronik drumherum im Ursprungszustand mal interessieren, ob da jetzt wirklich etwas "prellt".





Heinileini schrieb:


> Ein Hub von 3 V an der Basis des PNP ist mir nicht plausibel. Ist das am Collector des FotoTransistors gemessen (also am Ausgang der Schaltung, der auf den GPIO geht)?
> 
> Immerhin schaltet der PNP. Der Hub ist etwas geringer als erwartet, wahrscheinlich begnügt sich die LED doch nicht mit nur 1,5 V?
> 
> Wo sehen wir auf den Bildern überhaupt die 0-V-Linie? Ich habe mir zusammengereimt, dass sie durch den grünen Pfeil am linken Rand markiert wird.



Ich kann euch spätestens Ende der Woche (wenns gut läuft morgen...) mal ein paar bessere Aufnahmen mit einem Oszilloskop zeigen...




Heinileini schrieb:


> Könnte mir sehr gut vorstellen, dass die Verformung des Schlauchs unter Druck bzw. noch wesentlicher die Rückkehr zur UrsprungsForm beim Nachlassen des Drucks sehr wohl einen Einfluss auf die Fördermenge pro Umdrehung hat ... und auch die Temperatur des Schlauchs.
> Was sagt denn der PumpenHersteller dazu? Oder bist Du selbst der "PumpenHersteller"?



Also erstmal: Nein, ich bin nicht der Hersteller und hab auch nichts mit denen zu tun. Ich brauch die Pumpe für ein eigenes Projekt.

Was die Verformung des Schlauchs usw. angeht, hast du recht. Das spielt alles tatsächlich eine Rolle, was die Fördermenge angeht, aber das ist ja letztendlich nur eine Parameter-Einstell-Sache und deshalb würde ich das jetzt erstmal außen vor lassen, bis ich die Impulse richtig erfasst bekomme.



Heinileini schrieb:


> Woher kommt die Zahl 0,35 ml? Für welche Drehzahl soll die gelten?



Die Zahl 0,35ml hab ich mir anhand des Datenblatts ausgerechnet.

Im Datenblatt steht ganz oben auf Seite 1 "Flow pro Umdrehung":
Letzte Zeile in der Tabelle -> ID Ø 8.0 mm (x 1.6 or 2.4 mm Wand) -> 4.20 / 3.50 ml pro Umdrehung (3 / 4 Rollen)

Die 8mm Durchmesser entsprechen der Schlauchgröße meiner Pumpe und ich habe 3 Rollen - also 4,20ml pro Umdrehung.

Eine Umdrehung = 12 Impulse => 4,20ml / 12 Impulse = 0,35ml / Impuls

Weiter unten steht, dass der Hersteller von einer Drehzahl von 500 Upm ausgeht (bestes Ergebnis, da bei schnelleren Drehzahlen der Durchfluss nicht mehr 100% stimmen könnte. Der Schlauch hat nicht mehr genug Zeit sich "erweitern" und somit wird weniger gefördert. 500 Upm will ich auch letztendlich verwenden.)

Die Drehzahl spielt aber bei der Fördermenge pro Impuls keine Rolle, weil pro Impuls 0,35ml gefördert werden. Ob ich die Pumpe jetzt mit 1 Upm oder 500 Upm laufen lasse, wirkt sich ja nur auf die Zeit aus, wie schnell die gewünschte Gesamt-Menge gefördert wird.

Hier das Datenblatt: https://www.boxerpumps.com/fileadmin/dateien/peristaltic/25K/Schlauchpumpe_25K.pdf



Heinileini schrieb:


> Zu Deiner VersuchsreihenTabelle:
> 
> Die Spalte 100 RPM stört ganz gewaltig. Ansonsten ein grober Konsens, dass die tatsächliche Menge ca. halb so gross ist, wie erwartet.
> Die Spalte 300 RPM sieht mir am "verlässlichsten" aus. Faktor 1,89 ± 0,03 SchwankungsBreite über die 5 VersuchsReihen.



Ich habe jetzt jedenfalls nochmal lange und viel getestet und habe zwei Dinge festgestellt, die für die ungenaue Erfassung zuständig sind. Nur kann ich mir immer noch nicht erklären, wie das zu Stande kommt und vor allem, wie ich die Fehler rausbekomme...

Punkt 1: Deine Transistorschaltung hilft meiner Meinung nach schon sehr, das Signal eindeutiger zu machen. Mir ist aber aufgefallen, dass wenn ich den Motor von Hand etwas drehe, dann wird bei jedem Schlitz genau ein Impuls erfasst. Egal wie langsam oder schnell ich drüber geh -> sehr gut. Wenn ich allerdings den Motor anmache und ganz langsam laufen lasse (0V Steuerspannung!), dann werden pro Schlitz ca. 3-4 Impulse erkannt.

Punkt 2: Der Motor läuft unruhig und zwar von 0-5V Steuerspannung. Nur, dass es weniger schlimm ist, je weiter die Steuerspannung hoch geht. Aber es ist immer leicht zu hören und dadurch kommen meiner Meinung nach auch die nicht reproduzierbaren Impulswerte bei selber Drehzahl und Dauer.

Um das Ganze zu verdeutlichen, was ich mein, hab ich mal so gut es mir möglich war ein Video vom Motor und gleichzeitig der erfassten Impulse gemacht. Erst in normaler Geschwindigkeit und danach noch in Zeitlupe.

Ich bin gespannt, was ihr davon haltet. Vielleicht wisst ihr ja sogar gleich was das ist. Ich weiß hier jedenfalls langsam nicht mehr weiter und werde auch mal versuchen jemanden vom Support zu bekommen, dem ich das Video zeigen kann.

https://www.dropbox.com/s/ph7dc5rllxw5bjp/MotorUndSensorSignal.mp4?dl=0


----------



## Thomas_v2.1 (15 Dezember 2020)

Ein Schrittmotor besitzt je nach Ansteuerung (Vollschritt, Halbschritt, Mikroschritt) und Last ein mehr oder weniger großes Einschwingverhalten auf die jeweilige Schrittposition. Es könnte sein, dass du durch dieses Einschwingen gelegentlich mehrere Impulse bekommst, wenn der Schlitz vor dem Sensor schwingt. Da dieses Einschwingen bei geringer Drehzahl größer ist, würde das zumindest mit deiner Beobachtung übereinstimmen.

Ich würde mal die print Ausgaben auf der Konsole im Interrupt deaktivieren. Nach meinem Test verfälscht das die Erfassung vor allem von schnellen Signalen.


----------



## somann88 (15 Dezember 2020)

Thomas_v2.1 schrieb:


> Ein Schrittmotor besitzt je nach Ansteuerung (Vollschritt, Halbschritt, Mikroschritt) und Last ein mehr oder weniger großes Einschwingverhalten auf die jeweilige Schrittposition. Es könnte sein, dass du durch dieses Einschwingen gelegentlich mehrere Impulse bekommst, wenn der Schlitz vor dem Sensor schwingt. Da dieses Einschwingen bei geringer Drehzahl größer ist, würde das zumindest mit deiner Beobachtung übereinstimmen.
> 
> Ich würde mal die print Ausgaben auf der Konsole im Interrupt deaktivieren. Nach meinem Test verfälscht das die Erfassung vor allem von schnellen Signalen.



Genau das hab ich auch im Kopf, dass es was mit Schwingung/Vibration zu tun hat.

Mit den Print Ausgaben im Interrupt geb ich dir vollkommen recht. Ein Unding sozusagen  und eigentlich hab ich die Print Ausgabe auch nicht in der Interrupt Funktion, sondern in der für den Interrupt notwendigen While-Schleife. In der Interrupt Funktion setze ich lediglich eine Variable auf true, wenn ein neuer Wert da ist. Und in der While Schleife wird dann Print ausgeführt, sobald die Variable true ist. Danach wird sie wieder auf false gesetzt.

Das Ergebnis ist aber das selbe (jedenfalls bei so wenigen Impulsen), nur, dass der Zähler dann nicht fortlaufend dargestellt wird, sondern jeweils +3 oder +4. Für das Video hab ich mich deshalb für die Variante mit der Print Ausgabe in der Interrupt Funktion entschieden, um keine zusätzliche Verwirrung zu stiften.


----------



## Heinileini (15 Dezember 2020)

Die Schlitzscheibe und die Lichtschranke scheinen laut Video relativ gut zugänglich zu sein.

Ich traue mich kaum, es zu sagen, aber ich würde dazu neigen, die Mimik in einen A/B-Geber umzubasteln.
Die Schlitze (wesentlich) verbreitern (für ein TastVerhältnis von ca. 1:1 statt z.Z. ca. 1:10) und eine zweite LS hinzufügen und dafür einen zweiten GPIO belegen und dann einen Software-Vor-/RückwärtsZähler damit betreiben. 

Mal was ganz was anderes. Was hat es mit ...
"Reed-Sensor für Stall-Control
Ein Mikroreedsensor (rot dargestellt) ist im Pumpenkörper integriert. Ein Permanentmagnet(blau dargestellt) befindet sich am Rotor. Die Kontakte des Mikro-Reed-Sensors schließen,wenn sich der Magnet im oberen Bereich der Rotation befindet."
... auf sich?
Dieser müsste doch pro Umdrehung einen Impuls geben, mal abgesehen davon, dass wir es hier evtl. mit wirklichem Prellen zu tun bekommen.
Ist dieser Kontakt vorhanden? Ist er schon anderweitig verschaltet? Vermutlich schon für den MotorTreiber vergeben? Oder noch frei? Ggfs als "zweite Meinung", um die LichtschrankenSchlitzMimik zu überwachen/korrigieren?

Wahrscheinlich müssen wir wegen der Vibration doch über eine Glättung nachdenken, aber lässt uns die derzeitige (geringe) Breite der Schlitze überhaupt genügend Spielraum dafür?
Evtl. einen Kondensator zwischen B und C des PNP? So ca. 1..10 nF?


----------



## Thomas_v2.1 (15 Dezember 2020)

Man sollte vielleicht mal einsehen, dass der Raspberry das falsche Werkzeug ist.

Ich würde da einen kleinen Mikrocontroller als Vorauswertung davorsetzen, oder damit alles machen lassen. Einen Attiny85 im 8 Pin DIP Gehäuse an 3,3V vom Raspi versorgt. Lichtschranke an einen Pin, und über I2C Daten fertig ausgewertet (z.B. Zählerstand) an den Raspi. Oder die Anzahl der abzudosierenden Impulse über I2C an den Attiny schicken, und der schaltet dann auch die Pumpe bei erreichen aus. Wenn es etwas einfacher sein soll in der Arduino Umgebung.


----------



## Heinileini (15 Dezember 2020)

Im Endeffekt soll die Pumpe doch mit ca. 500/min laufen. Müssen wir uns wirklich um das Vibrieren kümmern, das hoffentlich nur bei "ZeitlupenDrehzahlen" so sehr stört?


----------



## somann88 (16 Dezember 2020)

Heinileini schrieb:


> Die Schlitzscheibe und die Lichtschranke scheinen laut Video relativ gut zugänglich zu sein.
> 
> Ich traue mich kaum, es zu sagen, aber ich würde dazu neigen, die Mimik in einen A/B-Geber umzubasteln.
> Die Schlitze (wesentlich) verbreitern (für ein TastVerhältnis von ca. 1:1 statt z.Z. ca. 1:10) und eine zweite LS hinzufügen und dafür einen zweiten GPIO belegen und dann einen Software-Vor-/RückwärtsZähler damit betreiben.
> ...



Ja, der Sensor und die Scheibe sind gut erreichbar. Den Pumpenaufsatz kann man mit einer Schraube entfernen und dahinter liegt der Sensor. Aber bevor ich jetzt anfange die Scheibe mechanisch zu bearbeiten, um das Ergebnis zu erreichen, was der Hersteller schon mit dem gegebenen Sensor verspricht, wende ich mich lieber erstmal noch an den Support.

Der Reed-Sensor ist einer von drei optionalen Sensoren und ist nicht verbaut. Nur die Lichtschranke hab ich.

Die Idee mit dem Kondensator hatte ich auch schon. Würde ich gerne mal probieren.



Thomas_v2.1 schrieb:


> Man sollte vielleicht mal einsehen, dass der Raspberry das falsche Werkzeug ist.
> 
> Ich würde da einen kleinen Mikrocontroller als Vorauswertung davorsetzen, oder damit alles machen lassen. Einen Attiny85 im 8 Pin DIP Gehäuse an 3,3V vom Raspi versorgt. Lichtschranke an einen Pin, und über I2C Daten fertig ausgewertet (z.B. Zählerstand) an den Raspi. Oder die Anzahl der abzudosierenden Impulse über I2C an den Attiny schicken, und der schaltet dann auch die Pumpe bei erreichen aus. Wenn es etwas einfacher sein soll in der Arduino Umgebung.



Mit einem Attiny85 bin ich vollkommen einverstanden, aber die mehrfachen Impulse, die durch die Vibrationen zustande kommen, werden von dem Attiny85 meiner Meinung nach ja genauso erfasst.

Grundsätzlich würde ich dem Mikrocontroller dann einfach die Anzahl der Impulse via i2c übergeben und sobald die korrekte Anzahl erreicht wurde, setzt der Attiny einen Ausgang auf true.

Das Problem mit dem RaspberryPi ist halt schon, dass ich nicht weiß, ob mein Interrupt von einem Prozess mit einer höheren Priorität unterbrochen wird oder nicht. Und soweit ich weiß, kann ich mit dem RaspberryPi die Priorität nicht einfach über alles andere setzten, wie beim Arduino.



Heinileini schrieb:


> Im Endeffekt soll die Pumpe doch mit ca. 500/min laufen. Müssen wir uns wirklich um das Vibrieren kümmern, das hoffentlich nur bei "ZeitlupenDrehzahlen" so sehr stört?



Im Prinzip stimmt das, aber ich hätte an erster Stelle schon gerne eine solide Lösung, die die Impulse wirklich bei allen Drehzahlen korrekt erfasst. Die 500 Upm sind halt laut Datenblatt erstmal optimal, aber trotzdem würde ich auch höher gehen, wenn es der restliche Prozess zulässt. Ich habe es auch schon mit z.B. 650 Upm versucht und es hat auch noch gut geklappt.

Auf jeden Fall hab ich das bessere Oszilloskop jetzt da und werde euch dann nochmal ein paar Bilder/Videos zeigen, wie sich der Sensor mit und ohne Schmitt-Trigger verhält.


----------



## Wincctia (16 Dezember 2020)

Hallo somann, 

2 fragen dich, was ich hier lese könntest du dir Evtl vorstellen das es sich um ein EMV Problem handelt? Weil du schreibst ja wenn du mit Hand drehst passt es. Welchen Treiber verwendest du? 

andere Frage wäre wie steuerst du den Schrittmotor Treiber genau an? Wäre es nicht denkbar einen Treiber der über Impulse angesteuert wird zu verwenden, ich habe einen 200€ 3 d Drucker dieser Druck teilweise 48h am Stück ohne Referenzieren und dem seine Stepper werden rein über Impulse vor und zurück gesteuert. Also die Lichtschranke rein als Rückmeldung dreht überhaupt. So in der Art. 


Gruß Tia


----------



## Thomas_v2.1 (16 Dezember 2020)

somann88 schrieb:


> Mit einem Attiny85 bin ich vollkommen einverstanden, aber die mehrfachen Impulse, die durch die Vibrationen zustande kommen, werden von dem Attiny85 meiner Meinung nach ja genauso erfasst.
> 
> Grundsätzlich würde ich dem Mikrocontroller dann einfach die Anzahl der Impulse via i2c übergeben und sobald die korrekte Anzahl erreicht wurde, setzt der Attiny einen Ausgang auf true.
> 
> Das Problem mit dem RaspberryPi ist halt schon, dass ich nicht weiß, ob mein Interrupt von einem Prozess mit einer höheren Priorität unterbrochen wird oder nicht. Und soweit ich weiß, kann ich mit dem RaspberryPi die Priorität nicht einfach über alles andere setzten, wie beim Arduino.



Bei einem Mikrocontroller weißt du aber auf den Bruchteil einer Mikrosekunde genau wenn der Impuls eintrifft, und du kannst damit dann diverse Plausibilisierungen programmieren. Z.B. intern eine Drehzahl mitführen und mit den Informationen ein Zeitfenster ermitteln nach der ein neuer Impuls als echtes Signal ausgewertet wird. Das ist mit einer festen elektronischen Schaltung nicht ganz so einfach möglich.


----------



## somann88 (16 Dezember 2020)

Wincctia schrieb:


> Hallo somann,
> 
> 2 fragen dich, was ich hier lese könntest du dir Evtl vorstellen das es sich um ein EMV Problem handelt? Weil du schreibst ja wenn du mit Hand drehst passt es. Welchen Treiber verwendest du?
> 
> ...



Hallo Tia,

kann sein, dass es sich um ein EMV Problem handelt. Wobei mir die Vermutung mit der Resonanz des Motors schon sehr schlüssig vorkommt. Das frage ich aber auf jeden Fall nochmal beim Support des Herstellers. Wahrscheinlich morgen.

Ich verwende einen Treiber, der direkt vom Hersteller montiert wurde und genau für diese Anwendung konzipiert wurde. Der Treiber wird mit einer Steuerspannung von 0-5 V gesteuert.

Der letzte Treiber auf dieser Seite: https://www.boxerpumps.com/en/products/accessories/stepper-drivers/




Thomas_v2.1 schrieb:


> Bei einem Mikrocontroller weißt du aber auf den Bruchteil einer Mikrosekunde genau wenn der Impuls eintrifft, und du kannst damit dann diverse Plausibilisierungen programmieren. Z.B. intern eine Drehzahl mitführen und mit den Informationen ein Zeitfenster ermitteln nach der ein neuer Impuls als echtes Signal ausgewertet wird. Das ist mit einer festen elektronischen Schaltung nicht ganz so einfach möglich.



Versteh ich dich richtig, dass du die Plausibilisierung anhand der Drehzahl so meinst?

500 Upm = 500 Upm / 60s = 8,33 U/s

8,33 U/s / 12 Impulse = 0,69

Also ist ein Impuls alle 0,69 Sekunden bei 500Upm plausibel und alle anderen davor und danach nicht?


----------



## Thomas_v2.1 (16 Dezember 2020)

somann88 schrieb:


> Also ist ein Impuls alle 0,69 Sekunden bei 500Upm plausibel und alle anderen davor und danach nicht?



Wenn die mehreren Impuls vom Einschwingen kommt und nicht von EMV Störungen, dann ist der erste Impuls ja auch ein echter. Der nächste Impuls vom nächsten Schlitz kann bei maximaler Drehzahl dann erst nach einer bestimmten Mindestzeit eintreffen, alles was dazwischen erkannt wird kann verworfen werden. Vielleicht reicht auch die feste Zeit von der Max.-Drehzahl, das könnte aber sein, dass dann bei geringer Drehzahl trotzdem der gleiche Schlitz mehrfach erkannt wird. Ich würde erst mal mit der einfachsten Variante anfangen.

Warum ist auf deinen Oszilloskop-Aufnahmen davon eigentlich nichts zu sehen? Wie viele Samples/s macht das Gerät denn überhaupt?


----------



## Heinileini (16 Dezember 2020)

somann88 schrieb:


> 8,33 U/s / 12 Impulse = 0,69


 8,33 U/s * 12 Impulse/U = 99,96 Impulse/s = 99,96 Hz


----------



## somann88 (17 Dezember 2020)

Thomas_v2.1 schrieb:


> Wenn die mehreren Impuls vom Einschwingen kommt und nicht von EMV Störungen, dann ist der erste Impuls ja auch ein echter. Der nächste Impuls vom nächsten Schlitz kann bei maximaler Drehzahl dann erst nach einer bestimmten Mindestzeit eintreffen, alles was dazwischen erkannt wird kann verworfen werden. Vielleicht reicht auch die feste Zeit von der Max.-Drehzahl, das könnte aber sein, dass dann bei geringer Drehzahl trotzdem der gleiche Schlitz mehrfach erkannt wird. Ich würde erst mal mit der einfachsten Variante anfangen.
> 
> Warum ist auf deinen Oszilloskop-Aufnahmen davon eigentlich nichts zu sehen? Wie viele Samples/s macht das Gerät denn überhaupt?



Was genau meinst du jetzt, was nicht auf den Oszilloskop-Aufnahmen zu sehen ist?

Das China-Oszi hat eine Sample-Rate von 1MS/s.

Jetzt hab ich mir das Einsteigermodell 2204A von PicoScope gegönnt und das hat eine Sample-Rate von 100MS/s.

Ist sogar ein Signalgenerator integriert. Für den Anfang echt ein gutes Gerät. Bin zufrieden damit.



Heinileini schrieb:


> 8,33 U/s * 12 Impulse/U = 99,96 Impulse/s = 99,96 Hz



Ja, das wäre dann die Frequenz ;-) aber mir ging es ja um den Ablauf der Programmierung und dafür benötige ich ja die Intervall-Zeit, wann ein Impuls gezählt werden soll.

Ich verstehe es halt so, dass ich bei:

0,69 Sekunden einen eingehenden Impuls dazuzähle

dann bei

1,38 Sekunden einen eingehenden Impuls dazuzähle

dann bei

2,07 Sekunden einen eingehenden Impuls dazuzähle

usw....


und alle anderen Impulse dazwischen werden ignoriert.

Was mir dazu noch eingefallen ist: Das Ganze würde ja nur zuverlässig funktionieren, wenn die Drehzahl wirklich einigermaßen konstant ist.


-------


Hier mal ein erstes Video mit dem PicoScope und folgendem Aufbau:

FotoDiode mit 47 Ohm Widerstand an 3,3 V
FotoTransistor mit 220 Ohm Widerstand an 3,3 V

Steuerspannung: 1,4 V (ca. 530 Upm)

https://www.dropbox.com/s/hohjjbmg2rcd8pe/PicoScope1.mov?dl=0


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> Ja, das wäre dann die Frequenz ;-) aber mir ging es ja um den Ablauf der Programmierung und dafür benötige ich ja die Intervall-Zeit, wann ein Impuls gezählt werden soll.
> 
> Ich verstehe es halt so, dass ich bei:
> 
> ...


Hmmm, aber die 0,69 s passen doch nicht. Der zeitliche Abstand liegt bei 10 ms entsprechend (ca.) 100 Hz!

Edit:


somann88 schrieb:


> FotoDiode mit 47 Ohm Widerstand an 3,3 V
> FotoTransistor mit 220 Ohm Widerstand an 3,3 V
> 
> Steuerspannung: 1,4 V (ca. 530 Upm)


Laut Video etwas mehr als 10 ms.
Wie kommt denn der "Sägezahn" zustande? Bei nur 220 Ohm als PullUp oder PullDown. Was verschweigst Du uns? 

Wenn ich das Video richtig deute, sehen wir einen PullDown und der FotoTransistor ist derjenige, der sehr zügig "up-pullt". Aber wenn er nicht mehr "up-pullt" geht die Spannung sehr gemütlich in Richtung 0 V.
Ist das bereits mit einen Kondensator geglättet bzw., was die fallende Flanke betrifft, in die Länge gezogen?


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Hmmm, aber die 0,69 s passen doch nicht. Der zeitliche Abstand liegt bei 10 ms entsprechend (ca.) 100 Hz!
> 
> Edit:
> 
> ...



Ja klar stimmt [emoji16] da hab ich mich leicht verrechnet. Die 8,33 U/s müssen natürlich mit den 12 Impulsen/U multipliziert werden.

8,33 U/s * 12 Impulse/U = 99,96 Impulse/s

1000ms / 99,96 Impulse/s = 10ms/Impuls

Richtig?


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> 1000ms / 99,96 Impulse/s = 10ms/Impuls


Irgendwie nah dran, aber ... die PeriodenDauer ist schlicht der Kehrwert der Frequenz.
1/(100 Hz) = 1 s/100 = 0,01 s = 10 ms


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Laut Video etwas mehr als 10 ms.
> Wie kommt denn der "Sägezahn" zustande? Bei nur 220 Ohm als PullUp oder PullDown. Was verschweigst Du uns?
> 
> Wenn ich das Video richtig deute, sehen wir einen PullDown und der FotoTransistor ist derjenige, der sehr zügig "up-pullt". Aber wenn er nicht mehr "up-pullt" geht die Spannung sehr gemütlich in Richtung 0 V.
> Ist das bereits mit einen Kondensator geglättet bzw., was die fallende Flanke betrifft, in die Länge gezogen?



Ja, minimal mehr als 10ms...

Wie die langsame, fallende Flanke zustande kommt, kann ich mir gerade nicht erklären, aber ich hab nichts Anderes an der Schaltung.

+ => FotoDiode => 47 Ohm => -
+ => 220 Ohm => FotoTransistor => Oszilloskop => -


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Irgendwie nah dran, aber ... die PeriodenDauer ist schlicht der Kehrwert der Frequenz.
> 1/(100 Hz) = 1 s/100 = 0,01 s = 10 ms



Ok, jetzt hab ich's verstanden *ACK*


----------



## somann88 (17 Dezember 2020)

Die langsam, fallende Flanke kommt durch den fehlenden PullDown-Widerstand zustande.

Hier mit 10 kOhm PullDown:

https://www.dropbox.com/s/kjwoh5vx1q4t0oe/PicoScope2_10kOhm_PullDown.mov?dl=0


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> + => 220 Ohm => FotoTransistor => Oszilloskop => -


Das ist es doch schon. Kein externer PullUp und kein externer PullDown.
Probier mal ...

PullUp: + => 1 kOhm => c von NPN-FotoTransistor und e von FotoTransistor => -  wobei oszi an c von FotoTransistor.

oder

PullDown: + => c von FotoTansistor  und e von FotoTransistor => 1 kOhm => -  wobei oszi an e von FotoTransistor

Ich vermute, dass die Pull*Up*-Variante trotz der Invertierung des Signals die bessere Wahl ist.


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> Hier mit 10 kOhm PullDown:


Das sieht doch jetzt schon wunderbar aus! Aber Störungen bzw. StörImpulse sind nicht wirklich zu entdecken.
Kannste mal bei "SchneckenTempoDrehzahl" zeigen, wie es aussieht?


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Das ist es doch schon. Kein externer PullUp und kein externer PullDown.
> Probier mal ...
> 
> PullUp: + => 1 kOhm => c von NPN-FotoTransistor und e von FotoTransistor => -  wobei oszi an c von FotoTransistor.
> ...



Achtung: Nicht, dass wir jetzt aneinander vorbei reden. Die Bauteile, die ich genannt habe, sind wirklich alle, die jetzt gerade Teil der Schaltung sind. Also ohne den Schmitt-Trigger.

Thomas wollte ja nochmal das "reine" Signal ohne zusätzliche Elektronik sehen.

Ich steck die Schaltung jetzt aber auch wieder um, sodass der Schmitt-Trigger dabei ist und mach dann nochmal ein Video mit schneller und langsamer Geschwindigkeit.



Heinileini schrieb:


> Das sieht doch jetzt schon wunderbar aus! Aber Störungen bzw. StörImpulse sind nicht wirklich zu entdecken.
> Kannste mal bei "SchneckenTempoDrehzahl" zeigen, wie es aussieht?



Mach ich jetzt auch nochmal ohne Schmitt-Trigger.

Die Videos folgen gleich...


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> Achtung: Nicht, dass wir jetzt aneinander vorbei reden.


Das war schon längst passiert und ich habe eingesehen, dass ich Dich falsch verstanden hatte!
Ich hatte Dich ursprünglich so missverstanden, dass Du den 220 Ohm Widerstand als PullUp oder PullDown geschaltet hattest.


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Das war schon längst passiert und ich habe eingesehen, dass ich Dich falsch verstanden hatte!
> Ich hatte Dich ursprünglich so missverstanden, dass Du den 220 Ohm Widerstand als PullUp oder PullDown geschaltet hattest.



Ok, dann sind wir ja jetzt wieder auf dem gleichen Stand 

------

Langsame Geschwindigkeit - ohne Schmitt-Trigger - 0,1V
https://www.dropbox.com/s/wyvd8xehy33j6xr/PicoScope_0.1V.mov?dl=0

Langsame Geschwindigkeit - mit Schmitt-Trigger - 0,1V
https://www.dropbox.com/s/o4eq7p7bhk8jyjp/PicoScope_SchmittTrigger_0.1V.mov?dl=0

Schnelle Geschwindigkeit - mit Schmitt-Trigger - 1,4V
https://www.dropbox.com/s/o6abo0z557yrhiq/PicoScope_SchmittTrigger_1.4V.mov?dl=0


----------



## Heinileini (17 Dezember 2020)

Am besten gefällt mit das Video "langsam mit ohne Schmitt-Trigger".
Da kann man so schön Stufen bzw. "Nasen" an den steigenden und fallenden Flanken beobachten, die Auswirkung einer Vibration sein könnten.

An dem Video "langsam mit Schmitt-Trigger" gefällt mir nicht, dass ich eigentlich keine Wirkung im Sinne von Schmitt-Trigger entdecken kann.
Die Schaltung scheint recht überflüssg zu sein. Wahrscheinlich ist die Hysterese noch zu klein und der ArbeitsPunkt irgendwo, wo er nicht sehr viel zur Verbesserung beitragen kann.

Kannst Du mit Deinem neuen Scope auch zweikanalig arbeiten? So dass Du den Ausgang zum GPIO und den Collector des PNP darstellen könntest?


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Am besten gefällt mit das Video "langsam mit ohne Schmitt-Trigger".
> Da kann man so schön Stufen bzw. "Nasen" an den steigenden und fallenden Flanken beobachten, die Auswirkung einer Vibration sein könnten.
> 
> An dem Video "langsam mit Schmitt-Trigger" gefällt mir nicht, dass ich eigentlich keine Wirkung im Sinne von Schmitt-Trigger entdecken kann.
> ...



Ja das geht 

Channel 1:
Blau
Linke Skala
GPIO Ausgang

Channel 2:
Rot
Rechte Skala
Collector des PNP Transistors (Schmitt-Trigger)

Langsam - 0,1V
https://www.dropbox.com/s/9jneuorlrp79j9e/PicoScope_0.1V_ZweiKanäle.mov?dl=0

Schnell - 1,4V
https://www.dropbox.com/s/reu3ndznjobr3wu/PicoScope_1.4V_ZweiKanäle.mov?dl=0


----------



## Heinileini (17 Dezember 2020)

:s12:
Könntest Du mal probieren
- entweder: R3 kleiner: 3,3 kΩ -> 2,2 kΩ (oder 2,7 kΩ)
- oder: . . . R4 grösser: 6,8 kΩ -> 10 kΩ (oder 8,2 kΩ)
?
Ich möchte versuchen, die UmschaltPunkte zwischen 0,8 V und 1,3 V zu ziehen, denn das soll der SpannungsBereich des RasPi sein, in dem er nicht weiss, ob er sich für TRUE oder FALSE entscheiden soll.

PS:
Wenn nach der Änderung der PNP nicht mehr schaltet, war's zwecklos.

PPS:
Evtl. noch den R2 verkleinern 330 Ω in 180 Ω (oder 220 Ω).


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> :s12:
> Könntest Du mal probieren
> - entweder: R3 kleiner: 3,3 kΩ -> 2,2 kΩ (oder 2,7 kΩ)
> - oder: . . . R4 grösser: 6,8 kΩ -> 10 kΩ (oder 8,2 kΩ)
> ...



Mach ich...

Eine Anmerkung noch: ich hab den R1 mit 150 Ohm gerade durch einen 47 Ohm Widerstand ersetzt... soll ich den so lassen, oder wieder den 150 Ohm Widerstand einsetzen?


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> Eine Anmerkung noch: ich hab den R1 mit 150 Ohm gerade durch einen 47 Ohm Widerstand ersetzt... soll ich den so lassen, oder wieder den 150 Ohm Widerstand einsetzen?


Den R1 mit 150 Ω finde ich besser so (mit 150 Ω) zu belassen und lieber den R2 verkleinern, wie bereits angegeben. (Stärkere Wirkung der Mitkopplung).
Aber vielleicht machst Du dies lieber zuerst, bevor Du an R3 und R4 änderst. Sorry, aber ich habe im Moment den Eindruck, dass die bisherigen Werte für R3 und R4 gar nicht sooo unpassend sind.

PS:
Wenn Du die Werte von R1 und R2 tauschst, also R1=330 Ω und R2 = 150 Ω, wäre das auch ein Schritt in dieser Richtung (und hoffentlich nicht zu viel).


----------



## somann88 (17 Dezember 2020)

Also jetzt habe ich R1 (150) und R2 (330) getauscht und der R3 ist bei 2,2 kOhm statt 3,3 kOhm

Langsam
https://www.dropbox.com/s/oa9rpojeh0ujydt/Test1_Langsam.mov?dl=0

Schnell
https://www.dropbox.com/s/2j94ilhrkgzj0zj/Test1_Schnell.mov?dl=0

-------

UPDATE:

Hier nochmal zwei Videos mit R3 = 3,3 kOhm wie es war.

Langsam
https://www.dropbox.com/s/r0klbj6axxbxtx3/Test2_Langsam.mov?dl=0

Schnell
https://www.dropbox.com/s/o5zylajyptqro19/Test2_Schnell.mov?dl=0


----------



## Heinileini (17 Dezember 2020)

Die steigende Flanke des GPIO-Signals sieht schon richtig gut aus!
Bitte zum Vergleich doch nochmal das gleiche mit dem ursprünglichen R3 = 3,3 kΩ! Nochmals sorry - ich war wohl etwas zu voreilig mit meiner Unzufriedenheit bezüglich der ursprünglichen Werte von R3 und R4 .


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Die steigende Flanke des GPIO-Signals sieht schon richtig gut aus!
> Bitte zum Vergleich doch nochmal das gleiche mit dem ursprünglichen R3 = 3,3 kΩ! Nochmals sorry - ich war wohl etwas zu voreilig mit meiner Unzufriedenheit bezüglich der ursprünglichen Werte von R3 und R4 .



Schon erledigt [emoji6] hab meine Antwort vorher nochmal bearbeitet.


----------



## Heinileini (17 Dezember 2020)

Wird immer besser, habe ich den Eindruck!
Vielleicht noch ein Bisschen mehr für den R3. Hast Du 3,9 kΩ oder 4,7 kΩ zur Verfügung?
So langsam nerve ich Dich sicherlich  !
Wie sieht es denn mittlerweile mit der Auswirkung auf zu viel gezählte Impulse aus? Ist da denn auch ein (hoffentlich positiver) Unterschied zu bemerken?


----------



## somann88 (17 Dezember 2020)

Ne nervt nicht, bin ja froh um Deine Hilfe!

Also so ne richtig positive Veränderung kann ich leider nicht feststellen. Werden mal mehr mal weniger zusätzliche Impulse erfasst. Stabil würde ich das noch nicht nennen...

Ich hab nochmal mit den Werten von R3 und R4 rumgespielt und da ist mir aufgefallen, dass es besser funktioniert, wenn R3 = 3,3 kOhm und R4 = 4,7 kOhm

Dann bin ich mit R4 noch weiter runter gegangen und bei 2,2 kOhm tut sich gar nichts mehr. Also irgendwas dazwischen... Der Hebel zwischen ganz ok und schlecht ist halt auch sehr klein und unsicher... ein bisschen zu hoch oder zu niedrig und es passt wieder nicht...

Denkst du, dass es besser wäre mit dem Opto-Koppler?


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> Denkst du, dass es besser wäre mit dem Opto-Koppler?


Das dachte ich zeitweise tatsächlich, aber weil wir dann nicht so viele Möglichkeiten haben, dran herum zu probieren. 

Da wir aber schon am Probieren sind ...
Frier jetzt bitte mal die Änderungen an R3 und R4 ein und versuch bitte mal R2 von 150 Ω zu verkleinern auf 68 Ω (notfalls Dein 47 Ω, aber möglichst nicht noch kleiner, sondern lieber 56 Ω).
Dann mach bitte noch mal ein Video und informier mich bitte, welche Werte R3 und R4 haben.


----------



## somann88 (17 Dezember 2020)

Heinileini schrieb:


> Das dachte ich zeitweise tatsächlich, aber weil wir dann nicht so viele Möglichkeiten haben, dran herum zu probieren.



Ok, dann probieren wir mal noch weiter 



Heinileini schrieb:


> Da wir aber schon am Probieren sind ...
> Frier jetzt bitte mal die Änderungen an R3 und R4 ein und versuch bitte mal R2 von 150 Ω zu verkleinern auf 68 Ω (notfalls Dein 47 Ω, aber möglichst nicht noch kleiner, sondern lieber 56 Ω).
> Dann mach bitte noch mal ein Video und informier mich bitte, welche Werte R3 und R4 haben.




Die Werte sind jetzt die folgenden:

R1 = 330 Ohm
R2 = 57 Ohm
R3 = 2,2 kOhm
R4 = 4,7 kOhm

Was halt schon auffällt ist, dass die Vibrationen immer 2-4 Impulse extra ausmachen. Von Hand funktioniert es mit dem Aufbau schon ganz gut...

Langsam
https://www.dropbox.com/s/vnqauv8mf4y2z68/Test3_Langsam.mov?dl=0

Schnell
https://www.dropbox.com/s/m6waxvm7j0fpit9/Test3_Schnell.mov?dl=0


----------



## Heinileini (17 Dezember 2020)

somann88 schrieb:


> Was halt schon auffällt ist, dass die Vibrationen immer 2-4 Impulse extra ausmachen. Von Hand funktioniert es mit dem Aufbau schon ganz gut...


Habe ich nicht ganz verstanden ... sind das jetzt weniger StörImpulse, als vorher? Das, was ich als mögliche Folgen der Vibrationen zu sehen glaubte (diese Stufen und Nasen im GPIO-Signal) sehe ich zumindest nicht mehr.
Mach mal bitte den R3 grösser, also 3,3 kΩ


----------



## somann88 (18 Dezember 2020)

Heinileini schrieb:


> Habe ich nicht ganz verstanden ... sind das jetzt weniger StörImpulse, als vorher? Das, was ich als mögliche Folgen der Vibrationen zu sehen glaubte (diese Stufen und Nasen im GPIO-Signal) sehe ich zumindest nicht mehr.
> Mach mal bitte den R3 grösser, also 3,3 kΩ



Nein, die Störimpulse haben sich nicht merklich verändert.

Der R3 ist jetzt wieder bei 3,3 kOhm.

Was mir noch aufgefallen ist und was ich mir durchaus als Fehlerquelle für das unruhige Verhalten des Motors vorstellen kann ist folgendes:

Die Steuerspannung ist unbelastet ziemlich stabil laut Oszilloskop. Sobald ich aber den Motor einschalte und Strom verbraucht wird, wird die Steuerspannung unruhig. Das könnte doch die Ursache für die unstetige Drehzahl sein und dadurch eventuell auch für die übermäßigen Vibrationen.

Was ich noch in einem Blogeintrag gelesen habe, ist das:

"Da der Ausgang des DAC MCP4725 strommäßig kaum belastbar ist (1 - 3 mA), habe ich dem DAC-Ausgang einen Operationsverstärker LM358 als Spannungsfolger (Impedanzwandler) nachgeschaltet. Dieser hat als Ausgangsspannung dieselbe Spannung wie der DAC, allerdings kann er strommäßig etwas höher, mit ca. 20 - 35 mA, abhängig von der Höhe der DAC-Spannung belastet werden, ohne das die Ausgangsspannung merkbar einbricht."

Quelle: https://arduino-projekte.webnode.at/meine-libraries/dac-mcp4725/

Gibt es auch noch eine andere Möglichkeit, die Steuerspannung zu stabilisieren, als mit einem Operationsverstärker?

---

Hier mal ein Video der Impulse und der Steuerspannung:
https://www.dropbox.com/s/dt5zds3wbxorb9z/Test4_GPIO-AusgangUndSteuerspannung.mov?dl=0


----------



## Heinileini (18 Dezember 2020)

somann88 schrieb:


> Die Steuerspannung ist unbelastet ziemlich stabil laut Oszilloskop. Sobald ich aber den Motor einschalte und Strom verbraucht wird, wird die Steuerspannung unruhig. Das könnte doch die Ursache für die unstetige Drehzahl sein und dadurch eventuell auch für die übermäßigen Vibrationen.
> Gibt es auch noch eine andere Möglichkeit, die Steuerspannung zu stabilisieren, als mit einem Operationsverstärker?


Versuch mal mit einem Kondensator (1 nF?) an Eingang der MotorElektronik gegen Masse alias GND.
Das sollte die Spannung glätten. Stabilisieren ist hier der falsche Begriff.
Wie sieht es denn am Oszi aus, wenn Du nur die Steuerspannung anzeigst, also am Oszi die nicht benötigte Leitung(en) entfernst? Könnte ja sein, dass Du Dir darüber etwas einfängst, was Dein Oszi einfach der SteuerspannungsAnzeige hinzuaddiert (ich gehe mal davon aus, dass Du für die LS-Mimik eigentlich nicht denselben MassePunkt zum Oszillospieren benötigst, wie für die Steuerspannung).
Von wo speist Du die SteuerSpannung? Vom RasPi? 
Wie ist die räumliche Anordnung der MotorElektronik? Vermutlich in der Nähe des Motors? Und der RasPi weit weg? 
Die diversen Leitungen zwischen Netzteil, MotorElektronik, LS-Mimik, RasPi, ... möglichst nicht fein säuberlich alle zusammenbündeln, nur damit's schön aussieht.
Wenigstens zu Anfang auch räumlich trennen und ggfs erst später wieder "vereinigen" und dabei beobachten, ob die Störungen wieder zunehmen.
Abgeschirmte Leitungen?
Wie schaut's mit einem aktuellen Video "langsam mit GPIO-Signal und Spannung am C vom PNP"?


----------



## somann88 (18 Dezember 2020)

Heinileini schrieb:


> Versuch mal mit einem Kondensator (1 nF?) an Eingang der MotorElektronik gegen Masse alias GND.
> Das sollte die Spannung glätten. Stabilisieren ist hier der falsche Begriff.



Ok, dann glätten. Das mein ich auf jeden Fall mit stabilisieren.
Ich hab leider keinen 1nF Kondensator hier. Der kleinste, den ich hab ist ein 0,1µF, also 100nF



Heinileini schrieb:


> Wie sieht es denn am Oszi aus, wenn Du nur die Steuerspannung anzeigst, also am Oszi die nicht benötigte Leitung(en) entfernst? Könnte ja sein, dass Du Dir darüber etwas einfängst, was Dein Oszi einfach der SteuerspannungsAnzeige hinzuaddiert (ich gehe mal davon aus, dass Du für die LS-Mimik eigentlich nicht denselben MassePunkt zum Oszillospieren benötigst, wie für die Steuerspannung).



Das hab ich schon geprüft. Das selbe, wenn ich nur die Steuerspannung anzeigen lasse.



Heinileini schrieb:


> Von wo speist Du die SteuerSpannung? Vom RasPi?



Ja, die Steuerspannung kommt von einem D/A-Wandler, welcher über i2c vom Pi gesteuert wird.



Heinileini schrieb:


> Wie ist die räumliche Anordnung der MotorElektronik? Vermutlich in der Nähe des Motors? Und der RasPi weit weg?
> Die diversen Leitungen zwischen Netzteil, MotorElektronik, LS-Mimik, RasPi, ... möglichst nicht fein säuberlich alle zusammenbündeln, nur damit's schön aussieht.
> Wenigstens zu Anfang auch räumlich trennen und ggfs erst später wieder "vereinigen" und dabei beobachten, ob die Störungen wieder zunehmen.



Der Treiber ist zumindest direkt am Motor befestigt. Das wird vom Hersteller direkt so geliefert. Der Pi liegt etwa einen halben Meter vom Motor entfernt. Die Kabel für die Motorspannung, Steuerspannung, Lichtschranke usw. hab ich natürlich nicht alle gebündelt, sondern liegen jeweils einzeln.



Heinileini schrieb:


> Abgeschirmte Leitungen?



Hab ich noch nicht, sind aber bestellt und werden dann spätestens im Produktionsbetrieb auch eingesetzt.



Heinileini schrieb:


> Wie schaut's mit einem aktuellen Video "langsam mit GPIO-Signal und Spannung am C vom PNP"?



https://www.dropbox.com/s/gzwi11nprieu397/Test5_Langsam.mov?dl=0


----------



## Heinileini (18 Dezember 2020)

Die Dimensionierung der Widerstände würde ich jetzt so "absegnen". An der steigenden wie an der fallenden Flanke des GPIO-Signals wird der SpannungsBereich 0,8 V ... 1,3 V zügig durchlaufen.
Ist zwar recht knapp, aber wenn wir den Bereich jetzt noch hin- und herschieben, wird's an der einen Flanke besser und an der anderen dafür schlechter.

Falls Du doch noch ca. 1 nF Kondensatoren in die Finger kriegst, kannst Du ja mal probieren, ob mit einem zwischen B und C des PNP sich das Verhalten noch etwas verbessern lässt.

Da Du schon das Thema des recht hochohmigen DAC-Ausgangs angeschnitten hast, würde ich den nicht so gerne mit so viel wie 100 nF belasten. Hast Du ein DatenBlatt des DAC und sagt das etwas über kapazitve Belastung aus? 
Die oszilloskopierten SpannungsSpitzen sind ja z.T. gar nicht sooo klein, dass man einfach darüber hinweg gehen möchte. Aber sind sie auch lang genug, um die MotorElektronik zu störenden Vibrationen des Motors zu bewegen? Zuviel Glättung kann auch dazu führen, dass die Spitzen zwar in der Amplitude abgeschwächt werden, aber die zunehmende Länge der Impulse noch ernsthaftere Probleme schafft.


----------



## somann88 (15 Januar 2021)

Hallo Zusammen,

ist schon wieder viel Zeit vergangen seit dem letzten Beitrag...

Ich hab jetzt alle Bauteile zusammen und auch noch ein Labornetzteil, dass ich mal testen konnte, ob das unruhige Verhalten des Motors eventuell durch den DAC kommt - aber nein, es hat nichts damit zu tun. Ich hab auch mal das Labornetzteil als 24V Versorgung für den Motor selbst genommen, aber auch damit das selbe Ergebnis.

Die 1nF Kondensatoren hab ich jetzt auch da und versucht die Spannung zu glätten - keine Besserung.

Auch hab ich versucht einen 1 nF Kondensator, wie du, Heinileini, gesagt hast, zwischen B und C des PNP zu schalten - leider auch keine Verbesserung festzustellen.

Als nächstes hab ich mich dann mal mit dem ATTiny85 vertraut gemacht und hab es geschafft, mit dem Arduino Uno als Programmer eine LED blinken zu lassen - WOW!

Dann hab ich nach einem möglichst fertigen Code für eine Flanken-Erkennung gesucht und gefunden.

Und es funktioniert tatsächlich sehr gut mit der Erkennung und das ganz ohne die Transistor-Schaltung. Ich hab einfach den Fototransistor als Eingang am ATTiny85 verwendet und eine LED soll dann angehen, sobald 10 Impulse erkannt wurden.

Das funktioniert gut, wenn ich von Hand drehe und auch im langsamen Modus bei 0V Steuerspannung. Scheint die Impulse wirklich zuverlässig zu erkennen!

Da der ATTiny85 für mich absolutes Neuland ist, verstehe ich den Code leider nicht 100 Prozentig und auch nicht, wieso die LED beim Starten des Programms an ist und beim Erreichen der 10 Impulse ausgeht, statt an... aber wenigstens werden die Impulse mal richtig erkannt.

Jetzt hab ich noch ein Code im Internet gefunden, der den ATTiny85 mit Hilfe der Bibliothek "TinyWireS" zum i2c slave macht. Damit hab ich auch etwas experimentiert. Im ersten Schritt hab ich einfach nur mal dem ATTiny85 eine i2c Adresse zugewiesen, um ihn mit dem Raspberry Pi über den Befehl "i2cdetect -y 1" zu erkennen. Leider wird nichts erkannt.

*UPDATE!
Gerade eben hab ich was von Leitungslänge bei i2c gelesen und hab es direkt mal mit einer ganz kurzen Verbindung probiert und der ATTiny85 wird erkannt!! Adresse 0x4 genau wie konfiguriert und der DAC wird weiterhin als 0x60 erkannt. 1A. Dann teste ich jetzt mal noch weiter und melde mich wieder...*


@Thomas_v2.1

Du scheinst dich ja gut mit dem ATTiny85 auszukennen. Kannst du mir eventuell etwas auf die Sprünge helfen, wie ich die Verbindung zwischen ATTiny85 und dem Raspberry Pi über i2c realisieren kann, dass ich einen Integer-Wert vom RPi an den ATTiny85 senden kann?

Ich bin an der Stelle noch unsicher, ob ich einfach einen Digitalen Ausgang am ATTiny85 setzen soll, sobald die Anzahl Impulse erreicht wurde, oder ob das vielleicht auch über i2c funktioniert.

Gibt es irgendwelche Unterschiede zwischen den i2c-Bibliotheken, sodass eine Verbindung nicht mit beliebigen Bibliotheken möglich ist? So wie ich es verstehe, ist das i2c Protokoll doch ein Standard und die Bibliotheken sind nur "Wrapper", um die Benutzung zu vereinfachen. Also sollte doch die Verbindung funktionieren, oder?


Vielen Dank auf jeden Fall an Euch beide!


Hier mal noch die beiden Programme, welche ich jeweils auf die ATTiny85 ausgespielt hab:

*Für die Flankenerkennung:*


```
// ATMEL ATTINY 25/45/85 / ARDUINO
// Pin 1 is /RESET
//
//                  +-\/-+
// Ain0 (D 5) PB5  1|    |8  Vcc
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//            GND  4|    |5  PB0 (D 0) pwm0
//                  +----+


/*


  Pin 7  <-- switch to Gnd


  Pin 5 (PB0) <---- LED ---> 330 R <-----> Gnd
  
*/




#include <avr/sleep.h>    // Sleep Modes
#include <avr/power.h>    // Power management


const byte LED = 0;          // pin 5 (D0)
const byte SW = 2;           // pin 7 (D2)
const byte LED_DEBUG = 4;


volatile unsigned long count = 0;
 
ISR (INT0_vect)
{
  GIMSK &= ~bit(INT0);     // disable INT0
}


void setup ()
{
  pinMode (LED, OUTPUT);
  pinMode (LED_DEBUG, OUTPUT);
  pinMode (SW, INPUT);
  digitalWrite (SW, HIGH);  // input pull-up
  ADCSRA = 0;            // turn off ADC
  MCUCR &= ~(bit(ISC01) | bit(ISC00));    // INT0 on low level
}  // end of setup


void loop ()
{


  power_timer0_enable ();
  delay (100);  // let timer reach a known point
  digitalWrite (LED, HIGH);
  delay (20);
  digitalWrite (LED, LOW);
  count++;          // Zähler hochzählen, sobald eine Flanke erkannt wurde
  if (count == 10)  // Wenn Zähler == 10 ...
  {
    digitalWrite (LED_DEBUG, HIGH); // ... dann die LED einschalten (In der Realität geht die LED an diesem Punkt aus und ist von Anfang an eingeschaltet)
  }
  power_timer0_disable ();


  while (digitalRead (SW) == LOW)
    { }  // wait for switch to be released


  noInterrupts ();
  GIFR  = bit (INTF0);   // clear interrupt flag
  GIMSK = bit (INT0);    // enable INT0
    
  power_all_disable ();  // power off ADC, Timer 0 and 1, serial interface
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  sleep_enable ();       // ready to sleep
  interrupts ();
  sleep_cpu ();          // sleep                
  sleep_disable ();      // precaution


}  // end of loop
```

*Für die i2c Kommunikation:

*

```
// ATMEL ATtiny45/85
//
//                  +-\/-+
//          Reset  1|    |8  Vcc
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1 SCL
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//            GND  4|    |5  PB0 (D 0) pwm0 SDA
//                  +----+
// Code für Attiny85
// Sendet über I2c die Deltawerte des Encoders zwischen jeder Abfrage
// V 0.1


// Get this from https://github.com/rambo/TinyWire
#include <util/atomic.h>
#define CriticalSection  ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
#include <TinyWireS.h>                           // Bezieht I2c Bibliothek ein
#include "avr/interrupt.h";                      // Bezieht AVR Interrupt Bibliothek ein
#define I2C_SLAVE_ADDRESS 0x4                    // I2c Slave Adresse


volatile byte counter = 100;                     // Encoder Zähler


void setup() {
  TinyWireS.onRequest(requestEvent);             // Bei I2c Anfrage springt in requestEvent Funktion
  TinyWireS.begin(I2C_SLAVE_ADDRESS);            // Verbindet mit I2c Bus
}


void loop() {


}


void requestEvent() {
  TinyWireS.send(counter);                       // Sendet I2c Nachricht
}
```


----------

