Pwm-dac consists of 1 OPA + 1 switch SPDT shown in the lower side of the circuits. OPA is dual AZ precise 2uV from microchip, lowest price for quality I could find. First stage is a buffer for reference voltage, obviously. Second stage is an integrator - to smooth out rectangular pwm signal coming from the switch, max4544. Switch is driven on pin 7 (look at the pics, blue wire) from arduino Mega2560 - Timer 5 -> pin 46 channel a, fast PWM mode 14, Switch pin 1 - ground, pin 2 - output, connected to integrators input, pin 3 - reference voltage (buffered.) Configuration of the second stage is inverting, but it doesn't matter, there is no issue to invert PWM in software. I'm using single power +5V, test doesn't go to 0, there is 2 mVolts minimum voltage from OPA - unloaded.
Linearity equations show gain slightly over 1.0 -> not bad for ordinary 5% resistors (100k). Temperature stability is not tested at all, sure the would be high drift. 4 resistors presumed to be arrays to keep thermal tracking, and certainly some circuitry modification 'd be necessary, right now its in its simplest ever form. Switch thermal Ron runaway is the primary problem I could envision at this point, so I already mention it somewhere.
More updates
Arduino is very cool, I can do a testing with one click a button. Curiosity gets me to modify a circuit, instead of max4544 -precise, low leak, break-make, low injection bla-bla-bla, I put sn74hc4066. It tooks some efforts to modify a software, since chip is 4x spst, and to make a spdt out of two spst I need two pwm driver with safe time guard interval. AtMega doesn't have such feature internally, so have to program two phase offset-ed timers.
Results:
Linear: y = 1.000782 * x -249778.296875
Linear: y = 1.000425 * x -247027.531250
bin_C uVolt 5717a error er_uV pwmD error er_uV
16384 128000 -233389 -7 -54 -230655 -18 -140
32768 256000 -216990 -5 -39 -214261 -15 -117
49152 384000 -200591 -3 -23 -197866 -11 -85
65536 512000 -184193 -1 -7 -181473 -9 -70
81920 640000 -167794 +0 +0 -165077 -4 -31
98304 768000 -151396 +1 +7 -148684 -2 -15
114688 896000 -134998 +2 +15 -132287 +3 +23
131072 1024000 -118600 +3 +23 -115894 +5 +39
147456 1152000 -102203 +3 +23 -99503 +5 +39
163840 1280000 -85805 +5 +39 -83109 +8 +62
180224 1408000 -69407 +6 +46 -66714 +13 +101
196608 1536000 -53009 +7 +54 -50320 +16 +125
212992 1664000 -36613 +6 +46 -33928 +17 +132
229376 1792000 -20218 +4 +31 -17537 +17 +132
245760 1920000 -3822 +4 +31 -1145 +18 +140
262144 2048000 +12574 +3 +23 +15245 +17 +132
278528 2176000 +28969 +1 +7 +31633 +14 +109
294912 2304000 +45364 +0 +0 +48020 +10 +78
311296 2432000 +61761 +0 +0 +64412 +11 +85
327680 2560000 +78157 -1 -7 +80802 +10 +78
344064 2688000 +94553 -1 -7 +97193 +10 +78
360448 2816000 +110949 -2 -15 +113579 +5 +39
376832 2944000 +127345 -3 -23 +129968 +3 +23
393216 3072000 +143741 -4 -31 +146355 +0 +0
409600 3200000 +160139 -3 -23 +162737 -9 -70
425984 3328000 +176536 -2 -15 +179128 -9 -70
442368 3456000 +192936 +0 +0 +195514 -14 -109
458752 3584000 +209331 -1 -7 +211903 -16 -125
475136 3712000 +225728 -1 -7 +228292 -18 -140
491520 3840000 +242126 +0 +0 +244674 -27 -210
507904 3968000 +258523 +0 +0 +261058 -34 -265
Its talks for itself, polynomial second degree - two column on the right side, error in 19-bits count and error in micro-volt. Not too bad, about 15-bits linearity, but now we know that switches are not the same. MAX4544, probably can do better than 18-bits, at this time I can't be sure that my ADC is not the one who is not linear.