Guten Tag alle zusammen,
ich möchte mit meinem Nano, Transformatoren bis 5kVA ansteuern. Mein bisheriger Aufbau funktioniert bei 800VA und Volllast problemlos. 3,5 kVA sowie 5kVA lassen sich im Leerlauf ohne Probleme ansteuern. Die Lastversuche für 3,5- und 5kVA werden wahrscheinlich in den nächsten 2 Wochen erfolgen. Die Last nach Trafo ist rein Ohmisch. Das natürlich Phasenverschiebung eintritt und entsprechende Entstörung benötigt wird ist mir bewusst. Zum Testen bisher aber weg gelassen.
Zur Ansteuerung verwende ich einen BTA 16/800B angetrieben von einem MOC3020.
Schaltspannungen betragen 230/400V. Da der BTA16/800B als Snubberless klassifiziert ist habe ich bisher auch noch keinen in der Schaltung integriert.
Mit dem Oszilloskop konnte ich sehen das der Nulldurchgang welcher nach zwei Schmitt-Trigger als Interrupt im Programm landet jedes mal Genau 200us vorher schon triggert.
Nun zu meinem Konkreten Problem:
Wenn ich über meinen Drehpoti einen Phasenanschnitt von "50%" einstelle,
dann zündet der Triac bereits ab ungefähr 3-4 ms. Wobei dieser ja bei 5ms schalten soll.
Bei 80% habe ich schon Vollast, bei unter 10% ist er aus. Das bedeutet das sich der Anschnittszeitpunkt nicht linear mit dem Programm verhält. Natürlich unter Last gemessen.
Ist die Induktion schuld für das Veränderte schaltverhalten? Oder irgendwas in der Software?
Habe im Code einen 200us delay auskommentiert eingefügt. Ersteres ist ja im Interrupt und macht daher für mich eigentlich direkt schon kein Sinn mehr. Hab in Zukunft sowieso vor den delay durch millis() zu ersetzen. Möchte in Zukunft auch für einen Drehimpulsgeber aufgrund der vermehrten Interruptinputs auf einen Mega setzen.
Ich danke für jede Hilfe und Anregungen
// Die Bibliotheken
#include <TM1637Display.h>
#include <TimerOne.h>
// Eingänge
const int poti = A0;
const int zerointerrupt = 2;
#define CLK A5
#define DIO A4
// Ausgänge
int triac = 10;
int test = 13;
// Variablen
int analogwert = 0;
volatile boolean nulldurchgang_erkannt;
int schnittzeitpunkt = 0; // 0 = An, 100 = Aus
int schrittbreite = 100; // 100us schrittbreite
int anzeigewert;
volatile int counter = 0;
TM1637Display display(CLK, DIO);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Booting...");
nulldurchgang_erkannt = 0; // Nulldurchgang initialisieren
pinMode(zerointerrupt, INPUT);
attachInterrupt(digitalPinToInterrupt(2), nulldurchgang, RISING);
pinMode(triac, OUTPUT);
pinMode(test, OUTPUT);
Timer1.initialize(schrittbreite);
Timer1.attachInterrupt(zeitscan, schrittbreite);
display.setBrightness(0x0f);
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };
display.clear();
}
void nulldurchgang(){
// delayMicroseconds(200);
nulldurchgang_erkannt = true;
counter = 0;
digitalWrite(triac, LOW);
digitalWrite(test, LOW);
}
void zeitscan(){
if(nulldurchgang_erkannt == true){
// delayMicroseconds(200);
if(counter >= schnittzeitpunkt){
digitalWrite(triac, HIGH);
digitalWrite(test, HIGH);
counter = 0;
nulldurchgang_erkannt = false;
// Den Triac nach 10us auszuschalten brachte probleme.
}
else {
counter++;
}
}
}
void loop(){
analogwert = analogRead(poti);
schnittzeitpunkt = map(analogwert, 0, 1023, 0, 100);
anzeigewert = map(schnittzeitpunkt, 0, 100, 100, 0);
display.showNumberDec(anzeigewert, false);
Serial.println(schnittzeitpunkt);