// Solarwechselrichter 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 // Widerstand int widerstandspin = 12; bool widerstand; int pvspgpin = A0; int pvspg; // Nulldurchgang // Variablen für die Einstellungen int flankenkorrektur = 300; // Korrekturwert in Mikrosekunden mit Oszilloskop ermitteln int pulslaenge = 8000; // Länge des dcdcan-Puls in Mikrosekunden int pulsposition = 1000; // Position des dcdcan-Pulses ab Nulldurchgang int pulsende; int analogscheitelmonofloppin = A1; int interruptPin = 2; volatile unsigned long startzeit; // Scheitelpunkt bool scheitelmonoflop; bool scheitelmonoflopvorher; bool scheitelpunkt; unsigned long scheitelact; unsigned long scheitelvz = 5000; // UVLO Netz mit Hysterese unsigned long netzist; unsigned long netzstart; int netzwerthoch = 1020; int netzwerttief = 920; int netzwert; bool netz; bool uvlonetz; bool lo; // dc-dc-Converter Start int dcdcanpin = 7; bool dcdcan; unsigned long dcdcanact; // Anzeigepins int boardledpin = 13; bool test; void setup() { TCCR2B = TCCR2B & B11111000 | B00000001; // 31KHz // auf D3 und D11 pinMode(interruptPin,INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), nulldurchgang, RISING); pinMode(boardledpin,OUTPUT); digitalWrite(boardledpin,LOW); // Widerstand abklemmen pinMode(widerstandspin,OUTPUT); digitalWrite(widerstandspin,LOW); pinMode(dcdcanpin,OUTPUT); digitalWrite(dcdcanpin,LOW); // Berechnung der Impulswerte pulsposition = pulsposition + flankenkorrektur; pulsende = pulslaenge + pulsposition; scheitelvz = scheitelvz + flankenkorrektur; } // ISR void nulldurchgang() { startzeit = micros(); } void amscheitelpunktlesen() { // 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() { // 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(); test = HIGH; } else { test = LOW; } lo = uvlonetz; //DC-DC-Converter Start dcdcanact = micros() - startzeit; dcdcan = (dcdcanact >= pulsposition) && (dcdcanact <= pulsende) && !lo; digitalWrite(dcdcanpin, dcdcan); digitalWrite(boardledpin,test); }