Hab mir mit Vorbild von ELV (http://www.elv-downloads.de/service/manuals/DI300/37378-DI300.pdf) einen Phasenabschnittdimmer aufgebaut. Sicherheitshalber hab ich Synchronisationseingang und Steuerausgang zum FET mit Optokopplern versehen. Als IC2 verwende ich einen PIC12F629 und dessen Pin GP2 als Synchronisationseingang. Bei jeder negativen Flanke an GP2 wird ein Interrupt ausgelöst. Die Software hab ich folgendermaßen aufgebaut (da die negative Flanke nur einmal pro Netzperiode ansteht muss der zweite Nulldurchgang durch die Software berechnet werden): nach einem Interrupt wird der Mosfet durchgeschaltet - nach erreichen des eingestellten Phasenwinkels wird er wieder gesperrt - nach ca.10ms seit dem Interrupt wird er wieder durchgeschaltet und wiederum nach erreichen des Phasenwinkels gesperrt. Womit ich dabei probleme hab ist, dass laut ELV ein 455KHz Resonator verwendet wird, der interne Takt des PIC liegt also bei 113KHz (1/4*Fosc) oder 9µs. Angenommen ich würde mich mit einer linearen Auflösung des Phasenwinkels und 40 Stufen zufrieden geben: 10ms/40 = 250µs = 27 Prozessortakte. Da is der PIC doch nur noch mit dem Timer beschäftigt und für eine logarithmische Auflösung bleibt auch kein Spielraum mehr ... oder??? Zum testen benutze ich gerade einen 4MHz Quarz, also 1MHz internen Takt und selbst da wackelt mir das Oszibild bei dem berechneten zweiten Nulldurchgang noch zu sehr. Dabei brauche ich doch auch noch eine Tastenabfrage zum einstellen des Phasenwinkels. Hat vielleicht jemand eine Idee für einen effizienten Quellcode, oder einen besseren Ansatz für die Berechnung des zweiten Nulldurchgangs? Benutze C, Assembler ist für mich zwar kein Chinesisch, aber Französisch noch allemal. DANKE Steffen
hallo steffen, beim phasenabschnitt brauchst du eigentlich nicht den phasenwinkel, der mosfet wird ähnlich einer pwm angesteuert. leider reicht nicht ein 50us impuls zum ansteuern wie zur zündung eines triacs verwendet. so muss der ausgang des pics für etwa 1ms auf low gelegt werden( beim elv dimmer schaltet der mosfet durch, wenn der pic ausgang auf low liegt) auf dem oszillogramm kann man sehen , dass die pausen von 1ms bis etwa 4ms varieren. wenn du nur eine einfache steuerung brauchst, kannst du die timings im interrupt direkt erzeugen (interrupt wird bei negativer flanke des zerocrossings eingang getriggert) diese lösung ist für mehr möglichkeiten (ir, tasten etc) ungünstig, da praktisch die komplette power in der interruptserviceroutine verbraten wird. (beim elv dimmer gibts dann das problem, dass die sicherung durchbrennt, wenn du in deiner hauptroutine (interrupt gesperrt) zu lange zeit brauchst und der mosfet zu lange durchgesteuert bleibt. man muss hier einen anderen weg gehen und das ganze mit dem timer und timerinterrupt lösen. bei pics mit 2 timern kannst du die auch beide verwenden . ich habe einen 16f84 verwendet und musste dazu noch 2 statusvariablen verwenden, also je nach status, wird der timer initialisiert (einmal für die pausephase und einmal für die powerphase , pausepahse ist 10ms lang die powerphase variiert. wenn der mosfet 2 mal durchgeschaltet wurde, wird der timer ausgeschaltet und die statusflags zurückgesetzt. jetzt löst eine neue negative flanke die routine erneut aus. im oszillogramm wackelt jetzt nichts mehr, da der prozessor nur noch einige mikrosekunden in der interruptserviceroutine steckt. inzwuschen habe ich auch genug power, um infrarotcommandos auszuwerten. ich verwende einen 16Mhz quarz, timer0 mit 256:1 vorteiler hier ein beispiel für den interruptservice. du kannst mir gerne deine version senden. gruss ralf org 0x04 intvec ;interrupt movwf w_temp ;status retten swapf STATUS,w movwf status_temp btfsc INTCON,T0IF ;wars der timer? goto phase_pause bcf PORTB,1 movlw d'230' ;timer wert für powerzeit movwf TMR0 bcf INTCON,T0IF bsf INTCON,T0IE bsf phase_flag,1 goto int_end phase_pause btfsc phase_flag,1 goto phase_2 btfss phase_flag,2 goto alles_aus bcf PORTB,1 movlw d'230' movwf TMR0 bcf INTCON,T0IF bsf INTCON,T0IE bcf phase_flag,2 goto int_end phase_2 bsf PORTB,1 bcf phase_flag,1 bsf phase_flag,2 movlw d'101' movwf TMR0 bsf INTCON,T0IE bcf INTCON,T0IF goto int_end alles_aus bsf PORTB,1 bcf INTCON,T0IF bcf INTCON,T0IE int_end bcf INTCON,INTF swapf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.