// Einspeisewechselrichter de dd3et // 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 // https://www.arduino.cc/reference/de/language/functions/external-interrupts/attachinterrupt/ // https://www.mikrocontroller.net/topic/542674?page=3#7218665 // OVLO mit Auszeit int drainpin = 6; unsigned long drainist; unsigned long drainstart; unsigned long drainvz = 10000; bool drain; bool ovlodrain; // UVLO Batterie mit Hysterese int elkoladepin = 5; 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 interruptPin = 2; volatile unsigned long startzeit; // Scheitelpunkt bool scheitelmonoflop; bool scheitelmonoflopvorher; bool scheitelpunkt; unsigned long scheitelact; unsigned long scheitelvz = 4800; // dc-dc-Converter Start int dcdcanpin = 7; bool dcdcan; int dcdcauspin = 4; bool dcdcaus; unsigned long dcdcanact; // Modulation (Pin 11) int hundertherz; unsigned long hundertherzact; // Anzeigepins int testxpin = 8; int ledgruenpin = 9; bool ledgruen; int ledrotpin = 10; bool ledrot; bool bereit; int boardledpin = 13; bool test; void setup() { TCCR2B = TCCR2B & B11111000 | B00000001; // 31KHz // auf D3 und D11 //31KHz PWM an Pin11 einschalten und auf HIGH stellen analogWrite(11, 255); pinMode(interruptPin,INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), nulldurchgang, RISING); pinMode(dcdcauspin,OUTPUT); digitalWrite(dcdcauspin,HIGH); pinMode(dcdcanpin,OUTPUT); digitalWrite(dcdcanpin,LOW); pinMode(elkoladepin,OUTPUT); digitalWrite(elkoladepin,HIGH); pinMode(boardledpin,OUTPUT); pinMode(testxpin,OUTPUT); pinMode(ledgruenpin,OUTPUT); digitalWrite(ledgruenpin,HIGH); pinMode(ledrotpin,OUTPUT); digitalWrite(ledrotpin,HIGH); ovlodrain = LOW; delay(2000); // 31KHz Rechteck für ladungspumpe an Pin3 einschalten analogWrite(3, 128); delay(2000); digitalWrite(elkoladepin,LOW); // Prüfung der Batteriespannung battwert = battwerthoch; batt = (analogRead(battpin) > battwert); if(!batt) { uvlobatt = HIGH; battwert = battwerthoch; // komplett ausschalten bei Batterieunterspannung analogWrite(3, 0); digitalWrite(elkoladepin,LOW); } else { uvlobatt = LOW; battwert = battwerttief; } delay(1000); digitalWrite(ledgruenpin,LOW); digitalWrite(ledrotpin,LOW); } 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; // komplett ausschalten bei Batterieunterspannung analogWrite(3, 0); digitalWrite(elkoladepin,LOW); } 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; } } // ISR void nulldurchgang() { startzeit = micros(); } void loop() { // Scheitelpunkt scheitelact = micros()-startzeit; scheitelmonoflop = (scheitelact >= 0) && (scheitelact <= scheitelvz); // 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 dcdcanact = micros() - startzeit; dcdcan = (dcdcanact >= 1000) && (dcdcanact <= 9000) && !lo; dcdcaus = !dcdcan || lo; bereit = (dcdcanact >= 0) && (dcdcanact <= 11000) && !lo; ledgruen = bereit || ovlodrain; ledrot = !bereit; digitalWrite(dcdcauspin,dcdcaus); digitalWrite(dcdcanpin, dcdcan); // Anzeigen digitalWrite(testxpin, scheitelpunkt); // D8 digitalWrite(ledgruenpin,ledgruen); digitalWrite(ledrotpin, ledrot); digitalWrite(boardledpin, lo); // Modulation hundertherzact = micros()-startzeit; if(dcdcan) { hundertherz = 100 + 100 * sin((hundertherzact + 2900) * 0.000628318); // Frequenz*2*Pie*1EXP-6 hundertherz = constrain(hundertherz, 0, 200); // Begrenzung zwischen 0 und 204 3,9V analogWrite(11, hundertherz); } else { analogWrite(11, 200); } }