// Einspeisewechselrichter // https://www.etechnophiles.com/how-to-change-the-pwm-frequency-of-arduino-nano/ // TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz on D3 & D11 int lpumppin = 11; int dcdcanpin = 7; int modulationspin = 3; // OVLO mit Auszeit int drainpin = 6; int dcdcauspin = 4; unsigned long drainist; unsigned long drainstart; unsigned long drainvz = 10000; 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 = 1020; int netzwerttief = 920; int netzwert; bool netz; bool uvlonetz; bool lo; // Nulldurchgang int analogscheitelmonofloppin = A1; int digitalscheitelmonofloppin = 2; bool nulldurchgang; bool nulldurchgangvorher; bool nulldurchgangflanke; bool nulldurchganglesesperre; // Scheitelpunkt bool scheitelmonoflop; bool scheitelmonoflopvorher; bool scheitelpunkt; // dc-dc-Converter Start bool dcdcan; unsigned long startzeit; // Modulation // Testpins int testxpin = 10; int testypin = 11; int testzpin = 12; int ledpin = 13; bool test; void setup() { //TCCR2B = TCCR2B & B11111000 | B00000001; // 31KHz pinMode(digitalscheitelmonofloppin,INPUT_PULLUP); 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,LOW); ovlodrain = LOW; nulldurchganglesesperre = LOW; // Prüfung der Batteriespannung battwert = battwerthoch; batt = (analogRead(battpin) > battwert); if(!batt) { uvlobatt = HIGH; battwert = battwerthoch; } else { uvlobatt = LOW; battwert = battwerttief; } delay(2000); analogWrite(lpumppin,125); delay(3000); } void amscheitelpunktlesen() { // OVLO Drainspannung drain = digitalRead(drainpin); 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(analogscheitelmonofloppin) > netzwert); if(!netz) { netzist = millis(); if(netzist - netzstart > 11) { uvlonetz = HIGH; netzwert = netzwerthoch; } } else { netzstart = millis(); uvlonetz = LOW; netzwert = netzwerttief; } } void loop() { // Nulldurchgang Flankenerkennung nulldurchgang = digitalRead(digitalscheitelmonofloppin); // Flanke nulldurchgangflanke = ((nulldurchgang != nulldurchgangvorher) && (nulldurchgangvorher == LOW)); nulldurchgangvorher = nulldurchgang; if(nulldurchgangflanke == HIGH) { startzeit = micros(); } // Scheitelpunkt scheitelmonoflop = (micros()-startzeit >= 0) && (micros()-startzeit <= 5000); // Scheitelpunkt bei fallender Flanke des Scheitel-Monoflops scheitelpunkt = ((scheitelmonoflop != scheitelmonoflopvorher) && (scheitelmonoflopvorher == HIGH)); scheitelmonoflopvorher = scheitelmonoflop; if(scheitelpunkt) { amscheitelpunktlesen(); } lo = uvlonetz || ovlodrain || uvlobatt; //DC-DC-Converter Start dcdcan = (micros()-startzeit >= 1000) && (micros()-startzeit <= 9000) && !lo; dcdcaus = !dcdcan || lo; // nulldurchganglesesperre = (micros()-startzeit >= 0) && (micros()-startzeit <= 9000); digitalWrite(dcdcauspin,dcdcaus); digitalWrite(dcdcanpin, dcdcan); digitalWrite(testxpin, scheitelpunkt); // D10 digitalWrite(testypin,nulldurchgangflanke); //D11 digitalWrite(testzpin,scheitelmonoflop); //D12 digitalWrite(ledpin, lo); }