As for the darn overdrive, I'm thinking of getting one of these two universal lvds driver boards and kicking the Acer signal board out of the monitor completely. I figure these will either not do overdrive (since it can be panel-specific I imagine), or have some control over it.
If you have control over strobe timing -- then you actually want to strobe a little bit late; e.g. turn on after the vertical blanking interval already started, and turn off after the vertical blanking interval already ended.
Hah, that's almost what I arrived at empirically, 400us delay after the PWM pulse at the beginning of the frame.
That is quite convenient; so it's simply modding the PWM to do one pulse per refresh. Your next challenge is to try to shift the phasing of the PWM pulses; see if you can make the first PWM pulse overlap the end of the blanking interval
I've gotten this. The challenge was to write the code without interrupts, which I've achieved. It's all software-based bit-banging right now, so trivial to move to different AVR chips. The backlight pulse can start at any offset and be any duration, without affecting the code's detection of the next frame's PWM pulses. I'm pleased now.
I downloaded some 60fps game trailers and they are absolutely gorgeous. I even did an experiment with a 30Hz strobe. Yes, this was torture to look at, and I can say for sure that I don't have any photosensitivity or epilepsy risk. I was surprised how smooth 30fps YouTube videos looked, especially ones of sports events with a short shutter. Motion looked very fluid, and nothing lost its detail as my eyes followed it. I always thought that 30fps was inherently blurry and not smooth. It was mostly the double-strobe one got on a CRT that guaranteed it no matter the camera's shutter speed.
Is there a way to have the electronics let you do it easily, perhaps via inserting an adjustable trigger delay circuit?
These configure the strobe pulse time offset from VBL, and duration range, in microseconds:
- Code: Select all
pulse_offset = CLOCK_US( 400 ),
pulse_min = CLOCK_US( 1000 ),
pulse_max = CLOCK_US( 5000 ),
The code effectively runs three concurrent tasks: measure each PWM cycle's duty (to read OSD brightness and adjust pulse width), notice the abnormal cycle that signals vsync begin and schedule the next strobe almost a frame from now, and turn the strobe on/off at the previously-set time.
BTW, 1ms strobe length is not even the final frontier! At 3000 pixels/second, I am able to visually tell apart 0.5ms and 1.0ms which is rather impressive.
Interesting! I have mildly considered upping the LED driver current, as they can be pulsed at twice the normal current if the duty cycle is less than something like 20%. 1ms is a decent brightness, and 0.5ms is acceptable though dim (I fortunately prefer my monitors fairly dim so can enjoy a shorter strobe duration).
EDIT: An album of more images of the hardware setup and the signal timing.