2017-11-13 02:16 AM
Hello,
I recently bought two Pololu IMU03a systems, and both of them gives me negative self test (both accel and gyro). To communication I use I2c protocol. During the test the device is stationaryCalibration:
Rej. 0x10h => Value: 0x30h;
Rej. 0x11h => Value: 0x5Ch;
Rej. 0x12h => Value: 0x44h;
Rej. 0x13h => Value: 0x00h;
Rej. 0x14h => Value: 0x00h;
Rej. 0x15h => Value: 0x00h;
Rej. 0x16h => Value: 0x00h;
Rej. 0x17h => Value: 0x00h;
Rej. 0x18h => Value: 0x38h;
Rej. 0x19h => Value: 0x38h;
After calibration i wait 200ms for stable output, then i erase first five values (by reading registers from 0x22h to 0x2Dh).
Then I read these five registers, I combine them (0x22h with 0x23h ...) and average them in each axis (OUT_NOST).
Then I write 0x01h into registry 0x14h to enable self-test, wait for about 200ms, and discarded next five values (from registers from 0x22h to 0x2Dh).
Then I read five times values for each axis (OUT_ST), calculate average those values, and find min and max value for each axis.
For each axis I make a compare as below:
abs(min_ST_x)<=abs(OUTX_ST - OUTX_NOSTD)<=abs(max_ST_x)
Values I recive:
XGyro without self test [8, 14, 6, 9, 7], with self test [ 2994, 4491, 4499, 4492, 4494]
YGyro without self test [-66, -74, -66, -62, -73], with self test [ 2649, 4020, 4020, 4014, 4
015
]ZGyro without self test [-1, -1
,
-1, -1
, -1
], with self test [ 3207, 4848, 4843, 4845, 4845]XAkcel without self test [575, 505, 455, 502, 564], with self test [ 8114, 7962, 8036, 8056, 8098]
YAkcel without self test [434, 445, 529, 480, 449], with self test [ 9674, 9734, 9681, 9732, 9668]
ZAkcel without self test [
-16131,
-16276,
-16273,
-16260,
-16154]
, with self test [-10374
,-10543
,-10510
,-10446
,-10412
]Am I doing something wrong, or should I return those IMU's ??
Thanks for any answer or clue
2017-11-13 08:50 AM
Hello Maciek,
I suggest trying to split the accelero and gyro self-tests instead of measuring them at the same time. Also I'd suggest to make the register settings exactly as defined in
, that's mandatory for correct self-test. See if it helps.You can also download the
SW package where you can find similar SelfTest example. This package supports a few Nucleo and MEMS Shield boards but if you don't have them you can still at least inspire yourself by the open source code.Best regards,
Petr
2017-11-13 11:39 PM
Hi,
thank you for your response, I tried your approach as in/external-link.jspa?url=http%3A%2F%2Fwww.st.com%2Fcontent%2Fccc%2Fresource%2Ftechnical%2Fdocument%2Fapplication_note%2F9c%2Fd9%2F07%2Fd0%2Fd4%2Fa9%2F45%2F00%2FDM001759pdf%2Ffiles%2FDM001759pdf%2Fjcr%3Acontent%2Ftranslations%2Fen.DM001759pdf
p.77, Values I get are approximately the same, and both akcel and gyro self test fail. I think I need to send back those devices. Why does this issue happened, the device is brand new (yesterday I've unpack it). Is there a possibility that device get broken during transport? Is those devices so fragile?2017-11-14 01:33 AM
Hi Maciek,
I've made a quick calculation for X axis of acc and gyro and the self-tests passed.
For linear acceleration (example of X axis):
Linear acceleration sensitivity for FS = ±2 is 0.061 mg/LSBAverage of 575, 505, 455, 502, 564 is approx. 520 LSBAverage of 8114, 7962, 8036, 8056, 8098 is approx. 8053 LSB8053 - 520 = 7533 LSB * 0.061 mg/LSB = ~460 mgUse these self-test limits:90 <= 460 <= 1700 mg => passedFor angular rate (example of X axis):
Angular rate sensitivity for FS = ±2000 is 70 mdps/LSBAverage of 8, 14, 6, 9, 7 is approx. 9 LSBAverage of 2994, 4491, 4499, 4492, 4494 is approx. 4194 LSB4194 - 9 = 4185 LSB * 70 mdps/LSB = ~293 dpsUse these
self-test limits
:
150 <= 293 <= 700 dps => passedYou can calculate remaining axes but I believe it will pass too so I wouldn't return the devices.
Best regards,
Petr2017-11-14 04:11 AM
Hi,
thank you very much for your response. In AN4682 there is for XAxis:
| Min (ST_X) | <= | OUTX_ST-OUTX_NOST | <= | Max (ST_X) |.Could you tell me how do you have calculate this line:90 <= 460 <= 1700 mg => passedI've trouble, I do not know how 90 value is calculated.In my opinion it should be 7962 LSB * 0.061 mg / LSB ~ = 486mg (min value during test condition)
2017-11-14 04:31 AM
Now I finally understood what was the issue here. To explain it, the Min and Max values in
| Min (ST_X) | <= | OUTX_ST-OUTX_NOST | <= | Max (ST_X) | formula
are actually the self-test limits given by ST. So you can rewrite your formulas as follows:For linear acceleration:
90 mg <= | OUTX_ST [mg] - OUTX_NOST [mg] | <= 1700 mg
90 mg <= | OUTY_ST [mg] - OUTY_NOST [mg] | <= 1700 mg
90 mg <= | OUTZ_ST [mg] - OUTZ_NOST [mg] | <= 1700 mg
For angular rate:
150 dps
<= | OUTX_ST [dps] - OUTX_NOST
[dps] | <=
700 dps
150
dps<= | OUTY_ST [dps] - OUTY_NOST
[dps] | <=
700 dps
150
dps<= | OUTZ_ST [dps] - OUTZ_NOST
[dps] | <=
700 dps
If your calculated values fit into the interval, the device is ok.
Best regards,
Petr
2017-11-14 04:53 AM
And one last question where can I find those limits, are they depend for scale which I use, or are they constant??
2017-11-14 06:18 AM
At this moment you cannot find it anywhere, just use what I gave you, please. It's FS dependent so you have to strictly follow the procedure from application note.