3kW Heizung, Leistung regulieren und messen

Es lag am Elko der war wohl schon etwas älter.

Wie filter ich das signal per Software? So wie im Smoothing example?

Schaltung hänge ich unten dran.
Ich mach mir jetzt noch ne Leiterplatte mit dieser Schaltung und dem Spannungsregler mit 3 weiteren Kanälen die ich wie ein relais verwenden werde.

strohhirn:
Es lag am Elko der war wohl schon etwas älter.

Schön, dass du den Fehler finden konntest!

Wie filter ich das signal per Software? So wie im Smoothing example?

Mit der Schaltung brauchst du eigentlich keinen SW-Filter mehr.

Falls doch, dann nehme ich lieber den gleitenden Durchschnitt. Das spart, gerade bei größeren Filterkonstanten, viel Speicher.
das Prinzip ist einfach: du definierst dir einen Filterfaktor: const int FF = 99;
du tastest alle x ms das analoge Signal ab: Neuwert = analogread(A0);
dann nimmst du 1/100stel von Neuwert und addiert 99/100stel vom letzten Sensorwert:
Sensorwert = (Neuwert + FF * Sensorwert)/(FF+1):

Die Grenzfrequenz des Filters liegt bei FF * Abtastrate. Wenn du also alle 10ms einen Wert mißt hast du mit FF=99 eine Grenzfrequenz von ca. einer Sekunde.
Ich würde als Abtastrate aber nicht 10ms nehmen, sondern z.B. 13ms. Auf alle Fälle eine Frequnz die kein Vielfaches der Neztfrequenz 50Hz ist.

Und nochwas: Sensowert MUSS von Typ float sein, ebenso wie die Rechnung in float ausgeführt werden muß.

Mit der Schaltung brauchst du eigentlich keinen SW-Filter mehr.

Naja, das signal schwank wie gesagt immernoch +- 1-2Digits und pro Digt sind das ja ca 0,3V am.

Den Filter habe ich mal ausprobiert und er klappt ganz gut:

int Pin = A7;

const int FF = 99;
int Neuwert;
float Sensorwert;


long previousMillis = 0;
long interval = 13; 
void setup(){
Serial.begin(57600);
pinMode(Pin, INPUT);
}

void loop(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) { // alle 13ms Neuwert
    previousMillis = currentMillis;   
    Neuwert = analogRead(Pin);
  }
 
  Sensorwert = (Neuwert + FF * Sensorwert)/(FF+1);
  Serial.println(Sensorwert);
}

Aber warum muss ich alle 13 sek was messen? Ohne das hat es auch geklappt.

Desweiteren versuche ich gerade eine konstante zu finden mit der ich die lineare Interpolation vllt ablösen kann.
Diese zahl ist ca. 0,307V pro digit.
Im von 223V +-1V war diese zahl 0,3075. Damit wurde das Signal haargenau umgerechnet wie bei meinem Messgerät. Jedoch entfernte sich die Genauigkeit mit größerem Abstand von 223V.
Die Konstante ändert sich nur minimal an der 4. stelle nach dem komma.
(Zumindest waren das die bisherigen erkenntnisse im bereich 222V-224V)

Hast du nen Rat wie ich die Formel(bis jetzt nur multiplikation mit konstante) überarbeiten müsste? Oder sollte ich bei der linearen Interpolation bleiben?

ADCs schwanken immer etwas. Alleine durch die Quantisierung hast du Prinzip-bedingt einen Fehler von 0,5 LSB wenn das Analog-Signal genau in der Mitte der Quantisierungsstufe liegt. Dazu kommen dann noch so Dinge wie Signalrauschen, Versorgungsrauschen und Linearitätsfehler.

Mitteln kann man natürlich, aber auf den Gesamtwert bezogen wird das nur durch einen ADC mit höherer Auflösung wirklich besser.

strohhirn:

Mit der Schaltung brauchst du eigentlich keinen SW-Filter mehr.

Naja, das signal schwank wie gesagt immernoch +- 1-2Digits und pro Digt sind das ja ca 0,3V am.

Da hat Serenifly recht: ein paar Bits Schwankung wirst du immer haben.

strohhirn:
Den Filter habe ich mal ausprobiert und er klappt ganz gut.

