Zu Dino:
Beim Phasenanschnitt (mit TRIACs) triggert die Nulldurchgangserkennung auf jede Halbwelle, genau. Dabei wird der Timer auf 0 zurückgesetzt, und somit meine PWM mit den Halbwellen synchronisiert. Im einstellbaren OC wird der TRIAC gezündet, der Timer läuft innerhalb der 10ms sicher (Reserve bereits drin) über, und nimmt den Zündimpuls rechtzeitig wieder vom TRIAC, damit dieser im folgenden Nulldurchgang sicher verlöschen kann. Ich weiß,daß ich den Sicherheitsbereich am Ende (also sehr großer Anschnittswinkel) und den ersten Timer-Takt (winzig kleiner Winkel) nicht verwenden kann. Ich kann aber zumindest den TRIAC dauerhaft an oder aus halten.
Bei meinem Vorschlag mit dem Abschnitt habe ich nirgends was von Rückwärtszählen geschrieben. Da der AVR jetzt zu 2 festgelegten Zeitpunkten Schalten muß (möglichst sofort beim Durchgang ein, nach einer vorgegebenen Zeit aus), und der Überlauf-IRQ zwangsläufig verwendet wird, war mein Vorschlag, statt des PWM zum halbwegs automatisierten schaltens zumindest den Überlauf zu verwenden...
Mal konkretere Zahlen:
Der AVR läuft ja effektiv mit 1,2MHz, mit 'nem Prescaler von 8 kommt der 8bit-Timer auf 'ne Reichweite von gut 13ms (single slope). Verwendet wird der Normalmodus, der CompareOutputMode wird so gewählt, der Pin beim Überlauf (=CompareMatch da OCR=TOP) gelöscht wird.
In der Nulldurchgangs-ISR wird einerseits der Pin gesetzt (wenn das per Port Register geht, ansonsten per FOC Strobe, dann muß natürlich als COM im Überlauf getoggelt werden), andererseits TCNT entsprechend des vorgegebenen Winkels vorgesetzt werden. Allerdings geht's hier auch erst ab TCNT=68 los, bei kleineren Werten ist der Ausgang dauerhaft angeschaltet. Jede weitere Erhöhung des Reloades für TCNT verkürzt die On-Zeit um ca 53µs.
Hallo alle zusammen,
so, die Schaltung steht nun soweit.
Ich habe nun, alternativ zur PWM mit 2N3005, mal 2 Thyristoren für die Phasenanschnittsteuerung genommen. Angesteuert werden diese jeweils über einen cny17.
Die beiden Eingänge liegen parallel mit gleicher Polarität.
Beide Thyristoren bekommen zeitlich den Zündimpuls, bedingt durch die momentane Polarität der Wecheselspannung
schaltet nur einer der beiden Thyristoren durch.
Zur Messung des Spannungsverlaufs:
Die Wechselspannung richte ich über eine Diode in Einwegschaltung gleich.
Negative Spannungen bringen mir am Avr nix, da der ja nur positive Werte verarbeiten kann.
Zuerst wollte ich eine Graetz-Brücke nehmen um beide Wellen zu übernehmen, dachte mir aber da die beiden
Wellen identisch sind kann ich mir das sparen. Dann hat der Avr während der 2. Welle Zeit zu rechnen.
Jetzt habe ich mal eine simple while()-Schleife programmiert.
Sinngemäß:
Wenn uadc > 100 dann setzte PB0=1 solange bis uadc < 100 ist.
Da ist scheinbar nicht symmetrisch, unsynchron und war nur als neugierige Spielerei gedacht.
Mit dem Timer muss ich erst mal arbeiten, da kapier' erst mal nicht viel.
Hier mal ein Timer-Versuch zur Rechteckerzeugung:
DDRB |= (1<<PORTB0); // Set PB0 (Pin 5) as output
/*
CS02 CS01 CS00
0 0 0 No clock source, timer/Counter stopped
0 0 1 clk/noPrescaling
0 1 0 prescaler / 8
0 1 1 prescaler / 64
1 0 0 prescaler / 256
1 0 1 prescaler / 1024
1 1 0 prescaler / Extern clock source. clock on falling edge
1 1 1 prescaler / Extern clock source. clock on rising edge
*/
// Timer 0 konfigurieren
TCCR0B = (1<<CS01); // Prescaler 8 -->> 1,2 * 10^6 / 8 ->>150 kHz / 510 -> 3 ms
OCR0A= 10;
// Overflow Interrupt erlauben
TIMSK0 |= (1<<TOIE0);
// Global Interrupts aktivieren
sei();
while(1)
{}
Da bekomme ich eine Frequenz von ca. 300 Hz laut Oszi. Das stimmt ja auch, so grob.
Was macht denn OCR0A= 10 ? Sehe keine Veränderung !?!?
Gruß
Ralf