// Pin-Definitionen const int zeroCrossingPin = 2; // Pin für Nulldurchgang const int outputPin = 7; // Pin für Ausgabe // Variablen für die Einstellungen int FLANKENKORREKTUR = 300; // Korrekturwert in Mikrosekunden int pulseWidth = 8000; // Länge des HIGH-Pulses in Mikrosekunden int pulsePosition = 1000; // Position des HIGH-Pulses in Prozent der Halbwelle // Variablen für den Interrupt volatile boolean zeroCrossing = false; volatile unsigned long zeroCrossingTime = 0; void setup() { // Flankenkorrektur pulsePosition = pulsePosition + FLANKENKORREKTUR, // Pin-Modi setzen pinMode(zeroCrossingPin, INPUT_PULLUP); pinMode(outputPin, OUTPUT); // Interrupt für Nulldurchgang konfigurieren attachInterrupt(digitalPinToInterrupt(zeroCrossingPin), zeroCrossingISR, RISING); } void loop() { // Berechnung der Halbwelle in Mikrosekunden unsigned long halfWaveTime = 100UL / (2 * 50); // Ausgabe-Puls generieren unsigned long pulseStart = zeroCrossingTime + (pulsePosition * halfWaveTime); unsigned long pulseEnd = pulseStart + pulseWidth; unsigned long currentTime = micros(); if (currentTime >= pulseStart && currentTime < pulseEnd) { digitalWrite(outputPin, HIGH); } else { digitalWrite(outputPin, LOW); } } void zeroCrossingISR() { // Nulldurchgangs-Interrupt-Handler zeroCrossingTime = micros(); // Zeitpunkt mit Korrektur berechnen zeroCrossing = true; }