Aber warum muss ich alle 13 sek was messen? Ohne das hat es auch geklappt.

Wenn du einen definierten Filter haben willst, mit bekannter Grenzfrequenz, dann brauchst du eine definierte Abtastrate. Das müssen nicht 13ms sein. Aber wenn du den Filter einfach in der Loop laufen lässt, dann weißt du nicht, wie oft er aufgerufen wird und kennst daher auch nicht das Verhalten deines Filters.

strohhirn:
Desweiteren versuche ich gerade eine konstante zu finden mit der ich die lineare Interpolation vllt ablösen kann.
Diese zahl ist ca. 0,307V pro digit.
Im von 223V +-1V war diese zahl 0,3075. Damit wurde das Signal haargenau umgerechnet wie bei meinem Messgerät. Jedoch entfernte sich die Genauigkeit mit größerem Abstand von 223V.
Die Konstante ändert sich nur minimal an der 4. stelle nach dem komma.
(Zumindest waren das die bisherigen erkenntnisse im bereich 222V-224V)

Hast du nen Rat wie ich die Formel(bis jetzt nur multiplikation mit konstante) überarbeiten müsste? Oder sollte ich bei der linearen Interpolation bleiben?

Wenn sich etwas in der 4. Stelle nach dem komma ändert, dann wird das in der Praxis keine Auswirkungen haben.
Wir sind wieder mal bei der Frage die wir schon einige Male diskutiert hatten:
Wie genau sieht die Übertragungskennlinie deiner Messschaltung aus?
Du hast ja bisher nur einen sehr kleinen Bereich vermessen (223.,1V - 224,7V) und der war nicht sehr linear.
du müsstest mal einen größeren Spannungsbereich vermessen.

Zwischenablage01.jpg

Da hat Serenifly recht: ein paar Bits Schwankung wirst du immer haben.

Ok. Der Mittelwert genügt mir ja auch vollkommen. Jetzt kann man den Wert viel besser lesen

Wenn sich etwas in der 4. Stelle nach dem komma ändert, dann wird das in der Praxis keine Auswirkungen haben.

Ok. Ich habe jetzt einfach ein paar mehr Messungen gemacht(mit dem Filter), die Konstanten errechnet und einfach den Durchschnitt davon genommen.(Mehr als 227V habe ich zu Hause nur sehr selten) Weitere Messungen werde ich noch am Betriebsort machen.

Nun habe ich nochmal den gesamten sketch getestet. Und es hat bisher richtig gut und sehr präzise funktioniert.(nur kleine Netzschwankungen)
Nun muss ich noch versuchen ob es bei Netzschwankungen den Wert konstant hält.
Und später die Einstellung von Volt in Watt umändern.(Das sollte aber mit ner simplen Formel getan sein.)

Was mir aufgefallen ist das die Lampe immer mal kurz aus und an geht. Woran könnte das liegen und wie könnte ich es beheben?

Bis jetzt bin aber schonmal echt froh das es so gut geklappt hat und ich möchte allen danken die mir geholfen haben und besonders guntherb.

Die neue Leiterplatte ist fertig. Und ich probiere sie gerade aus.
Der Spannungsregler funktioniert.

Beim Netzmesser habe ich einen anderen Gleichrichter verwendet, der wohl einen größeren Wiederstand hat.
Nun Habe ich 227V im Netz 2,9V am arduino, zuvor hatte ich ca 3,6V.
Wird das dadurch nicht ungenauer da mehr Volt pro digit sind? sollte ich vllt einen der Widerstände kleiner machen? Und wenn ja welchen?

Was mir aufgefallen ist das die Lampe immer mal kurz aus und an geht. Woran könnte das liegen und wie könnte ich es beheben?

Das frage ich mich immer noch.

strohhirn:
Beim Netzmesser habe ich einen anderen Gleichrichter verwendet, der wohl einen größeren Wiederstand hat.
Nun Habe ich 227V im Netz 2,9V am arduino, zuvor hatte ich ca 3,6V.
Wird das dadurch nicht ungenauer da mehr Volt pro digit sind? sollte ich vllt einen der Widerstände kleiner machen? Und wenn ja welchen?

R1 kleiner oder R2 größer.

