106 LOG_WARN(logger,
"Already initialized");
120 uint8_t ctrlReg5Value = (fullScale << 3);
125 sensitivity = selectSensitivity();
129 uint8_t ctrlReg4Value =
130 (odr << 4) | (bdu << 3) | (7 << 0);
149 "Unable to perform selftest, sensor not initialized");
154 const uint8_t numSamples = 5;
157 float X_ST[numSamples] = {0};
158 float Y_ST[numSamples] = {0};
159 float Z_ST[numSamples] = {0};
160 float X_NO_ST[numSamples] = {0};
161 float Y_NO_ST[numSamples] = {0};
162 float Z_NO_ST[numSamples] = {0};
164 float AVG_ST[3] = {0};
165 float AVG_NO_ST[3] = {0};
187 for (uint8_t i = 0; i < numSamples; i++)
190 X_ST[i] = accelData.accelerationX;
191 Y_ST[i] = accelData.accelerationY;
192 Z_ST[i] = accelData.accelerationZ;
193 miosix::Thread::sleep(10);
196 ctrlReg5Value &= ~(3 << 1);
206 for (uint8_t i = 0; i < numSamples; i++)
209 X_NO_ST[i] = accelData.accelerationX;
210 Y_NO_ST[i] = accelData.accelerationY;
211 Z_NO_ST[i] = accelData.accelerationZ;
212 miosix::Thread::sleep(10);
219 for (uint8_t i = 0; i < numSamples; i++)
221 AVG_ST[0] += X_ST[i];
222 AVG_ST[1] += Y_ST[i];
223 AVG_ST[2] += Z_ST[i];
224 AVG_NO_ST[0] += X_NO_ST[i];
225 AVG_NO_ST[1] += Y_NO_ST[i];
226 AVG_NO_ST[2] += Z_NO_ST[i];
228 for (uint8_t i = 0; i < 3; i++)
230 AVG_ST[i] /= numSamples;
231 AVG_NO_ST[i] /= numSamples;
237 ctrlReg4Value = (odr << 4) | (bdu << 3) | (7 << 0);
244 ctrlReg5Value = (fullScale << 3);
251 float delta[3] = {0};
252 for (uint8_t i = 0; i < 3; i++)
253 delta[i] = fabs(AVG_NO_ST[i] - AVG_ST[i]);
256 "Selftest: delta[x] = {}, delta[y] = {}, delta[z] = {}",
257 delta[0], delta[1], delta[2]);
262 SELF_TEST_DIFF_X_Y + SELF_TEST_DIFF_X_Y * SELF_TEST_TOLERANCE) ||
264 SELF_TEST_DIFF_X_Y + SELF_TEST_DIFF_X_Y * SELF_TEST_TOLERANCE) ||
266 SELF_TEST_DIFF_Z + SELF_TEST_DIFF_Z * SELF_TEST_TOLERANCE))
268 LOG_ERR(logger,
"Selftest failed");
532 const float sensitivityValues[5] = {0.06, 0.12, 0.18, 0.24, 0.73};