Ha ha! You're right that it's complicated - sadly, using 100 resistors and capacitors at 1/10th of 1 cent is still cheaper than a 12 cent IC so a lot of these low-end devices are heavy on the discrete components. Thanks for the ideas on the MPU-controlled output stage. I'd love to see a block diagram if you don't mind drawing something up!
On to the samlex circuit. It's always interesting to see how people make their sine wave - most popular these days is storing the digitized wave in ROM and churning it out to a DAC. But these guys used a couple of op-amp low-pass filters to filter down a 60hz clock (from a 30.7kHz crystal, and binary counter) to a pseudo-sine. It's not perfect, but it seems to work pretty well.
So here's the filter. They use two (basically) identical stages for shaping. First one gets a 0-5v square wave and shapes it a bit, then passes to a second stage for a little fine-tuning.
Next, they pass it through a 2.2uF cap and on to the error amp to compare the reference sine with a divided down portion of the output from AC hot. Any small difference between reference sine and output is amplified, and this error signal that I call "COMP" (short for COMPENSATION) is passed to the PWM circuit. The error signal is limited by a couple of bjt transistors - if it gets too big, these bjt's overdrive the input to bring it back. Kind of a crude limiter to keep the output stage from driving itself to death in a short circuit.
The PWM comparator can be modelled as a current source, which is what I've done in this next schematic to close the loop. The output of COMP tells the PWM stage how much current to give the output, and the 110k/100k/13k resistor divider provides feedback to the error amp. Never saw this kind of error amp and compensation network before, but these guys are old school so who knows what topology they learned back in the stone age. Hehe!
And finally, here's the PSPICE simulation of the whole loop. I start with a 60Hz square wave which is filtered down to pseudo-sine and fed to the error amp. Then my fake output stage gives whatever current (up to 5A) is requested by the error amp. Lo and behold - the loop works when closed! You can see the two stages of filtering and the final output of 169v (120v RMS). As long as the output stage can give the requested current, this little guy will faithfully track the reference.
Crude, but effective.