Was mir aufgefallen ist das die Lampe immer mal kurz aus und an geht. Woran könnte das liegen und wie könnte ich es beheben?

Dazu mußt du erstmal herausfinden, was die Ursache ist.
Also die relevanten Größen seriell ausgeben (Achtung: nur wenige Werte ausgeben, durch die Serielle Ausgabe nicht die Echtzeit verletzen!), und sehen, wie sie sich beim Aussetzen der Lampe verhalten.
ich würde zuerst mal damit anfangen, U_Netz auszugeben und den Wert, den du OCR1A zuweisst.

Was noch sein kann: du rufst deine Funktionen in der Loop() ohne synchronisation zur Netzfrequenz auf. Vielleicht gibt es hier ja manchmal Konflikte? Ausserdem vermischt du int und float.

Du könntest mal sowas probieren:

void Sollwert(byte Prozent){ //Leistung in Prozent
 float U_Netz = U_NetzLesen();
  
// das MUSS float sein!
  float Faktor_U =  U_ref / U_Netz;   // das ist der Korrekturfaktor, den du aus der abweichenden Spannung hast.
  float Faktor_G = Faktor_U * Prozent;  // das ist dein Gesamtfaktor, um den du mittels Phasenanschnitt deine Spannung 

const int Tabpunkte = 50;
const float WerteTab[Tabpunkte][2]={     // 1.Spalte V in Prozent 1= 220V , 2.Spalte Zeit in Microsekunden		
	 {... gekürzt};

int i = 0;    
  while (i < Tabpunkte && Faktor_G > WerteTab[i][0]){i++;}  // passenden Eintrag in der Tabelle suchen
  // richtigen Wert interpolileren
  int OCR1A_Wert = int((((WerteTab[i][1] - WerteTab[i-1][1]) * ( Faktor_G - WerteTab[i-1][0] ))/ (WerteTab[i][0] - WerteTab[i-1][0] )) + WerteTab[i-1][1]);
  noInterrupts(); //Interrupts abschalten, damit bei der Zuweisung zum Register nicht unterbrochen werden kann.
  OCR1A = OCR1A_Wert
  interrupts();
}
[codenoInterrupts(); //Interrupts abschalten, damit bei der Zuweisung zum Register nicht unterbrochen werden kann.
  OCR1A = OCR1A_Wert
  interrupts();]

Dies hat soweit ertmal geklappt, die Lampe flackert nicht mehr.

Ich habe jetzt einige Tage versucht, wie beim Spannungsmesser zuvor, das ganze präzise zu kriegen.

Beim Phasenanschnittregler habe ich die Verzögerung mit dem Oszilloskop ermittelt.(380µs). Was mich immernoch wundert wieso der Triac zu früh zündet.
Aber ich habe diese Verzögerung in der Exeltabelle miteinberechnet.

Den Spannungsmesser bekomme ich nicht so präzise hin wie zuvor. Ich habe den zuvor verwendeten Trafo wieder eingesetzt und R3 etwas größer gemacht. Nun habe ich bei 224V im Netz 3,62V am Ausgang.
Ich habe bei verschiedenen Netzwerten die Zahl am analogen Ausgang notiert. Denn bei jedem paar Netzwert/Analog gerechnet und aus diesen Werten den durchschnitt gebildet. Anschließend multipliziere ich diesen Wert im Programm mit dem Analogwert um die Netzspannung zu ermitteln.
Teilweise funktioniert es präzise(in bezug auf mein Messgerät) teilweise weicht der Wert aber auch um 0,5V ab.
Mir ist aufgefallen das der analoge Wert bei gleicher Netztpannung manchmal 1digit weniger ist. Deswegen weicht es denke ich mal ab.
War vorher aber glaube ich nicht so. (Den Filter verwende ich)

Im gesamten Porgramm stelle ich nun die gewünschte Voltzahl ein. Wenn ich 100V einstelle habe ich aber eine Abweichung teilweise von +4V. Beim ganzen zuvor hatte ich eine Abweichung von vllt 0.5V.

Nun weiß ich nicht wie ich das ganze weiter präziser machen soll. Wie zuvor halt. Den Phasenanschnittregler kann man schonmal ausschließen der ist Präzise. Es kann nur an der Umrechnungen oder am Spannungsmesser liegen.
Was kann ich machen?

Hier nochmal der jetztige sketch:

#include <avr/io.h>
#include <avr/interrupt.h>

#define GATE 9    //Triac Pin
#define PULSE 20   //trigger pulse width (counts) 10µs
#define DETECT 2  //zero cross detect

int U_NetzPin = A7; // Netzspannungsmesser

int U_ref = 220; // bei 220V 3000W Leistung

long previousMillis = 0;
long interval = 13; 
int Neuwert;
  const int FF = 99;
  float U_NetzAD;

void setup() {   
  pinMode(DETECT, INPUT);     //zero cross detect
  digitalWrite(DETECT, HIGH); //enable pull-up resistor
  pinMode(GATE, OUTPUT);      //triac gate control
  pinMode(U_NetzPin, INPUT);
  // set up Timer1 
  OCR1A = 0;      //initialize the comparator
  TIMSK1 |= (1 << OCIE1A); // Comperator A Interrupt aktivieren
  TIMSK1 |= (1 << TOIE1); //Overflow Interrupt aktivieren
  TCCR1A = 0x00;    //timer control registers set for
  TCCR1B = 0x00;    //normal operation, timer disabled


  // bei zerocross Interrupt
  attachInterrupt(0,zeroCrossingInterrupt, RISING);    
    //IRQ0 is pin 2. Call zeroCrossingInterrupt 
    //on rising signal

  Serial.begin(57600);   
}

void loop() {  
  Sollwert(100.00); // 100V

} //end loop


//d) eine Funktion, die den Phasenanschnitt ausführt.
//the interrupt function must take no parameters and return nothing
void zeroCrossingInterrupt(){ //zero cross detect   
  TCCR1B=0x02; //start timer prescaler 8
  TCNT1 = 0;   //reset timer - count from zero
}

ISR(TIMER1_COMPA_vect){ //comparator match
  digitalWrite(GATE,HIGH);  //Triac an machen
  TCNT1 = 65536-PULSE;      //trigger pulse width
}

ISR(TIMER1_OVF_vect){ //timer1 overflow
  digitalWrite(GATE,LOW); //Triac ausmachen
  TCCR1B = 0x00;          //disable timer stopd unintended triggers
}


//c) eine Funktion, die dir aus Sollwert und Netzspannung die Phasenanschnittszeit errechnet
void Sollwert(float Volt){ //Voltzahl
 float U_Netz = U_NetzLesen();
 float Faktor_U =  U_ref / U_Netz;   // das ist der Korrekturfaktor, den du aus der abweichenden Spannung hast.
 float Faktor_G = Faktor_U * (Volt/U_Netz*100.00);  // das ist dein Gesamtfaktor, um den du mittels Phasenanschnitt deine Spannung 

//Serial.print("U_Netz: ");Serial.print(U_Netz);
//Serial.print(" Faktor_U: ");Serial.print(Faktor_U);
//Serial.print(" Prozent: ");Serial.print(Prozent);
//Serial.print(" Faktor_G: ");Serial.print(Faktor_G);Serial.println();

const int Tabpunkte = 50;
const float WerteTab[Tabpunkte][2]={     // 1.Spalte V in Prozent 1= 220V , 2.Spalte Zeit in Microsekunden		
		
{ 0.725233373128343,20360},
{ 2.04884152815099,19960},
{ 3.75653798961305,19560},
{ 5.76760037973328,19160},
{ 8.03185633657378,18760},
{ 10.5123471747264,18360},
{ 13.1791534987902,17960},
{ 16.0065727330459,17560},
{ 18.9716372400389,17160},
{ 22.0532660329187,16760},
{ 25.2317515266739,16360},
{ 28.4884385028046,15960},
{ 31.8055204064967,15560},
{ 35.1659108385353,15160},
{ 38.5531651452729,14760},
{ 41.951436442244, 14360},
{ 45.3454558986707,13960},
{ 48.7205304460519,13560},
{ 52.0625531752139,13160},
{ 55.3580230518699,12760},
{ 58.5940714931153,12360},
{ 61.7584939718206,11960},
{ 64.8397852526323,11560},
{ 67.8271771743856,11160},
{ 70.7106781186548,10760},
{ 73.4811134683906,10360},
{ 76.1301664807882,9960},
{ 78.6504190855496,9560},
{ 81.0353921805756,9160},
{ 83.2795850361218,8760},
{ 85.3785134379723,8360},
{ 87.3287462010954,7960},
{ 89.1279396673216,7560},
{ 90.7748697626847,7160},
{ 92.2694611303291,6760},
{ 93.6128127709887,6360},
{ 94.8072195123975,5960},
{ 95.8561884891733,5560},
{ 96.7644496439482,5160},
{ 97.5379590584164,4760},
{ 98.1838936915438,4360},
{ 98.7106358471148,3960},
{ 99.1277454250591,3560},
{ 99.445917748684,33160},
{ 99.6769245301471,2760},
{ 99.8335353769449,2360},
{ 99.9294172020061,1960},
{ 99.9790090388604,1560},
{ 99.9973701481919,1160},
{ 100.00,	760}};



int i = 0;    
  while (i < Tabpunkte && Faktor_G > WerteTab[i][0]){i++;}  // passenden Eintrag in der Tabelle suchen
  // richtigen Wert interpolileren
  int OCR1A_Wert = int (((WerteTab[i][1] - WerteTab[i-1][1]) * ( Faktor_G - WerteTab[i-1][0] ))/ (WerteTab[i][0] - WerteTab[i-1][0] )) + WerteTab[i-1][1];
noInterrupts(); //Interrupts abschalten, damit bei der Zuweisung zum Register nicht unterbrochen werden kann.
  OCR1A = OCR1A_Wert;
  interrupts();
}


//b) eine Funktion um die Netzspannung aus dem AD-Eingang zu ermitteln.
/*************************************************************************************************
** Liest den AD-WErt an Pin "U_NetzPin"								**
** und interpoliert aus der Tabelle den korrekten pysikalischen Wert.				**
**  											   	**
**  Input: nix											**
**  Output: Netzspannung in Volt								**
**  genutzte Globale Variablen: SensorPin							**
**************************************************************************************************/
float U_NetzLesen() {
  /* Wertetabelle SpannungsWerte */  
 
  
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) { // alle 13ms Neuwert
    previousMillis = currentMillis;   
    Neuwert = analogRead(U_NetzPin); 
  }                                  
   U_NetzAD = (Neuwert + FF * U_NetzAD)/(FF+1);        
  Serial.println(U_NetzAD*0.291902974);    
  //***************** Interpolation des Wertes aus der Tabelle *****************************************
  
  // richtigen Wert interpolileren
  float Wert = U_NetzAD*0.291902974;

  return Wert;
} // End of U_NetzLesen

