well, it's kind of like the first (and only important) lesson about drugs i learned over 40 years ago ... know your chemist.
meanwhile, after a full day of PID diddling, i found a brain-dead program bug (using the wrong variable to stuff the dutycycle value), and after rereading the wiki article on PIDs, i tried a different approach and ... OMFG!!!!
i had assumed that the dutycycle value should be some more or less fixed value that would be adjusted: if the measured temperature is above SETPOINT reduce it, or if below SETPOINT increase it.
After 6 hours of testing every adjustment of PID gains i could think of, i couldn't kill the oscillations. i could reduce it, and see moments of stability, but not the real thing.
So then i tried something different: now i calculate a dutycycle value when below SETPOINT, and then adjust that value when above SETPOINT. And the result for somewhat arbitrary gain values: almost immediate settling to a value that is fixed. OMFG!!! what a win. NOW, i can adjust the gain values to fix a minor offset from SETPOINT.
And what felt like a wasted day has turned into a successful effort. Whew!
Now i just need to figure out how to bring the thermometer probe leads outside the body, and make a bunch of units.
============
Ignore all that ... just more Dickie blather ... after having some food, it occurred to me that if the COILTEMP is at SETPOINT, the dutycycle would be set to ZERO (since the calculated PID control value is a function of the SETPOINT error), which is clearly wrong. So, as a test, i just set the dutycycle to a fixed value (1/4 of full value), and the same stability is observed. WTF?
So it was a wasted day, somewhat.