I got derailed a bit with some other stuff, but I finally got around to doing some debugging. I desoldered the digipot and tied a 10k resistor to set the "wiper" in min and max configurations.
For the min duty cycle, I get a high pulse of 50us with a total cycle period of 910 us. This gives me approximately a 5.47% duty cycle, which is very close to what I was expecting. If I tie RW to RL with the resistor, I get almost 100% duty cycle, also as expected. Also if I redo the frequency calculation for low duty cycle accounting for a 5k Ohm resistance in series with R_A, I get a minimum duty cycle in the vicinity of, like, 32% or something. Which is what I was seeing from the digipot.
So bottom line, looks like the unusually high wiper resistance was screwing things up. But even if there was no wiper resistance, the circuit's maximum range wouldn't work for me, because I'd like the ability to turn the backlight off and 5.47% duty cycle is still pretty bright.
For complete-ness, if one were to continue down this path of making a custom hardware circuit to generate a PWM signal, here are some interesting things I found:
1. This alternative digipot:
https://www.digikey.com/en/products/detail/microchip-technology/MCP4561T-103E-MS/2061346The part number I quoted above supposedly has all the same features as the DS3502 I was using, but instead of 127 steps, it has 257, which I suppose is a good thing here. Who wouldn't want twice the resolution? More importantly, the datasheet claims that this part only has 75 ohms wiper resistance, which I am assuming will make a big difference in duty cycle range.
2. Negative Resistance
From this question:
https://electronics.stackexchange.com/questions/159212/very-low-wiper-resistance-digital-pots-anyone-know-of-any, apparently you could compensate for the large wiper resistance by constructing another circuit using an op amp that effectively acts as a negative resistance.
https://www.electronicdesign.com/technologies/components/article/21758411/negative-resistance-nulls-potentiometers-wiper-resistance <-- this is an article linked by the answer that provides more information. Adimittedly, it sounds like more trouble than it's worth. But in another application where the digipot was an indispensable part of the design, I can see this being a life-saver.
I'm thinking the 555-timer route is the wrong route for my application unless I were willing to implement 1 + 2. There are other ways of generating a PWM signal:
3. For the curious, how
do microcontrollers generate a PWM signal?
https://www.allaboutcircuits.com/technical-articles/introduction-to-microcontroller-timers-pwm-timers/Essentially, you generate a discretized sawtooth, or use a counter to increment values and wrap around when the period is over. Then using a comparator, generate a signal that goes high when the sawtooth/counter is below the comparator value, and goes low otherwise.
4. Just use a microcontroller.
Maybe something in the ATtiny family would let me stick it to the back of an LCD screen without sacrificing too much physical space. I could select the ATtiny24 or ATtiny25 to get both PWM output and I2C handling in one package.