Forum: Mikrocontroller und Digitale Elektronik Phasenabschnitt ELV


von Steffen Mathes (Gast)


Lesenswert?

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

von Ralf Rosche (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.