Tooling around on the Internet looking for an alternative to my current sense circuit, I came across a module from China based on the TI ADS1115 16-bit analog to digital converter. I had already considered getting a high resolution external A/D because the Arduino only has a 10-bit A/D. When I started reading about the ADS1115, I found I also shouldn't need an op-amp. I should be able to wire the current sense resister directly to the A/D because it has a programmable gain of up to 16x. I ran some calculations and this is looking pretty good.
I would like to be able to monitor current to/from the battery at -1 to +20 amps, with -1 being 12 watts of draw, and +20 being 20 amps of charging at whatever voltage. The A/D has a built-in 4.096 reference voltage, and the programmable gain divides this voltage by powers of 2. So a gain of 1 means the input measure -4.096 volts to +4.096 volts. At 16-bits this means -4.096 volts is -32768, and +4.096 is +32768. A gain of 16 means ±4.096 / 16 = ±0.256 volt range.
What this allows me to do is change the gain as needed. The solar panel output won't jump around too quickly, and even if it does I over sample fast enough I can take care of any saturation by ignoring it until the correct gain is setup. With that in mind, I can use a 0.1 ohm shunt resister and measure the voltage directly across that. With a gain of 16, I can measure up to 2.56 amps, and theoretically down to 78 μA. With a gain of 1, I can measure up to 40.96 amps, and down to 1.25 mA. In reality the bottom end is going to have noise of probably 2 bits. So those low ends are closer to 312.5 μA with a gain of 16, and 5 mA with a gain of 1. That is plenty of resolution.