www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Phasenabschnitt ELV


Autor: Steffen Mathes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mir mit Vorbild von ELV
(http://www.elv-downloads.de/service/manuals/DI300/...)
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

Autor: Ralf Rosche (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.