Just a quick update. I wrote a program that let me visually map the apparent brightness of the LED vs its PWM value. Sure enough, the eye is logarithmic, so the PWM needs to be exponential. I was able to determine about 85 apparent brightness levels from the 12-bit (4096 level) PWM. I made a lookup table so I don't have to mess with equations.
const unsigned int PWMTable[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13,
16, 19, 23, 26, 29, 32, 35, 39, 43, 47, 51, 55, 60, 66,
71, 77, 84, 91, 98, 106, 114, 123, 133, 143, 154, 166,
179, 192, 207, 222, 239, 257, 276, 296, 317, 341, 366,
392, 421, 451, 483, 518, 555, 595, 638, 684, 732, 784,
840, 900, 964, 1032, 1105, 1184, 1267, 1357, 1453, 1555,
1665, 1782, 1907, 2042, 2185, 2339, 2503, 2679, 2867, 3069,
3284, 3514, 3761, 4024, 4096};