int potipluspin = 12; // atmega pin 18 Poti Pluspol int potischleiferpin = A5; // atmega pin 28 Poti Schleifer Über RC-TP int enuppin = 2; // atmega pin 4, Katode Optoled int enunpin = 3; // atmega pin 5, Katode Optoled int enzppin = 4; // atmega pin 6, Katode Optoled int upin = 9; // atmega pin 15, Anode Optoled int zpin = 10; // atmega pin 16, Anode Optoled int enznpin = 7; // atmega pin 13, Katode Optoled int relaispin = 8; // atmega pin 14 schaltet Relais ein int zwkpin = 13; // atmega pin 19 wird HIGH wenn die Zwischenkreisspannung größer 750VDC wird. int netzpin = 11; // atmega pin 17 über Widerstand an Sekundärwicklung vom Netztrafo unsigned long netzist; unsigned long netzstart; bool netz; bool netzweg; unsigned long bremsist; unsigned long bremsstart; unsigned long bremsdauer = 500; // 5*RC vom Potischleifer unsigned long zwkstart; unsigned long zwkist; unsigned long zwkvz = 100; bool zwk; unsigned long mvstart; // Multivibrator unsigned long mvist; bool mvv; // Multivibratorzustand am Anfang der Loop bool mv; unsigned long enupstart; unsigned long enupistzeit; unsigned long enunstart; unsigned long enunistzeit; bool enup; // enable Arbeitsphase positive Halbwelle bool enun; // enable Arbeitsphase negative Halbwelle bool enzp; // enable Hilfsphase positive Halbwelle bool enzn; // enable Hilfsphase negative Halbwelle int poti; long per; //Periodendauer in ms int wert = 25; int lies; int wertvor; int uspg; int usinspg; int zspg; int zsinspg; byte zahl = 1; int usin; int zsin; void setup() { TCCR1B = TCCR1B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz pinMode(upin, OUTPUT); // PWM pinMode(zpin, OUTPUT); // PWM analogWrite(upin,0); analogWrite(zpin,0); pinMode(enuppin,OUTPUT); digitalWrite(enuppin,HIGH); pinMode(enunpin,OUTPUT); digitalWrite(enunpin,HIGH); pinMode(enzppin,OUTPUT); digitalWrite(enzppin,HIGH); pinMode(enznpin,OUTPUT); digitalWrite(enznpin,HIGH); pinMode(relaispin,OUTPUT); pinMode(zwkpin,INPUT); pinMode(netzpin,INPUT); delay(3000); // Zeit zum Zwischenkreisladen digitalWrite(relaispin,HIGH); pinMode(potipluspin,OUTPUT); per = 5100 / wert; // Berechnung der Periodendauer uspg = 164 + 10 * wert / 28; // Berechnung der frequenzabhänigen Spannung zspg = (uspg * 10 / 10); // Berechnung der Hilfsspannung für Dekupiersäge delay(500); // Anzugszeit für das Relais digitalWrite(potipluspin,HIGH); netzstart = millis(); // verhindert netzweg-Impuls bei start von void loop() } void drehzahlspannung(){ lies = (analogRead(potischleiferpin)) / 4; wert = lies + 12; if(wert < 25){wert = 25;} // Mindestdrehzahl if(wert >= 255){wert = 255;} // Höchstdrehzahl per = 5100 / wert; // Berechnung der Periodendauer uspg = 164 + 10 * wert / 28; // Berechnung der frequenzabhänigen Spannung zspg = (uspg * 10 / 10); // Berechnung der Hilfsspannung für Dekupiersäge } void liste20(){ mvv = mv; // Zähler Anfang mvist = micros(); // Multivibrator Anfang if(mvist - mvstart >= (50 * per)){mvstart = mvist; if(mv == LOW){mv = HIGH;} else {mv = LOW;}} // Multivibrator Ende if(mv != mvv){zahl ++;} if(zahl >= 21){zahl = 1;} // Zähler Ende if(zahl == 1) {enup = LOW; enun = HIGH; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} if(zahl == 2) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 89; zsin = 45;} if(zahl == 3) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 71; zsin = 71;} if(zahl == 4) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 45; zsin = 89;} if(zahl == 5) {enup = LOW; enun = LOW; enzp = HIGH; enzn = LOW; usin = 0; zsin = 100;} if(zahl == 6) {enup = LOW; enun = LOW; enzp = HIGH; enzn = LOW; usin = 0; zsin = 100;} if(zahl == 7) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 45; zsin = 89;} if(zahl == 8) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 71; zsin = 71;} if(zahl == 9) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 89; zsin = 45;} if(zahl == 10) {enup = HIGH; enun = LOW; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} if(zahl == 11) {enup = HIGH; enun = LOW; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} if(zahl == 12) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 89; zsin = 45;} if(zahl == 13) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 71; zsin = 71;} if(zahl == 14) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 45; zsin = 89;} if(zahl == 15) {enup = LOW; enun = LOW; enzp = LOW; enzn = HIGH; usin = 0; zsin = 100;} if(zahl == 16) {enup = LOW; enun = LOW; enzp = LOW; enzn = HIGH; usin = 0; zsin = 100;} if(zahl == 17) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 45; zsin = 89;} if(zahl == 18) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 71; zsin = 71;} if(zahl == 19) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 89; zsin = 45;} if(zahl == 20) {enup = LOW; enun = HIGH; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} } void liste40(){ mvv = mv; // Zähler Anfang mvist = micros(); // Multivibrator Anfang if(mvist - mvstart >= (25 * per)){mvstart = mvist; if(mv == LOW){mv = HIGH;} else {mv = LOW;}} // Multivibrator Ende if(mv != mvv){zahl ++;} if(zahl >= 41){zahl = 1;} // Zähler Ende if(zahl == 1) {enup = LOW; enun = HIGH; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} if(zahl == 2) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 97; zsin = 23;} if(zahl == 3) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 92; zsin = 38;} if(zahl == 4) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 85; zsin = 52;} if(zahl == 5) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 76; zsin = 65;} if(zahl == 6) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 65; zsin = 76;} if(zahl == 7) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 52; zsin = 85;} if(zahl == 8) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 38; zsin = 92;} if(zahl == 9) {enup = LOW; enun = HIGH; enzp = HIGH; enzn = LOW; usin = 23; zsin = 97;} if(zahl == 10) {enup = LOW; enun = LOW; enzp = HIGH; enzn = LOW; usin = 0; zsin = 100;} if(zahl == 11) {enup = LOW; enun = LOW; enzp = HIGH; enzn = LOW; usin = 0; zsin = 100;} if(zahl == 12) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 23; zsin = 97;} if(zahl == 13) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 38; zsin = 92;} if(zahl == 14) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 52; zsin = 85;} if(zahl == 15) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 65; zsin = 76;} if(zahl == 16) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 76; zsin = 65;} if(zahl == 17) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 85; zsin = 52;} if(zahl == 18) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 92; zsin = 38;} if(zahl == 19) {enup = HIGH; enun = LOW; enzp = HIGH; enzn = LOW; usin = 97; zsin = 23;} if(zahl == 20) {enup = HIGH; enun = LOW; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} if(zahl == 21) {enup = HIGH; enun = LOW; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} if(zahl == 22) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 97; zsin = 23;} if(zahl == 23) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 92; zsin = 38;} if(zahl == 24) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 85; zsin = 52;} if(zahl == 25) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 76; zsin = 65;} if(zahl == 26) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 65; zsin = 76;} if(zahl == 27) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 52; zsin = 85;} if(zahl == 28) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 38; zsin = 92;} if(zahl == 29) {enup = HIGH; enun = LOW; enzp = LOW; enzn = HIGH; usin = 23; zsin = 97;} if(zahl == 30) {enup = LOW; enun = LOW; enzp = LOW; enzn = HIGH; usin = 0; zsin = 100;} if(zahl == 31) {enup = LOW; enun = LOW; enzp = LOW; enzn = HIGH; usin = 0; zsin = 100;} if(zahl == 32) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 23; zsin = 97;} if(zahl == 33) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 38; zsin = 92;} if(zahl == 34) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 52; zsin = 85;} if(zahl == 35) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 65; zsin = 76;} if(zahl == 36) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 76; zsin = 65;} if(zahl == 37) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 85; zsin = 52;} if(zahl == 38) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 92; zsin = 38;} if(zahl == 39) {enup = LOW; enun = HIGH; enzp = LOW; enzn = HIGH; usin = 97; zsin = 23;} if(zahl == 40) {enup = LOW; enun = HIGH; enzp = LOW; enzn = LOW; usin = 100; zsin = 0;} } void loop() { netz = digitalRead(netzpin); // Erkennung ob Netzspannung weg Anfang if(netz == LOW){netzist = millis(); if(netzist - netzstart > 25){netzweg = HIGH;}} // 25ms ist etwas mehr als eine Netzperiode =20ms else{netzstart = millis(); netzweg = LOW;} // Erkennung ob Netzspannung weg Ende if(netzweg == HIGH) // Bremse bei Netzspannung weg Anfang {digitalWrite(potipluspin,LOW); bremsist = millis(); if(bremsist -bremsstart > bremsdauer) {zwk = HIGH; digitalWrite(relaispin,LOW);}} else{bremsstart = millis(); digitalWrite(potipluspin,HIGH);} // Bremse bei Netzspannung weg Ende poti = (analogRead(potischleiferpin)) / 4; if((poti >= lies + 2) || (poti <= lies - 2)) {drehzahlspannung();} if((digitalRead(zwkpin)) == HIGH){zwkist = micros(); // Überspannungsabschaltung Zwischenkreis if(zwkist - zwkstart > zwkvz) {digitalWrite(relaispin,LOW); zwk = HIGH;}} else{zwkstart = micros();} // zwk soll HIGH bleiben Überspannungsabschaltung if(wert >= 121){liste20();} if(wert <= 120){liste40();} if(enup && !zwk && !enun){digitalWrite(enuppin,LOW);} // Freigaben Anfang else{enup = LOW; digitalWrite(enuppin,HIGH);} if(enun && !zwk && !enup){digitalWrite(enunpin,LOW);} else{enun = LOW; digitalWrite(enunpin,HIGH);} if(enzp && !zwk && !enzn){digitalWrite(enzppin,LOW);} else{enzp = LOW; digitalWrite(enzppin,HIGH);} if(enzn && !zwk && !enzp){digitalWrite(enznpin,LOW);} else{enzn = LOW; digitalWrite(enznpin,HIGH);} // Freigaben Ende zsinspg = zspg * zsin / 100; // Multiplikation der PWM-Spg. mit dem Sinuswert usinspg = uspg * usin / 100; // Multiplikation der PWM-Spg. mit dem Sinuswert if(zwk == HIGH) // keine PWM wenn ZWK-Spg. zu hoch {analogWrite(upin,0); analogWrite(zpin,0);} else{analogWrite(upin,usinspg); analogWrite(zpin,zsinspg);} } /* Inverter für Kondensatormotor Dekupiersäge dd3et D5,D6 sind 1KHz Pins. Die Zeitkonstante zwischen Potischleifer und Potischleiferpin bestimmt die Sanftanlauf- und Abbremszeit Hilfswicklung zspg = (uspg * 10 / 38); für GE-Motor in setup() und drehzahlspannung() anpassen, zspg = (uspg * 10 / 10); für Dekupiersäge. 4KHz PWM https://etechnophiles.com/change-frequency-pwm-pins-arduino-uno/ */