Hallo Joachim,
wie schon geschrieben, habe ich mich sehr von Deiner Software 'inspirieren' lassen

, ich habe sie in wesentlichen Zügen übernommen. Das auch deshalb, weil ich sie von der Struktur her für weitestgehend 'passend' halte. Da muss man nicht etwas völlig Neues erfinden.
Zur Sinustabelle:
Wie man an den Resten im Code noch erkennt, habe ich zuerst wie Du 1ms nach einem Nulldurchgang die PWM mit der vom MPP-Tracker ermittelten fixen Pulsweite eingeschaltet und diese dann nach weiteren 8ms wieder abgeschaltet (case 10 und case 90 in den Zeilen 511 und 517).
Das habe ich dann irgendwann ersetzt durch den Code in den Zeilen 530-533.
- Code: Alles auswählen
if( !(PORTB&(1<<PWMDISABLE))&&(SinePhase>=10)&&(SinePhase<=90) )
OCR1A = (uint32_t)PulseWidth*Sine[SinePhase]>>8;
else
OCR1A = 0; // PWM ausschalten
Meine Sinustabelle hat 100 Werte für die nominal 10ms der Halbwelle, der Timer-Interrupt kommt ja alle 100us. Die ersten 10 und die letzten 10 Werte sind Nullen, da in dieser Zeit die PWM nicht aktiv sein soll (hätte man natürlich aus Speicherplatzgründen weglassen können). Jetzt wird einfach bei jedem 100us Interrupt ein neuer Wert aus der Tabelle geholt, der erste nach 10*100us=1ms und der letzte nach 90*100us=9ms. Dieser Wert wird mit der vom MPP-Tracker berechneten Pulsweite multipliziert und danach wieder auf 9 Bit gebracht (ich lasse die PWM mit 9 Bit Auflösung laufen). Da die Tabelle die erwähnten Nullen enthält, hätte man es auch so lösen können:
- Code: Alles auswählen
if( !(PORTB&(1<<PWMDISABLE))&&(SinePhase<=100) )
OCR1A = (uint32_t)PulseWidth*Sine[SinePhase]>>8;
else
OCR1A = 0; // PWM ausschalten
Der Index (SinePhase) wird also nicht 'berechnet', er wird einfach nach einem Nulldurchgangsinterrupt hochgezählt. Da die OCR Register doppelt gepuffert sind, kann man einen neuen PWM Wert auch jederzeit einfach hineinschreiben, er wird bei der 'nächsten' PWM-Periode übernommen.
Warum ich das mit dem Sinus gemacht habe? Hmmm, um einen netzgekoppelten WR in DE betreiben zu dürfen, sollten die Harmonischen im Ausgangsstrom unter einem bestimmten Grenzwert liegen. Diesen werde ich zwar auch so nicht erreichen, aber man sollte es wenigstens versuchen. Auch der Gesundheit der Bauteile auf der Sekundärseite sollte mindestens theoretisch eine solche Steuerung gut tun. Bei Verwendung einer fixen Pulsweite wird in den Bereichen, wo die Netzspannung noch gering ist, mehr Leistung auf die Sekundärseite übertragen und diese Leistung dann mit einem tendenziell höheren Strom in das Netz abgegeben. Ich habe zumindest mit der ursprünglichen Version (feste Pulsweite, 10 Bit PWM) extreme Spitzen auf dem Ausgangsstrom gemessen und auch die 'Geräuschkulisse' war recht unangenehm. Das hört sich nach einem kosmetischen Problem an, aber solche Geräusche sind oft symptomatisch für erhöhten Stress an den Bauteilen (hörbar durch Magnetostriktion) und das kann man ja vermeiden.
Ich habe übrigens bei meinem GTI immer noch ein kleines Problem, welches mir anfangs eine Menge Kopfzerbrechen bereitet hat. Der Lüfter scheint extreme Störungen zu verursachen, die sich insbesondere auf die Nulldurchgangserkennung negativ auswirken. Den Effekt konnte man auch mit der Originalsoftware beobachten, die Leistung änderte sich extrem, wenn der Lüfter aktiviert wurde. Mit den jetzigen Einstellungen der Ausblendung des Comparatorinterrupts geht es aber ganz gut.
Ich habe es übrigens bisher bei diesen ganzen Software-Spielereien noch nicht geschafft, den WR kaputt zu bekommen. Das spricht auch für ein nicht ganz schlechtes Hardwaredesign.
Und noch etwas, ich bekomme jetzt aus meinem 230W PV-Panel bei optimalen Bedingungen (das ist jetzt leider schon einige Tage her

), ~170W am Ausgang des GTI. Mit den 85% Wirkungsgrad ziehe ich dann also ca. 200W aus dem Panel. Meine andere Anlage mit 8 Panels und einem Effekta ES3300 zeigte im gleichen Moment 1.67kW Eingangsleistung, also minimal mehr pro Panel (~210W).
Gruß,
Jörg.