pic phasenabschnittsteuerung Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
pic phasenabschnittsteuerung Suche nach: pic (2056) |
|
|
|
|
BID = 171525
ffs_hiwi Gesprächig
Beiträge: 153 Wohnort: Reinbek
|
|
hallo,
ich habe eine pahasenabscnittsteuerung mit einem pic 16f84 mit 16Mhz und einem tsop ir empfänger für das steuern mit rc5 codes programmiert. an rb0 ist die ac leitung für das zerocrossing angeschlossen. an rb1 hängt der triac.
das programm benutzt keine pullups und einen timer0 vorteiler von 256, sodass im bereich der werte 101-255 von timer0 genau eine halbwelle liegt, also 10ms bei 50hz.
ich aktivieer den interupt, wenn zerocrossing aktiv ist, also beim übergang von low auf high wird der ausgelöst.
daraufhin aktiviere ich den tmr0 interrupt, der mit der dimmer varaiable gefüllt ist und nach dem zerocrossing in der halbwelle (also von 0-10ms entspricht 101-255) den triac für 30mikrosekunden zündet. hier wird der tmr0 interrupt auch wieder deaktiviert.
die zündung in der 2. halbwelle wird berechnet, ist in diesem listing nicht vorhanden, ebenso nicht die ir steuerung.
das ganze funktioniert soweit sehr gut.
selten gibts aber ein problem, dass der zeitpunkt nicht richtig stimmt. habe mir das auf dem oszi angesehen und festgestellt, dass (besonders bei reset oder einschalten)
eine zündung genau im zerocrossing stattfindet, die "echte" aber dann nicht. kann das an undefinierten registern von INTCON liegen beim reset? ich teste ja im interruptservice, ob es der zerocrossing war, wenn nicht gehts in die zündung.
anbei das listing
#include <P16f84A.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC
w_copy Equ 0x20 ; Backup für Akkuregister
s_copy Equ 0x21 ; Backup für Statusregister
Dimmer Equ 0x22
CounterA EQU 0x23
CounterB EQU 0x24
org 0
goto Init
; die Interruptserviceroutine
org 4
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;
BTFSC INTCON,INTF;Was it RB0?
Goto Zero_Crossing ;Yes? jump to z_Cross
bcf INTCON, T0IE ; Timer0 interrupt nicht mehr erlauben
BCF INTCON,T0IF ;Clear the TMR0 overflow
BSF PORTB,1 ; triac on
movlw D'16' ;warte 30mikrosekunden
movwf CounterB
movlw D'148'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
BCF PORTB,1 ;triac off
Goto Int_end
Zero_Crossing
BCF INTCON,INTF ;Clear the RB0/Int flag.
MOVFW Dimmer
movwf TMR0 ;Load TMR0 w/ the value in 'Dimmer'
bsf INTCON, T0IE ; Timer0 interrupt erlauben
Int_end
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
retfie
Init
bsf STATUS, RP0 ;bank1
movlw B'11000111' ; Vorteiler zum Timer0, 256:1
movwf OPTION_REG
movlw B'00000001'
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
movlw d'130' ;es sind bei diesem timing werte von etwa 100-254 möglich
movwf Dimmer
movwf TMR0
bcf INTCON,INTF
BCF INTCON,T0IF ;Clear the TMR0 overflow interupt
bsf INTCON, INTE ; Rb/int interrupt erlauben
bsf INTCON, GIE ; Interrupt erlauben
main_loop
goto main_loop
end
[ Diese Nachricht wurde geändert von: ffs_hiwi am 9 Mär 2005 12:52 ] |
|
BID = 173407
ManniHorsti Stammposter
Beiträge: 337 Wohnort: Rheine
|
|
Hallo ffs_hiwi,
kann es vielleicht sein, dass es gar nicht an Deinem Programm
liegt, sondern an den Eigenschaften eines TRIACs, dass Deine Schaltung nicht sicher zündet. Beim Nulldurchgang, kann man einen TRIAC nämlich nicht zünden. Es muss schon eine Mindestspannung vorhanden sein, ehe er zündet, und es muss schon ein Mindeststrom erreicht sein, ehe man die Zündspannung am Gate zurücknimmt, damit er auch eingeschaltet bleibt (wichtig bei Spulen). Ich würde Dein Programm dahin gehend ändern, das die Zündspannung, bzw.Zündstrom am Gate für die fast ganze Halbwelle anliegt, falls Deine Elektronik das hergibt, oder ich würde auch bei geforderter Volllast, immer etwas später zünden.
Gruß Manni
[ Diese Nachricht wurde geändert von: ManniHorsti am 13 Mär 2005 21:21 ] |
|
BID = 173615
Henne02 Stammposter
Beiträge: 493 Wohnort: Aachen
|
@ManniHorsti:
PhasenABschnitt nicht PhasenANschnitt. Mit Triacs geht das sowieso nicht.
Grüße, Hendrik
|
BID = 173663
ffs_hiwi Gesprächig
Beiträge: 153 Wohnort: Reinbek
|
hi, danke für die antworten.
ist natürlich kein triac , sondern ein mosfet am ausgang.
ich denke aber ,dass es an der sotfware liegt, den wen ich den output am oszi anschaue, sieht alles ganz normal aus, das heißt per infrarotfernbedienung wandert der "zündzeitpunkt" , geht aber gegen null oder schon manchmal beim reset oder einschalten rammelt er sich da fest.
die mcu hängt aber nicht im interrupt fest, das habe ich schon probiert. die ausgangsstufe ist zunächst mal uninteressant, die ist mit einem CoolMos von Siemens aufgebaut und geht auch schon, ich muss eben erst ein sauberes ausgangssignal erzeugen.also wenn noch ideen da sind, bitte gerne posten.
gruss ralf
|
BID = 173845
ManniHorsti Stammposter
Beiträge: 337 Wohnort: Rheine
|
Hallo,
welches ist das kürzeste Intervall, dass Du mit Deinen Registereinstellungen erreichen kannst, und wo genau rammelt
sich der Zündzeitpunkt fest ?
Manni
|
BID = 174070
ffs_hiwi Gesprächig
Beiträge: 153 Wohnort: Reinbek
|
hallo,
ganz genau kann ich das jetzt nicht sagen, da ich die ausgabe auf die serielle schnittstelle rausgenommen hatte, das baue ich wieder ein und test das in den nächsten tagen, es muss aber nahe 255 sein. auf dem oszillogramm sieht das so aus: "zündzeitpunkt" (ich hatte dich sicher verwirrt , da im quelltext was vom triac steht, ist aber tatsächlich keiner drin) wandert gegen null (zum zeropunkt) ,d h. das TMR0 geht gegen 255 kurz vor erreichen das mullpunktes - ich schätze <1ms - (osszi ist ziemlich unscharf) springt dieser punkt dann auf null. wenn ich rechne: bei meinem prescaler und taktfrequenz habe ich für eine halbwelle etwa 100 schritte , was 10ms bei 50Hz entspricht. (255-100 entspricht etwa 10ms)
ich fange zum test in der software bei etwa 130 an.
da liegt denn auch der zündzeitpunkt am ende der halbwelle-genau richtig. wandert er dann geegn null, gibts das erwähnte phänomen.
ich werde also deinen tipp aufnehmen und dne genauen wert des kritischen punktes ermitteln und weiter berichten.
gruss
|
BID = 174131
Henne02 Stammposter
Beiträge: 493 Wohnort: Aachen
|
Lässt sich vielleicht Deine ZC-Detection von dem Zünden in dessen Nähe beeindrucken?
Wie siht denn deren Signal aus?
Grüße, Hendrik
|
BID = 174168
ffs_hiwi Gesprächig
Beiträge: 153 Wohnort: Reinbek
|
Hallo henne02,
das habe ich auch schon gedacht und statt das signal vom netz zu nehmen (könnte ja eine phasenverschiebung geben)
habe ich einen sauberen sinus von einem hp-generator eingespeist. das signal ändert sich nicht, ich beobachte es auf dem 2. kanal des osszis.
Ich habe nun den MPLB debugger mal angeworfen und das
programm step by step durchgeführt, dabei das register tmr0 beobachtet und dabei folgendes festgestellt:
das tmr0 register wird nahezu bei jedem step incrementiert, wenn es denn nun zufällig bei 0xfb steht wenn der interrupt durch zerorossing ausgelöst wird , zählt es innerhalb der interruproutine weiter hoch, und läuft über.
da beim zc noch kein timerinterrupt aktiviert ist, passiert nichts dachte ich , in der beschreibung von microchip zum 16f84 steht , dass in jedem fall , egal wie das optionregister steht das TOIF Flag (Timeroverflow) beim überlauf gnadenlos immer gesetzt wird.
ok.
die zc routine enabled den timerinterupt und dann passiert folgendes:
das programm verbleibt sofort in der interruptroutine, weil ja offensichtlich das TOIF schon gesetzt ist.
ich habe jetzt noch 2 befehle eingefügt, die in der zc routine das flag löscht und den timer zurücksetzt bevor der aktuelle dimmer wert in den timer geschrieben wird.
funktioniert im debugger nun richtig.
ausserdem darf der dimmer wert nicht größer werden als 250, da die interruptroutine 5 taktzyklen benötigt, andernfalls gibts vorher einen tmr0überlauf.
das würde auch erklären, dass beim einschalten manchmal der zündzeitpunkt auf null steht.
ich probiere das heute abend mal in der schaltung aus und berichte.
wenn jemand interesse an dem fertigen sourcecode hat bitte melden (arbeitet zur zeit mit der fernbedienung beo4 von bang und olufsen), geht aber auch für rc5 codes.
gruss ralf
|
BID = 174290
ManniHorsti Stammposter
Beiträge: 337 Wohnort: Rheine
|
Was macht Dein Programm, wenn gar keine
Leistung mehr gefordert ist ? Fängst Du Leistung Null ab ?
Port auf 0 Interrupts sperren, und gibst den Interrupt erst
mit geforderter Leistung wieder frei ?
Gruß Manni
|
BID = 175285
ffs_hiwi Gesprächig
Beiträge: 153 Wohnort: Reinbek
|
hallo manni,
zunächst funktioniert es jetzt, also war der fehler, dass das TMRO register ständig incremtiert wird und natürlich das TOIE Flag gesetzt wird , auch dann, wenn der Interupt TMR0 deaktiviert ist.
deine frage ist natürlich ein sehr kluge frage.
bisher gabs keine probleme, da bei minimalem "zündzeitpunkt" nahe dem nullpunkt der Phase auch die Leistung null ist , das geht nur dann gut , wenn ohmsche lasten dran sind und daher auch keine phasenverschiebung auftritt, bei induktiven lasten und auch elektronischen trafos gibts eine verschiebung und dann könnte das ganze wohl nur vernünftig geregelt werden, wenn der interrupt gesperrt wird, das werde ich noch einbauen müssen.
gruss und dank ralf
|
BID = 175499
ManniHorsti Stammposter
Beiträge: 337 Wohnort: Rheine
|
Ist doch schön, wenn es dann tut, oder ... ?
Gruß Manni
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 23 Beiträge im Durchschnitt pro Tag heute wurden bisher 17 Beiträge verfasst © x sparkkelsputz Besucher : 182264271 Heute : 4165 Gestern : 4669 Online : 484 31.10.2024 22:30 2 Besucher in den letzten 60 Sekunden alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0397219657898
|