Du hast ja in etwa eine Auflösung von 0,3V pro Digit (bezogen auf die 220V)
Du hast am AD-Wandler immer 1 Digit, meist 2 Digits Rauschen. Das ist Systembedingt und kriegst du nicht weg.
Dazu kommt, dass du ja relativ zu deiner VREF mißt, als der Versorgung des Arduino.
Und die VREF geht mit Faktor 62 in deine Messung ein.
Wenn also die VREF nur um 50mV schwankt, dann schlägt sich das in deinem Messergebnis schon mit 3V Fehler nieder.

Du zielst hier auf einen Genauigkeitsbereich von 1% und kleiner.
Um das zu erreichen, mußt du richtig Aufwand betreiben.
Z.B. einen Präzisions-AD Wandler mit mindestens 12bit. Eine hochgenaue Referenz für den AD.
Dann solltest du vor allem auf eine direkte Messung gehen. Also nicht über einen Trafo, sonder direkt die zu messende Spannung auf den AD geben (über entsprechende Spannungsteiler) aber dann hast du die 230V in der Schaltung. Gefährlich!

Generell fürchte ich, mit der Schaltung, die du jetzt hast, bist du am Ende der Möglichkeiten angekommen.
Da sind zu viele Fehlerquellen und Nichtlinearitäten drin.

