Two things:
1. I don't know why the R||C (R5, C2) compensation network is so popular. Many appnotes give it. It's easier to compensate I suppose, but the thing is it kills the regulation of what is otherwise a very fine error amp. R+C is better, with 1n+100k being a typical starting value, and you can go from there, testing step response while adjusting values for best response.
Doubtful this is an issue with the immediate concern -- even with the poorer regulation, the fact that both parameters relate to output current anyway (i.e., the error amp's primary input, LED current; and its output, peak switch current), and the fact that visual response to LED power tracks slowly (i.e. somewhere between inverse gamma correction, to logarithmic; that is to say, even if the LED power is varying slightly with operating condition (supply voltage, temperature, etc.), you'll probably never perceive it). I bring it up as a matter of best practice -- you never seem to see R||C compensation on newer regulators or controllers, just old ones like this (and TL494, but that has even more bugs in its appnotes
).
2. The UC3843 has a minimum output pulse width, below which it must remain in cutoff (pulse skipping). The time between pulses is determined by load and the error amp response rate (in turn, compensation). For very small outputs, you may find it always flashes visibly; and you may find that the level is nearly impossible to adjust down there, anyway. The input signal is within a few mV of the 0.25V maximum input, on the same order as the op-amp offset and other errors. Drift of internal VREF, and resistor values, also contributes.
Note it's not enough to simply increase the compensation time constant. That will simply increase the number of pulses skipped, and perhaps increase the number of active pulses as well. Technically, what's happening is, the loop gain increases suddenly: there's a deadband between zero and minimum pulse width, so the gain over that band is extremely high (or even hysteretic). The suddenly high gain pushes control loop pole(s) into the right half-plane, which is to say, it oscillates. And this is true regardless of compensation R and C; the gain is too high for the error amp to compensate for. Finally, the output is only pulsed in sync with the (free running) oscillator, so we say it is pulse skipping: the pulses will always be coherent with the oscillator.
This is coincidentally the regime where visual response hurts, rather than helps -- if the ambient lighting is low, the sudden step from "off" to "barely on" will be very significant, and the flashing particularly irritating (or worse, if one is photosensitive!). If ambient is high, the step might not be so noticeable, but the flashing will still be objectionable.
So, two more things:
1. We can't fix the control loop any further, that's a limitation of the device itself, or more generally even, the topology. But we can at least make it more consistent. As it is, I think you'll find it suffers from a variety of sources of drift.
It may help to make the input larger. Presumably, ADJ is not very accurate at low voltages. We might use the sense amp on just the shunt resistor by itself, and move the input (with R12) to the VFB pin instead. Now ADJ is 0...5V. Or even more specifically, 0...VREF. We can use a pot or DAC referenced to VREF, so that its output is ratiometric.
Something more precise than LM358 should be chosen; OPA171 for example. A lower voltage, precision amp could also be chosen, supplied from VREF. Which might be cheaper, dunno.
Or it might be supplied from whatever the control circuit is powered by. Which, if you have 5V available over there, there may be a lower voltage controller (LT probably has something) that the 3843 could be replaced by.
Or if that stuff is under design consideration as well, perhaps it could be reworked for multiple supply outputs, including the 9-12V the 3843 needs, and 5V for peripherals including this analog stuff, or etc.
(A note about topology: the topology itself, is not
quite prone to this being a problem -- it is continuous in output pulse width, though not linear in it. For very short pulses, the transistor won't fully saturate, and the inductor won't develop enough current to swing sharply up to the output voltage. It looks more like plucking a resonant tank, and clipping the peak off the top with the rectifier diode. Continuous, but not linear -- say we suddenly reduce pulse width, so that output voltage remains momentarily high, and now the transistor is in this "plucking" regime. The peak voltage is given by Vpk ~= Vin + sqrt(L/C) * Ipk, where L is the switching inductor and C is the switch node capacitance -- largely MOSFET Coss and diode Cjo. At low enough "plucking" current, the peak simply won't reach the output at all, thus output power depends on output voltage in a piecewise manner, as well as a nonlinear manner with respect to pulse width. Anyway, these are pulse widths of say ~10ns, nothing a 3843 can create, and not even anything most controllers or regulators can do.)
2. We can't fix the control loop, but we can fix the LEDs. At low throttle, we might set the 3843 to a nominal output voltage (possible thanks to the open-circuit protection network), and connect a CCS in series with the LEDs. We either drive this with a second DAC channel (if applicable), or arrange a clever transfer function to the ADJ input as-is. Probably the latter will do. Anyway, this allows the output voltage to rise, and to fluctuate -- we don't care anymore, because the LED current is set by the CCS. At higher throttle, we make the CCS turn on faster than the controller does, therefore it remains saturated, dissipates little power, and the 3843 is in control.
This is probably the best solution, needing few extra parts, and potentially no op-amps (the required function can be built in, I think <= 4 BJTs).
Tim