With my custom MCP4922 PCB assembled, it is time to test it. Soldering is good and fine fun, but the whole point is to get something that actually works!
Connecting to Arduino: My plan is to connect it to an Arduino and to have it generate a variety of DC voltages. Unfortunately, it was at this point that I realized I had no female wires to mate to the male headers that I put on my board. Doh! So, I had to use alligator clips which are a real pain to work with. As you can see in the picture above, it is difficult to keep them from touching each other and shorting everything out.
Jumper Some Pins: Another hiccup is that, as I was hooking it all up to to the Arduino, I realized that I designed my PCB to be overly-general. Specifically, I when I designed the board, I brought out two of the MCP4922 pins (*SHDN and *LDAC) to the header when I really didn't need to. For the way that I use this chip, I just need *LDAC tied LOW and *SHDN tied HIGH. Doing this with alligator clips is annoying, so I just soldered short jumper wires on the bottom of the board to connect these pins to GND and VDD. This simplified my setup nice.
Arduino Software: With the hardware all hooked up, I wrote a little Arduino program to drive the DAC. You can get the code here. The code outputs two different voltages on the A and B outputs of the DAC to prove that they work. Output A steps from 0.0V up to 5.0V in one volt increments. Output B does the opposite -- it steps from 5.0V down to 0.0V in one volt increments.
Victory: Starting up the program, it automatically stepped through its commands for the different voltages. I measured the voltages with my digital multi-meter (DMM) to confirm that I was getting the correct output. As you can see in the pictures below, Output A of the DAC does a pretty good job of hitting the voltages that I wanted. My first PCB works! Victory!
Exploring the Error: Because I'm a nerdy guy, I couldn't leave it there. I couldn't just enjoy my victory in peace. No. I had to look at the results in more detail. Specifically, I was troubled by the fact that the values reported by the DMM were not quite as close to my desired values as I hoped.
Should be Better?: I hoped to see exact round numbers spanning 0.0 up to 5.0V. As you can see in the pictures above, my DMM is reporting values that are off by 1-15 mV. That seems like a lot of error for a 12-bit DAC. I mean, on the surface, one might expect an accuracy from the DAC of approximately 1 least significant bit (LSB). One can compute the magnitude of 1 LSB by scaling from the "full scale" voltage of the device. Since I'm running it at 5.0V, 1 LSB is (5.0 V / 2^12 bits) = (5.0 / 4096) = 1.2 mV. This is quite a bit smaller than the 15 mV of error that I'm seeing in some cases. My gut feeling is that I should be doing better. So, I started to dig into the details...
Error in Full Scale: First, note that my DMM shows that the "5.0V" case is actually indicating 5.015V. This suggests that my "full scale" is actually bigger than 5.0V -- that it is actualy 5.015 V. In my setup, "full scale" is set by the voltage of the power being delivered to the PCB, which is coming from the Arduino. The Arduino (Uno) is nominally outputs 5.0V, but it is not a precision voltage reference. For example, the on-board regulator is only good to +/-50 mV and others have also seen their Arduino "5.0V" be off by 12-14 mV. So I do not find it surprising that full scale voltage could be running 15 mV higher than expected. If you want a precise "full scale", you probably have to build/buy a precision voltage reference instead of using the Arduino's 5V pin.
New Expected Values: What does the 5.015V "full scale" value mean for my expectations for the DAC output? Well, since all of the DAC's output values are scaled from this full scale value, the output values that I should actually expect to see are 0.000V, 1.003V, 2.006V, 3.009V, 4.012V, and 5.015V. These values are closer to the ones that I actually saw, which is good. My measured values are now only off by 0-6 mV (the worst error is for the 2 V reading). Still, 6 mV is larger than the 1.2 mV error that I might expect based on 1 LSB, so I'm still not satisfied.
DAC Error from Datasheet: My next idea is that maybe my expectation of 1 LSB accuracy is wrong. Digging into the datasheet for the MCP4922, I see in the big table on page 5 under "DC Accuracy" that the INL error can be +/- 4 LSB (!). If 1 LSB is 1.2 mV, then a 4 LSB error would correspond to 4.8 mV. That's a lot closer to the 6 mV error that I seem to have...but it's still doesn't account for all of it.
Error in DMM: My next idea is that maybe the error isn't all with the DAC. Maybe some of the error is in my DMM. Looking at the user manual for my Extech EX530 digital multi-meter, it states that the device has an accuracy of "+/- (0.06% reading + 2 digits)". Let's compute what that means for my problematic 2V reading. First, at 2V, 0.06% is 1.2 mV. Second, "2 digits" means 2x the value of the smallest digit on the display. For the 2V reading, the smallest digit is 0.1 mV, so "2 digits" is an error of 0.2 mV. As a result, the total error for my DMM could be +/- 1.4 mV.
Total Error: Combining this 1.4 mV of possible error for the DMM with the 4.8 mV of possible error for the DAC, I get a total error of up to 6 mV. This happens to be the same amount of error that I actually saw. While that's good (I guess), it is also unsatisfying because it requires all of my errors to be at their maximum. For now, I'm going to accept that. But, moving forward, I'm going to keep an eye on how closely my DAC's values are to my desired values.
Thanks for reading!
[Note: The comment section of this post is closed due to too much spam from PCB services.]