Gut möglich das ich mit dieser Schaltung nicht die volle präzision rauskriege. Ich möchte das ganze ja nur möglichst genau meinem Multimeter angleichen.
Ich hatte zuvor das ganze ja auf einer Lochrasterplatine getestet gehabt. Und da hat es richtig präzise funktioniert. Und da funktionierte auch das Spannungsmesser sehr gut, nur max +-0.2V Abweichungen vom Multimeter.
Heute habe ich das ganze nochmal auf der neuen platine ausprobiert: Ich hatte +5V Abweichung vom Messgerät, nach 30min waren es +2V, nach 50min waren es nur noch +0.3-0,5V, einen Tag zuvor waren es +0.5V. (zwischendurch war das ganze aus)
Das sind extreme Schwankungen die vorher nicht da waren.
Ich habe bei der neuen Platine nur R2 erhöht und einen anderen Gleichrichter verwendet:
statt zuvor: file: datasheet WL005F
nun den: Diotec Elektronische 233120, DS datasheet pdf

Kann das an einer dieser Veränderungen liegen?
Da freut man sich mal das es geklappt hat, will alles sauber und fest machen und schon funktionierts nicht mehr. :frowning:

strohhirn:
Ich hatte +5V Abweichung vom Messgerät, nach 30min waren es +2V, nach 50min waren es nur noch +0.3-0,5V, einen Tag zuvor waren es +0.5V. (zwischendurch war das ganze aus)

