Ondanks dat het projectje al af was, ben ik - mede op inspiratie van Arco -, toch maar even hiermee doorgegaan. Gewoon omdat het leuk is.
Ik heb voor de zero cross detectie gebruik gemaakt van een AC Optocoupler.
Geen ELP20, maar een LTV 814, puur omdat het plaatselijke winkeltje die had.
Het ding werkt prima. Met 1K5 weerstanden in de AC ingangen krijg ik een keurige puls, en dus ook geen diodebrug meer nodig.
Dan heb ik de 555 vervangen door een uC. Omdat ik me herken in wat Arco zo treffend schetst het dikwijls 'ge-emmer' is om die dingen aan de praat te krijgen. Er is altijd wel wat met die chip.
EN omdat ik het werken met PIC's leuker vindt. Zonder gerommel met RC-waarden.
Daarom koos ik voor de mij vertrouwde PIC16F1847. Ik gebruik daarvan nu PORTA.0 als analoge ingang, waar ik de loper van een potmeter van 50K heb gehangen (andere einden aan VCC en GND). Ik had zelf nog niet eerder met analoog gewerkt, dus een mooie test. EN een programmaatje gemaakt Om met de potmeter de pulslengte te variëren (die uiteindelijk tzt de MOSFETS gaan aansturen).
De puls die van de Optoupler komt, triggert de Interrupt op PORTB.4 Dan start ik de timer die om de 1 mS een timer interrupt geeft.
Met de waarde van de Potmeter vertaald naar een getal (potmeter rond = 100%) bepaal ik dan hoe lang de puls (LATB.5) hoog moet blijven.
Het werkt allemaal ook nog.
De vraag die ik nu heb is: Doe ik het een beetje goed zo (zie MB-programma hieronder)? Met name de lage waarde van de puls geeft wat onregelmatigheden:
Bij waarden kleiner dan 3ms zie je dat hij na 1 mS weer heel even naar 0 gaat (bij de negatieve flank van de pulsingang). Bij hogere waarden gaat het wel goed.
pic basic code:
Program Dimmer
Dim PulseLen As Byte
Cnt1 As Byte
Pot As Float
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
If IOCBF4_Bit = 1 Then
LatB.5 = 1
Cnt1 = 0
TMR2ON_bit = 1
IOCBF4_Bit = 0
End If
If TMR2IF_bit = 1 Then
Inc(Cnt1)
If Cnt1 = PulseLen Then
LatB.5 = 0
TMR2ON_bit = 0
Cnt1 = 0
End If
TMR2IF_bit = 0
End If
End Sub
main:
OSCCON = %01110000
ANSELB = %00000000
ANSELA = %00000001
TRISB = %00010000
TRISA = %11111111
LatB.5 = 0
ADC_Init()
GIE_Bit = 1
IOCIE_Bit = 1
IOCBP4_Bit = 1
IOCBN4_Bit = 0
PR2 = 249
T2CON = %00001101
TMR2IE_bit = 1
TMR2ON_bit = 0
PEIE_bit = 1
Cnt1 = 0
While True
Pot = ADC_read(0)
PulseLen = Pot / 100
Wend
end.