I like your experimental approach. I have not attempted to do any probing inside the C40 itself because mine are installed as part of my home solar PV system that is operating every day. I've only decoded the the data stream going to the meter and reverse engineered the circuit in the C40 DVM meter itself to see how it used the data stream to drive the LCD meter. I don't have the firmware for the PIC MCU inside the C40 DVM. I, too, used the technique of sending the data bytes via serial line to a computer where I could analyze and graph the data.
By "first byte" I do mean the 8 bits that follow the bit time where both data lines are high. What I observed is that the value decoded from those bits matches exactly with the voltage value displayed on the C40 DVM when it is divided by 12.867 and rounded to one decimal place to get the real voltage as displayed for a 12V system, or subsequently multiplied by 2 or 4 for a 24V or 48V system. Inverting that value gives a slope of 0.0777, which is close to the 0.0755 that you observed.
In my system, the value of byte 13, which you identified as the battery voltage, varied between +1 and -11 with a mean of about -3 relative to byte 1 during a 9-day recording of the data taken in November. The offset is not constant and the values of byte 1 and byte 13 don't necessarily change at the same time. That is why I am confident that byte 1 is what drives the voltage display on the C40 DVM, at least as configured in my system. I also observed the data output as a serial byte stream with each 23-byte frame on one line while simultaneously observing the LCD display, and I could see that the LCD display changed when byte 1 changed but before the bits of byte 13 reached the meter. Perhaps byte 1 is the temperature-compensated battery voltage, and since you don't have a battery temperature sensor, you don't see meaningful values there. Alternatively, I know that the C40 can be used in several different configurations, so perhaps our configurations are different.
The resolution of byte 6 did not seem lower in the data I recorded, but in the operational system the battery voltages do not vary much. The binary value of byte 6 is about 10 less than byte 13 on average. The value of byte 5, the PV voltage, has the same mean value as byte 6 during the time when the C40 is ON, but close to zero when the C40 is OFF. Here is a graph
showing these voltage byte values over the 9-day recording (v is byte 1; the one unusual g13 value may a bit error):
It is helpful to have confirmation that byte 12 reflects the temperature inside the C40 unit itself. It appears that the temperature causes the frequency of the oscillator controlling the PIC MCU in the C40 to vary, as is expected with a crystal. As I mentioned in post #18, I observed that the time interval between frames varies with an unusual pattern that is different when the C40 is ON or OFF. I also observed that the minimum interval varies proportionately with the byte 12 temperature value as shown in this graph:
The red and blue lines are the amps produced through my two C40s, each covering a portion of the solar panels. You can see the diurnal pattern. The first three days have weather with clouds and cloud bounce peaks. In the later days, I think the points that drop below the curve are when an airplane flies over. The cyan and yellow lines are the voltages in this 48V system. The magenta and green lines indicate the time interval between frames in an arbitrary time scale measure by a timer in my PIC MCU circuit. Note that one C40 runs faster than the other. The areas that look like solid parallelograms are really many data points with a lot of structure that occurs at night. During the daytime the time varies less. However, notice the brown line which represents the byte 12 (transistor temperature) value scaled and offset to fit it to the magenta curve. The correlation is very close, which would be explained by the temperature of the oscillator crystal varying.
By "first byte" I do mean the 8 bits that follow the bit time where both data lines are high. What I observed is that the value decoded from those bits matches exactly with the voltage value displayed on the C40 DVM when it is divided by 12.867 and rounded to one decimal place to get the real voltage as displayed for a 12V system, or subsequently multiplied by 2 or 4 for a 24V or 48V system. Inverting that value gives a slope of 0.0777, which is close to the 0.0755 that you observed.
In my system, the value of byte 13, which you identified as the battery voltage, varied between +1 and -11 with a mean of about -3 relative to byte 1 during a 9-day recording of the data taken in November. The offset is not constant and the values of byte 1 and byte 13 don't necessarily change at the same time. That is why I am confident that byte 1 is what drives the voltage display on the C40 DVM, at least as configured in my system. I also observed the data output as a serial byte stream with each 23-byte frame on one line while simultaneously observing the LCD display, and I could see that the LCD display changed when byte 1 changed but before the bits of byte 13 reached the meter. Perhaps byte 1 is the temperature-compensated battery voltage, and since you don't have a battery temperature sensor, you don't see meaningful values there. Alternatively, I know that the C40 can be used in several different configurations, so perhaps our configurations are different.
The resolution of byte 6 did not seem lower in the data I recorded, but in the operational system the battery voltages do not vary much. The binary value of byte 6 is about 10 less than byte 13 on average. The value of byte 5, the PV voltage, has the same mean value as byte 6 during the time when the C40 is ON, but close to zero when the C40 is OFF. Here is a graph
showing these voltage byte values over the 9-day recording (v is byte 1; the one unusual g13 value may a bit error):
It is helpful to have confirmation that byte 12 reflects the temperature inside the C40 unit itself. It appears that the temperature causes the frequency of the oscillator controlling the PIC MCU in the C40 to vary, as is expected with a crystal. As I mentioned in post #18, I observed that the time interval between frames varies with an unusual pattern that is different when the C40 is ON or OFF. I also observed that the minimum interval varies proportionately with the byte 12 temperature value as shown in this graph:
The red and blue lines are the amps produced through my two C40s, each covering a portion of the solar panels. You can see the diurnal pattern. The first three days have weather with clouds and cloud bounce peaks. In the later days, I think the points that drop below the curve are when an airplane flies over. The cyan and yellow lines are the voltages in this 48V system. The magenta and green lines indicate the time interval between frames in an arbitrary time scale measure by a timer in my PIC MCU circuit. Note that one C40 runs faster than the other. The areas that look like solid parallelograms are really many data points with a lot of structure that occurs at night. During the daytime the time varies less. However, notice the brown line which represents the byte 12 (transistor temperature) value scaled and offset to fit it to the magenta curve. The correlation is very close, which would be explained by the temperature of the oscillator crystal varying.