Das klingt für mich einfach Temperatureffekten. Das sind Abweichungen kleiner 2%, das wäre erklärbar.
Bist du sicher, dass die Betriebsbedinungen identisch sind? Also Spannungsversorgung, Lastströme am Arduino etc.

Der Wechsel des Gleichrichters kann das nicht verursachen. Silizium-Dioden verhalten sich da sehr ähnlich.
Eine exakte Beschreibung deines Aufbaus würde auch helfen. Also Schaltpläne, Layout, Hochauflösende Fotos etc.
Aber die willst du ja anscheinend nicht veröffentlichen.

Bist du sicher, dass die Betriebsbedinungen identisch sind? Also Spannungsversorgung, Lastströme am Arduino etc.

ne, ich habe da ganze vorher nicht gemessen. kann das denn nach ner Woche einfach für ne bestimmte Zeit ändern?

Aber die willst du ja anscheinend nicht veröffentlichen.

Na sag doch was, wenns hilft. :slight_smile:

Schaltplan ist wie bei reaple #120, nur das R2 halt größer ist.

Ich habe heute nochmal rumprobiert:
Ich habe den Spannungsmesser meinem Messgerät angeglichen, um zu schauen ob das die präzision insgesamt erhöht:
Dies hat es, aber nur minimal. Ich habe absichtlich ne Abweichung von 0.7V in den Spannungsmesser reingemacht und igs wich das ganze auch nur ca 0.7V ab.
Das das so wenig bringt hätte ich echt nicht gedacht, da ja die gemessene Netzspannung Grundlage für die ganzen folgenden Rechnungen ist.

Denn habe ich die eingerechnete Verzögerung am Phasenanschnittregler erhöht, und das ganze lief fast haargenau präzise.

Ich bin mir nun nichts mehr sicher, was Schuld ist.
Kann der Triac seine Verzögerung ändern? Der wird nicht heiß und da ist ein fetter Kühler dran.
Was soll ich jetzt überhaupt tun. An welchen Stellen soll ich anfangen nach Fehlern zu suchenP

Desweiteren kam ich mit meinem Oszilloskop nicht klar. Weil die angeschnittene Sinuswelle an der y-Achse gespiegelt war. ich habe die Auto Funktion genutzt und zuvor hats richtig geklappt.

Kann mir da jemand ein Rat geben wie ich das behebe?

Hi,

dass ein Oszilloskope die Y-Achse spiegelt, kenne ich eigentlich nicht. Die Zeit läuft immer von links nach rechts steigend, diese Aussage aber ohne das deinige zu kennen. (Bei digitalen Oszilloskopen ist das theoretisch möglich.)

Dein variabler Zeitversatz kann vom Triac herkommen (welchen verwendest du?) aber die Zündzeit bewegt sich eher bei wenigen µs. Das kannst du über dein Oszi messen: Zündsignal von Arduino auf einen Kanal, (und auch darauf triggern) und die geschaltene Netzspannung auf den anderen.

Ich vermute aber als eine Quelle der Abweichung viel eher deine Nulldurchgangserkennung. (hast du noch die, die den Optokoppler direkt aus dem Gleichrichter ansteuert?) Die ist recht ungenau.
Google doch mal nach "Schaltung Nulldurchgangserkennung", da gibt es viel bessere.

