Hallo zusammen,
habe nun wieder ein Problem, ich habe mir eine Lötstationsregelung zusammengecoded. Soweit funktioniert der Spaß wie gewünscht, nur ist durch die Verwendung von der delayMicroseconds() Funktion in der ISR Schleife (in nem Interrupt ausgelöst durch den Nulldurchgang einer 50Hz Spannung) der Controller praktisch im niedrigen Regelbereich nur am "pausieren" und das gefällt mir nicht, da dadurch auch die LCD anzeige freezed. (Das LCD läuft über die millis()-Funktion ala BlinkWithoutDelay).
delayMicroseconds(triacONdelay);
digitalWrite(Zuendung, HIGH); //Phase anschneiden;
delayMicroseconds(25);
digitalWrite(Zuendung, LOW); //abschalten der Zündfreigabe;
eben dieses habe ich versucht durch in die micros() Pendant umzuschustern. Nur leider funktioniert das ganze nicht wirklich.
GLOBALE VARIABLEN:
volatile unsigned long triacONdelay; //aka microsInterval1;
unsigned long microsPrevious1 = 0;
unsigned long microsPrevious2 = 0;
unsigned long microsInterval2 = 250; //25µs Zündimpuls;
ISR CODE:
unsigned int microsCurrentMoment1 = micros();
if (microsCurrentMoment1 - microsPrevious1 >= triacONdelay) {
microsPrevious1 = microsCurrentMoment1;
digitalWrite(Zuendung, HIGH); //Phase anschneiden;
}
//Zeit für den Triac zum sicheren Zünden von 10µs ON-TIME garantiert danach;
unsigned long microsCurrentMoment2 = micros();
if (microsCurrentMoment2 - microsPrevious2 >= microsInterval2) {
microsPrevious2 = microsCurrentMoment2;
digitalWrite(Zuendung, LOW); //abschalten der Zündfreigabe, sodass bei nächstem 0-Cross Triac auch sicher aus ist;
}
Auf dem Oszilloskop sieht man, in der Variante mit dem delayMicroseconds() den Impuls der Zündung an Ausgang schon sich in der Periode hin und her bewegen. Je nach Prozentualem Phasenanschnitt => also wie gewünscht.
Bei meinem kläglichen Versuch unten hängt der Zündimpuls einfach am Triggerpunkt fest, indem der Arduino den Nulldurchgang mit dem RISING Signal erkennt fest und bewegt sich nicht gemäßt der Regelstrecke.
ABER das Display freezed nicht mehr. Somit bin ich sicher, das zumindest die Ursache für freezen das delayMicroseconds() ist.
Funktioniert die BlinkWithoutDelay Adaption in ner ISR überhaupt? Oder sprengt mich da irgendwas raus?
Höffe ihr könnt mir da eventuell helfen und mich erleuchten
Dankeschonmal