I solved it!
Summarising the problem:
The product specifications for the 6000/6050 lead us to believe that the accelerometer output is a 16 bit signed integer, i.e. it ranges from -32768 <–> 32768. Furthermore, for a full scale range of -2g <-> 2g, we get a LSB/g sensitivity of 32768 / 2 = 16384 LSB/g, hence an acceleration of 1g should output +16384. However, many users are experiencing problems with an acceleration of 1g outputting +8192, exactly half of what it should be. This behaviour is replicated for other full scale ranges (+/-4g, +/-8g, +/-16g), but we do not seem to encounter this error with the gyroscope (although it is hard to verify directly as I have not strapped the MPU to a motor or anything!).
I knew the problem must lie with the datasheet so I started by reading the 6000/6050 Register Map and Descriptions document, version 4.2, and noticed an entry in the Revision History table:
10/07/2011 3.0 Updates for Rev D silicon:
Updated accelerometer sensitivity specifications (sections 4.6, 4.8, 4.10, 4.23)
This indicates that they changed the sensitivity specifications for revision D of the board.
In the product specification for the chip, version 3.4, they have a diagram explaining the codes written on the chip. There is a letter in the bottom right labelled “Rev Code”. On my chip, it is a “C” so I take this to mean Rev C (see attached photo). Hence this version applies to a newer version of the board than mine (which I brought cheaply off Ebay).
Furthermore I also noticed an update in the main 6000/6050 Product Specification Revision History table:
For Rev D parts. Updated accelerometer specifications in Table 6.2. Updated
accelerometer specification note (sections 8.2, 8.3, & 8.4). Updated qualification
test plan (section 12.2).
So it is probably safe to conclude that, since this table lists all the LSB/g sensitivity measurements and was updated from Rev C to Rev D, it most likely had the values we would expect (namely 8192LSB/g, 4096LSB/g, 2048LSB/g, 1024LSB/g) in the older versions (Revsision < 3.0), rather than the ones we see in Revision 3.4 of the specification (namely 16384LSB/g, 8192LSB/g, 4096LSB/g, 2048LSB/g).
I was going to leave it here, content that they had changed the accelerometer between the revisions of the chip, and I had an older version.
But to prove my theory I wanted to find an old version of the datasheet.
After much digging, I discovered datasheetarchive.org, where I managed to find an old version of the Product Specification that shows the crucial Table 6.2, before the update to chip Rev D. This was Product Specification Revision 2.0, published 05/19/2011.
And lo and behold: the table was exactly as we would predict! That is to say that all the accelerometer sensitivities were halved in this older revision of the specification.
Curiously, the two’s complement ADC word length was still defined to be 16 bit. I found this confusing as that would mean that in full scale range of -2g <–> 2g, with the sensitivity of 8192LSB/g, the range maximum would be reached at an output of 16384, representing an acceleration of 2g. But what would this mean for outputs above 16384? Are they undefined? Well from experimenting with the chip I think that the continue to represent larger accelerations. I.e. I reckon that if you could get the chip to output 32768, this would represent an acceleration of 4g. Confusing!
Finally, one more thing I found was that the initial calibration tolerance for zero-g output under the z axis is given as +/- 200mg in the table under this older specification, whereas it is +/- 80mg in the newer specification. This indicates to me that it was not an MPU encoding change between revisions, but an actual change of the accelerometer, since the tolerance has changed. I have not thought about this too much as it isn’t too important to me, but may interest someone!
Older Revision 2.0 of the datasheet that applies to Rev C of the MPU6050