// Einspeisewechselrichter int lpumppin = 11; int dcdcanpin = 7; int modulationspin = 3; // OVLO mit Auszeit int drainpin = A1; int dcdcauspin = 4; unsigned long drainist; unsigned long drainstart; unsigned long drainvz = 10000; int drainwert = 730; // 1023*95V*3K9:(100K + 3K9):5V bool drain; bool ovlodrain; bool dcdcaus; // UVLO Batterie mit Hysterese int battpin = A0; unsigned long battist; unsigned long battstart; int battwerthoch = 464; // 1023*11V*39K:(150K + 39K):5V int battwerttief = 378; // 1023*9V0*39K:(150K + 39K):5V int battwertovlo = 676; // 1023*16V*39K:(150K + 39K):5V int battwert; bool batt; bool uvlobatt; // UVLO Netz mit Hysterese unsigned long netzist; unsigned long netzstart; int netzwerthoch = 900; int netzwerttief = 800; int netzwert; bool netz; bool uvlonetz; bool lo; // Nulldurchgang int nulldurchgangspin = A5; bool nulldurchgang; bool nulldurchgangvorher; bool nulldurchgangflanke; // Frequenzbegrenzung nach oben unsigned long ista; unsigned long starta; unsigned long ausvza = 8720; bool nulldurchganga; bool nulldurchgangavorher; bool nulldurchgangaflanke; // dc-dc-Converter Start unsigned long istd; // schaltet Sanftanlauf unsigned long startd; unsigned long ausvzd = 15000; // überbrückt die Nulldurchgänge bool nulldurchgangd; bool dcdcan; unsigned long istb; unsigned long startb; unsigned long ausvzb = 1500; // Mitte 4500 ab Nulldurchgang bestimmt Position bool nulldurchgangb; bool nulldurchgangbvorher; unsigned long istc; unsigned long startc; unsigned long ausvzc = 6000; // Einschaltzeit Scheitel bool nulldurchgangc; bool nulldurchgangcvorher; // Testpins int testxpin = 10; int testypin = 11; int testzpin = 12; int ledpin = 13; void setup() { pinMode(dcdcauspin,OUTPUT); pinMode(dcdcanpin,OUTPUT); pinMode(lpumppin,OUTPUT); pinMode(modulationspin,OUTPUT); pinMode(ledpin,OUTPUT); pinMode(testxpin,OUTPUT); pinMode(testypin,OUTPUT); pinMode(testzpin,OUTPUT); digitalWrite(dcdcauspin,HIGH); digitalWrite(dcdcanpin,LOW); digitalWrite(modulationspin,HIGH); delay(2000); analogWrite(lpumppin,125); delay(3000); } void loop() { // OVLO Drainspannung drain = (analogRead(drainpin) > drainwert); if(!drain) { drainist = millis(); if(drainist - drainstart > drainvz) { ovlodrain = LOW; } } else { drainstart = millis(); ovlodrain = HIGH; } // UVLO Batteriespannung (bei Unterspannung HIGH) batt = (analogRead(battpin) > battwert); if(!batt) { uvlobatt = HIGH; battwert = battwerthoch; } else { uvlobatt = LOW; battwert = battwerttief; } // UVLO Netzspannung (bei Unterspannung HIGH) netz = (analogRead(nulldurchgangspin) > netzwert); if(!netz) { netzist = millis(); if(netzist - netzstart > 11) { uvlonetz = HIGH; netzwert = netzwerthoch; } } else { netzstart = millis(); uvlonetz = LOW; netzwert = netzwerttief; } lo = uvlonetz || ovlodrain || uvlobatt; nulldurchgang = (analogRead(nulldurchgangspin) < 40); //digitalWrite(testxpin, nulldurchgang); // Flanke nulldurchgangflanke = ((nulldurchgang != nulldurchgangvorher) && (nulldurchgangvorher == LOW)); nulldurchgangvorher = nulldurchgang; // Frequenzbegrenzung nach oben if(!nulldurchgangflanke) { ista = micros(); if(ista - starta > ausvza) { nulldurchganga = LOW; } } else { starta = micros(); nulldurchganga = HIGH; } // Flankea (Nulldurchgangsflanke mit Frequenzbegrenzung nach oben) nulldurchgangaflanke = ((nulldurchganga != nulldurchgangavorher) && (nulldurchgangavorher == LOW)); nulldurchgangavorher = nulldurchganga; //digitalWrite(ledpin, nulldurchgangaflanke); //DC-DC-Converter Start Monoflops b und c für Sinusscheitel, if(!nulldurchgangflanke) { istb = micros(); if(istb - startb > ausvzb) { nulldurchgangb = LOW; } } else { startb = micros(); nulldurchgangb = HIGH; } if(!nulldurchgangb) { istc = micros(); if(istc - startc > ausvzc) { nulldurchgangc = LOW; } } else { startc = micros(); nulldurchgangc = HIGH; } dcdcan = !nulldurchgangb && nulldurchgangc && !lo; dcdcaus = !dcdcan || lo; digitalWrite(dcdcauspin,dcdcaus); digitalWrite(dcdcanpin, dcdcan); digitalWrite(ledpin, lo); }