Hallo liebe Gemeinde.
Bei meinen Phasenanschnitt habe ich das Problem das wie im Bild 1. zu
sehen, der angeschnittene Bereich schwankt und dadurch auch ein
optisches Flackern der Lampe verursacht wird.
(PS.: Der Bereich ist kleiner als der Markierte, genau kann ich das
nicht sagen, Oszi zu alt...)
Den Anschnitt mache ich über die Platine in Bild 2. Also kurz gesagt
über Schieberegister (74HC595)und Triacs etc.
Der Nulldurchgang, der auch im Bild 1 zu sehen ist, steht wie eine Eins.
Ich "Nulle" den Timer (s.main.c) immer beim Nulldurchgang und starte
dann den Timer neu, zünde den Triac wenn ein gwünschter Wert erreicht
ist.
Diese Wertabfrage mache ich im Interrupt alle 0,016ms.
Nach meiner Auffassung kann im schlechtesten Fall nur eine Verzögerung
von 0,016ms entstehen, das würde man aber mit Sicherheit nicht als
flackern wahrnemen, denke ich.
Hat vielleicht noch einer ein Tip für mich was ich mal ausprobieren kann
um der Sache auf die Spur zu kommen?
(Ich habe hier Beitrag "Dimmer flackert trotz Timer Interrupt" auch
schon mal was geschrieben,da war aber das Problem das komplette Wellen
nicht geschaltet wurden, das konnte ich bisher beheben. Jetzt geht es
wirklich nur um den "kleinen" Versatz beim Starten der Zündung/Triacs)
@ Markus P. (sebastianwurst)
> 1.JPG> 1,6 MB, 6 Downloads
Bitte mal über Bildformate informieren.
>Diese Wertabfrage mache ich im Interrupt alle 0,016ms.
Wo?
Ich sehe nur einen INT0-Interrupt für den Nulldurchgang, einen
TIMER0_COMPA für das verzögerte zünden und einen USART_RX für den
Datenempfang per UART. Dort wird auch dein Jitter herkommen, denn
während der USART_RX abgearbeitet wird, muss der TIMER0_COMPA warten.
Schalt mal den UART testweise aus.
Ausserdem ist deine main Hauptschleife RIESIG, da sieht keine Sau durch.
Pack das in Funktionen, damit man maximal 1-2 Bildschirmseiten für die
Hauptscheife braucht. Ausserdem habe ich das unbestimmte Gefühl, dass da
noch nicht alles rund läuft mit den Dutzenden Aufgaben.
MFG
Falk
Du hast Recht, ich muss mal aufräumen da ich 80% auch garnicht mehr
gebrauche, ich weiss nur noch nicht ob es für ewig so bleiben wird
deswegen hab ich die noch drin gelassen....
Durch diese Initialisierung des Timers 0:
1
TCCR0B|=(1<<CS00)|(1<<WGM02);// CTC uns Prescaler 1 (16.000.000/256)= 0,016ms Interrupt auslösen)
2
3
TCNT0=0;// Timer Startwert
4
OCR0A=255;// Load register
5
TIMSK0|=(1<<OCIE0A);// Interrupt nach Overflow
Das sind dann 0,016ms
und hier wird die Aufgerufen:
Dort wird dann alle 0,16ms der TriacZuenden()aufgerufen und wenn der
TCNT1 die Vorgaben überschritten hat der Triac gezuendet...
Deine ISR (TIMER0_COMPA_vect) braucht wegen dem
AusgangSetBit/UnsetBit/AusgangOut Verhau immer länger als 16us.
Das braucht sie so zwar immer noch, aber nur gelegentlich:
volatile int tick,dimm17=15000,dimm18=10000,dimm19=15000;
ISR(TIMER0_COMPA_vect)
{
unsigned char changed=0;
tick++;
if(tick==dimm17) { AusgangSetPit(17); changed=1; }
if(tick==dimm18) { AusgangSetPit(18); changed=1; }
if(tick==dimm19) { AusgangSetPit(19); changed=1; }
if(changed) AusgangOut();
}
ISR(INT0_vect)
{
tick=0;
AusgangUnsetBit(17);
AusgangUnsetBit(18);
AusgangUnsetBit(19);
AusgangOut();
}
Man muß übrigens sicher stellen, daß nur die eine oder andere
Interrupt-Funktion ausgeführt werden kann, keine geschachtelten
Interrupts sonst wird eventuell mitten im rücksetzen noch gesetzt oder
umgekehrt. Glücklicherweise ist das default-mässig der Fall.
@ Markus P. (sebastianwurst)
>Durch diese Initialisierung des Timers 0:>TCCR0B |= (1<<CS00) | (1<<WGM02); // CTC uns Prescaler 1 >(16.000.000/256)=
0,016ms Interrupt auslösen)
>TCNT0 = 0; // Timer Startwert>OCR0A = 255; // Load register>TIMSK0 |= (1<<OCIE0A); // Interrupt nach Overflow
Der Kommentar ist irreführend, weil falsch. Es ist der CTC Modus, da
gibt es keinen Überlauf, sondern einen Compare Match. So heißt auch die
ISR.
>Das sind dann 0,016ms
Oder wie der Fachmann sagt, 16us. Nicht viel, mach gerade mal 256 Takt
bei 16MHz. Mit wieviel läift dein AVR?
>Dort wird dann alle 0,16ms der TriacZuenden()aufgerufen und wenn der>TCNT1 die Vorgaben überschritten hat der Triac gezuendet...
Sportlich, in einem 16us Interrupt noch Funktionen aufrufen, die sind
bekanntermassen beim AVR nicht so schnell an der Stelle (Stichwort
Register sichern etc.). WENN, dann macht man das direkt in der ISR, ohne
Funktionsaufruf. Aber wozu braucht man für eine Phasenanschnittsteuerung
einen 16us Timer? Es reicht doch, per Output Compare nach dem
Nulldurchgang ein IO-Pin zu setzen. Das macht der Timer allein ohne
jegliche CPU-Last. Und jitterfrei ;-)
Wenn man nun noch so clever ist, und statt INT0 die Input Capture
Funktion nutzt, clever combimiert mit der Output Compare Funktion, kann
man nahezu beliebige Interrupts parallel nutzen, ohne den geringsten
Jitter.
>Wenn ich aber nichts über USART sende/empfange dann brauch die USART_RX>auch nichts machen oder?
Ja.
MFG
Falk
> Oder wie der Fachmann sagt, 16us. Nicht viel, mach gerade mal 256 Takt> bei 16MHz. Mit wieviel läift dein AVR?
16Mhz
>Es reicht doch, per Output Compare nach dem> Nulldurchgang ein IO-Pin zu setzen.
Aber ich habe ja mehrere Phasenanschnitt, daher das Schieberegister.
> Sportlich, in einem 16us Interrupt noch Funktionen aufrufen, die sind> bekanntermassen beim AVR nicht so schnell an der Stelle (Stichwort> Register sichern etc.).
Ich wollte das auch erst nicht mit Funktionsaufrufe in der ISR machen,
wollte eigentlich nur ein Flag setzen und diesen dan in der main
abfragen, aber das klappt auch nicht besonders gut (Flackern).
> Wenn man nun noch so clever ist, und statt INT0 die Input Capture> Funktion nutzt, clever combimiert mit der Output Compare Funktion, kann> man nahezu beliebige Interrupts parallel nutzen, ohne den geringsten> Jitter.
Da bin ich zu doof für, glaub ich ;-( Aber ich versuche mein Bestes.
Werde durch Eure Tips nochmal einbissel ausprobieren. Danke schonmaml.
Bitte schaut nochmal rein....
@ Markus P. (sebastianwurst)
>Aber ich habe ja mehrere Phasenanschnitt, daher das Schieberegister.
Wieviele? Timer 1 hat zwei Output COmpares Register, kann man schon mal
zwei erledigen. Es gibt AVRs mit vier und mehr Output Compares, kann man
nutzen. Reicht das nicht, muss man es so wie du in Software machen, ist
dann eine Art synchroner Soft-PWM.
>Ich wollte das auch erst nicht mit Funktionsaufrufe in der ISR machen,>wollte eigentlich nur ein Flag setzen und diesen dan in der main>abfragen,
Keine gute Idee, da ist das Timing noch mieser.
> aber das klappt auch nicht besonders gut (Flackern).
Logisch.
MFg
Falk
Falk Brunner schrieb:> Wieviele? Timer 1 hat zwei Output COmpares Register, kann man schon mal> zwei erledigen. Es gibt AVRs mit vier und mehr Output Compares, kann man> nutzen. Reicht das nicht, muss man es so wie du in Software machen, ist> dann eine Art synchroner Soft-PWM.
Bis zu zehn sind das Ziel...
>Keine gute Idee, da ist das Timing noch mieser.
Das dachte ich mir dann auch...
oszi40 schrieb:> Evtl. mal eine Gegenprobe mit Rechteckimpulsgenerator machen ob die> gelieferten Impulse überhaupt AUSREICHEN um den Triac anzusteuern?
Ich habe auch direkt am Ausgang vom Schieberegister gemessen (74HC595)
das spiegelt den sinusverlauf der angeschnittenen Wechselspannung
komplett wieder.
Vielleicht stelle ich mich auch viel zu sehr an.
Ich habe keinen Vergleichsdimmer bei mir im Hause, nur einen Dimmer der
über Kondensatoren/Schieberegler den Phasenanschnitt macht. Da gibts
kein flackern.
Das flackern ist auch so klein, denke mir nur das eine so flackernde
Leselampe zu Kopfschmerzen führen würde.
Kann dieser INT2 auch was damit zu tun haben, ich benutz das AVR Net IO
Board da ist die NEtzwerkkarte auch drauf. Die brauch den Interrupt.
Welcher Interrupt gewinnt?
> Wieviele? Timer 1 hat zwei Output COmpares Register, kann man schon mal> zwei erledigen. Es gibt AVRs mit vier und mehr Output Compares, kann man> nutzen. Reicht das nicht, muss man es so wie du in Software machen, ist> dann eine Art synchroner Soft-PWM.
ich habe jetzt mal nur einen Ausgang getogglet und der sieht komplett
identisch zu den Ausgängen der Schieberegister aus. Ich habe fast jeden
weitern Code in der Main auskommentiert und trozdem wackelt der Ausgang.
So wie im Bild vom ersten Eintrag... Auch ohne Schieberegister wackelt
der (PD3)
Der Nulldurchgang steht auf die 1000/Sekunde, laut Oszi.
Müsste der getogglet Ausgang auch so stehen? Was ist denn Normal für so
einen Atmega 644p mit 16Mhz Taktung?
Hier ist nochmal der Code der Interrupts: