Wie könnte ich einen Schalter (basierend auf einem Halbleiterrelais oder einem Triac) programmieren, der bei Nulldurchgangsleistung auslöst?
Für diejenigen, die mit dem Thema nicht vertraut sind: Schalten Sie die 230-V-Stromversorgung ein, wenn die Sinuswelle der Stromleitung Null überschreitet - das Ergebnis ist die Minimierung der elektromagnetischen Störungen, die sich aus einer schnellen Stromspitze ergeben.
Insbesondere würde ich es vorziehen, so viel wie möglich in Software zu investieren. Die Erfassungsschaltung, die aus einem kleinen Transformator, einer Diode und einigen Widerständen besteht, um Pegel und Ströme in Schach zu halten, liefert "1", wenn die Wechselstromeingangsleistung zur positiven Hälfte, "0" zur negativen Hälfte, an einen GPIO-Eingangspin angeschlossen ist. Der Ausgang besteht aus einigen Halbleiterrelais und dem Nötigsten, um sie am Laufen zu halten (Klimmzüge usw.), die an die GPIO-Ausgangspins angeschlossen sind.
Das Problem ist das Timing: Mit 50 Hz Wechselstrom erhalten wir 100 Nulldurchgänge in einer Sekunde, eine Halbwelle ist 10 ms. Um einen angemessenen Abstand zum Nulldurchgang zu erreichen, um die EMI niedrig zu halten, sollten wir den Ausgang nicht mehr als 10% nach (oder vor) dem Ereignis des Nulldurchgangs aktivieren, dh + -1ms Toleranz. Das bedeutet keine Reaktionszeit von 1 ms - wir können davon ausgehen, dass der nächste Nulldurchgang genau 10 ms nach dem ersten oder dem vierten - 40 ms erfolgt. Es geht um Granularität - wenn wir 20 ms Reaktionszeit zulassen, müssen sie zwischen 19 und 21 ms liegen, nicht zwischen 18 und 22.
Wie kann ich einen solchen Timer - Triggerausgang GPIO entweder innerhalb von 1 ms, da der Eingang eine Flanke erkennt, oder innerhalb eines festen Vielfachen von 10 ms seitdem implementieren - vorzugsweise unter Berücksichtigung einer negativen Vorspannung (z. B. führen der Transformator und das Relais eine Verzögerung von 1,6 ms ein; Ich möchte also, dass der Trigger 8,4+ (n * 10) ms abläuft, da der Eingangsimpuls auf diese Weise die von der Schaltung eingebrachte Verzögerung ausgleicht.) - alles natürlich "auf Benutzerwunsch", sagt der Benutzer "1" msgstr "in eine / sys / class / ... - Datei und bei der nächsten (ungefähren) Gelegenheit geht die Ausgabe auf" on ". Der Benutzer schreibt "0", und wenn der Nulldurchgang eintrifft, wird das jeweilige Relais deaktiviert.
Ich glaube, dies würde das Schreiben oder Hacken eines Kernelmoduls erfordern. Könnten Sie mir zeigen, wie die GPIO-Pins von Raspberry Pi im Kernel gehandhabt werden und welche Art von Timern könnte ich daran anbringen (sofern nicht bereits welche vorhanden sind), um diese Art von Funktionalität zu erhalten?
Antworten:
Sie müssen den Kernel nicht hacken. Sie müssen nur den Prozess aus der Scheduler-Warteschlange verschieben.
Von nun an erhält unser Prozess
cat /proc/sys/kernel/sched_rt_runtime_us
Millisekunden aus jedemcat /proc/sys/kernel/sched_rt_period_us
Millisekunden-Zeitsegment, dh eine ununterbrochene Ausführung, ohne dass das Risiko besteht, dass dies während dieser Zeit verhindert wird (in der Praxis standardmäßig bei BerryBoot: 0,95 Sekunden pro Sekunde) mit diesen Werten, aber ich brauche hier nicht mehr für meinen Zweck.Ich verwende eine Timer-Funktion in Millisekunden (das entspricht der Genauigkeit, die ich benötige),
clock_gettime()
um meine Verzögerungen zu messen.Das Aufrufen
timer(1)
setzt es zurück und das Aufrufentimer(0)
gibt die Zeit seit dem Zurücksetzen zurück.Sie müssen eine Verknüpfung zur
rt
Bibliothek herstellen, damit diese kompiliert werden kann. Fügen Sie-lrt
sie Ihrem gcc-Befehl hinzu.Nun zur Hauptschleife. Ich benutze einen Schaltereingang für "Benutzeranfrage", aber Sie können Netzwerk, Timer oder was auch immer verwenden. Alles was Sie brauchen, ist den booleschen Wert in zu bekommen
in
.quelle
TRIAC_PIN
zu setzenin
, müsste ich dasTRIAC_PIN
auf 1 setzen, eine bestimmte Zeit warten (im Verhältnis zu gewünschte Dimmerstufe) und dannTRIAC_PIN
wieder auf 0 stellen. Würde das funktionieren?if(in==out) continue;
zuif(out==0) continue;
, nicht wahr? Eigentlich bin ich total neu für pi zu programmieren, so vielleicht ist das nicht nötig - Ich vermute , dies alles synchron passiert ist (dh wir haben keine Sorgen zu machen über die Hauptschleife genannt wird , während verschachtelte Schleifen noch ausgeführt werden )