I have done exactly what you describe.
I used 3 opto-isolators. Each opto had a diode in series and another diode across the LEDs so that they can't possibly get reverse-biased.
I used a 15K 1W resistor in series for current limiting. It "looks" only at the positive half-cycles. The output of the phototransistor is close to a square wave, and is - of course, totally isolated. It works fine at both 110V and 230V.
I can give you more details if you are interested in pursuing this approach.
Charles Linquist
Charles, I am *extremely* interested in knowing more about your technique.
The hardware side is somewhat different from yours, but I too end up with a 'somewhat' square wave (half cycles only) at the pic input. And since I am not interested in the absolute values, I guess that difference can stay.
I would however love to know more about the software approach you used.
Thanks and regards,
Anand
This code wasn't interrupt-driven, because it didn't need to be
By changing "PhaseDelay" you can make it work for either 60 or
400 hz, or by using PULSIN, you can make it auto-sensing.
CheckACPhase:
HighTimer = 0
CheckPhaseA:
IF PhaseA = 0 THEN ' Voltage is present or else wouln't be low
WHILE PHASEA = 0:WEND
HighTimer = 0
GOTO CheckPhaseB
ENDIF
Pauseus PhaseDelay
HighTimer = HighTimer + 1
IF HighTimer => 10 THEN GOTO PhaseAError
GOTO CheckPhaseA
PhaseAError: ; No phase A - was never low in 930 uSec period
StatINfo.0 = 0 ; Can't check for proper phasing, so give error
HighTimer = 0
CheckPhaseB:
If PhaseB = 0 THEN
StatInfo.3 = 0 'Erase the error
HighTimer = 0
Goto CheckPhaseC
ENDIF
WaitForLowB:
Pauseus PhaseDelay
IF PhaseB = 0 THEN goto PhaseBError2
HighTimer = HighTimer + 1
IF HighTimer => 10 THEN GOTO PhaseBError1
GOTO WaitForLowB
PhaseBError1: ; No signal
StatINfo.1 = 0 ; Can't check for proper phasing, so give error
HighTimer = 0
GOTO CheckPhaseC
PhaseBError2: ; Signal, but wrong phase
HighTimer = 0
CheckPhaseC:
If PhaseC = 0 THEN
Goto DunPhaseCheck
ENDIF
Pauseus PhaseDelay
HighTimer = HighTimer + 1
IF HighTimer => 10 THEN GOTO PhaseCError
GOTO CheckPhaseC
PhaseCError:
StatInfo.2 = 0
DunPhaseCheck:
IF Statinfo.0 = 0 or StatInfo.1 = 0 OR Statinfo.2 = 0 Then
StatInfo.3 = 1
ENDIF
RETURN
; When returned, Statinfo bit 3 = 0 = OUT OF PHASE
; bit 0 = 0 = PhaseA not present
; bit 1 = 0 = PhaseB not present
; bit 2 = 0 = PhaseC not present
; When any phase is not present, bit 3 is always SET.
Charles Linquist
Wow, Charles, the whole thing on a platter!
Thank you so much. Appreciate your sharing the code.
Regards,
Anand
Bookmarks