Oder du gehst einen ganz anderen Weg:
einen zweiten Arduino spendieren, der sehr schnell abtastend die Sekundärspannung mißt, das Ergebnis dann dem ersten Arduino als Regelgröße zur Verfügung stellt.

Also heute hat mein Oszi das Signal wieder richtig rum gezeigt.
Ich habe nochmals die Verzögerung gemessen, und diese hat sich nicht geändert.
Die Verzögerung habe ich natürlich wieder miteinberechnet und der Spannungsmesser war auch präzise.
Igs. hatte ich eine Abweichung von +3V bei einer Netzspannung von 222V, bei 225V hatte ich komischer weise nur 1.5V.
Da beides präzise eingestellt war, kann doch eigentlich nur die Rechnung den größten Teil der Ungenauigkeit verursachen oder nicht?
Die erreichte Präzision von gestern habe ich nur erreicht weil ich die Verzögerung erhöht habe ohne mit dem Oszi nachzumessen. Das hat die +V auskompensiert.

Das ist der Schaltplan:http://arduinodiy.files.wordpress.com/2012/10/dimmer2.jpg
Ich verwende den BTA25-600B Triac: ST Microelectronics 7470 datasheet pdf

Wenn die Verzögerung der Nulldurchgangserkennung wirklich über die Temperatur stabil ist, und deine Spannungserkennung exakt arbeitet, dann weiß ich auch nicht weiter.

strohhirn:
Da beides präzise eingestellt war, kann doch eigentlich nur die Rechnung den größten Teil der Ungenauigkeit verursachen oder nicht?

Es mag ja sein, dass eine Formel nicht richtig ist und falsche Ergebnisse bringt. Aber dass eine mathematische Berechnung ihr Verhalten über die Zeit ändert, ist nicht möglich.

Aber das läßt sich ja einfach rausfinden: laß dir die Zwischengrößen über Serial.print() ausgeben und rechne von Hand nach.

Kannst du denn die unterschiedlichen Abweichungen reproduzieren?
Also., z.B.: beim Einschalten immer erst grosse Abweichung, dann, nach 20min Kleine?
oder kannst du mit gezielter Temperaturbeeinflussung (Kältespray, warmer Lötkolben) das Verhalten beeinflussen?
Damit kannst du den Schaltungsteil, der die Varianzen verursacht vielleicht eingrenzen.

Ich habe mal alles nachgerechnet und alles war richtig.

Desweiteren ist mir heute aufgefallen das die eingestellte Spannung trotz Verzögerungsberücksichtigung falsch ist.
Ich habe nämlich 5ms(+Verzögerung) eingestellt und in der Exeltabelle nachgeschaut wie viel Volt rauskommen müssten.
ca. 160V müssten rauskommen 165V habe ich gemessen.
Ich weiß nicht ob mein Oszi falsch geht oder warum das so ist. Zumindest hat sich die gemessene Verzögerung seit anfang nicht geändert.
Also habe ich mich versucht ranzutasten und die Verzögerung Schrittweise zu erhöhen. Es ist gelungen, jedoch nur in einem bestimmten Bereich. Die kleinere Spannung ab ca. 60V wich immer weiter ab.
Bereits hier ist mir aufgefallen das ich den Phasenanschnittregler nicht überall präzise machen kann.

Ich habe einfach mal versucht mit der ertasteten Verzögerung mir igs. das ganze anzuschauen. Und in dem Bereich in dem es zuvor präzise war, war es nun wieder unpräzise(-3V).
Also habe ich hier wieder Schrittweise mich an den präzisen Wert rangetastet und die Verzögerung runtergemacht.
Auch hier ist mir aufgefallen das ich es nur in einem bestimmten Bereich präzise machen kann.

Ist also vielleicht die Phasenanschnittformel ein bisschen gestaucht oder gestreckt?
Auf den Oszi war die Spitze der Sinuswelle gerade, wie eine Begrenzung, ich weiß nicht ob das einfluss nimmt. ich weiß aber auch nicht, ob ich meinem Oszi noch trauen kann.

Das mit der Temperaturbeeinflussung probiere ich noch aus.