Нужен совет в интерпртации данных акселерометра LSM303DLHC

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Родился
Сообщения: 13
Зарегистрирован: Вс июл 03, 2016 17:16:23

Сообщение DDenisov »

Написал программу для платы STM32F3Discovery, данные от LSM303DLHC принимает из регистров для оси Z: OUT_Z_L_A (2Ch) и OUT_Z_H_A (2Dh). Только одна ось для простоты. Не понятно то, что это за данные.

Настройки делаются в контрольных регистрах акселерометра CTRL_REG1_A (20h) , CTRL_REG4_A (23h) и они такие:
CTRL_REG1_A = 0x24
CTRL_REG4_A = 0x48

При этом имеем:
Measurement Range = [-2;+2]g (дефолтовое FS=0)
Linear axeleration sensitivity 1 mg/LSB (один бит равен 1mg, то есть когда плата на столе по Z д.б. 1000 mg по модулю)
Выставлен режим High Resolution

В регистрах акселерометра получаю такие данные (two's complements):
Плата диодами вверх: MSB=3С LSB=F0. Здесь я ожидал 1000 mg = 1g, но это почему-то не так.
Плата диодами вниз: MSB=BF LSB=F0.

Попробовал отключить High Resolution. pData получилось: FFE0 (диодами вверх), 7FE0 (перевернута), BFE0 (плата на боку - тут должно быть 0 по Z).

Код: Выделить всё

	// Get MSB first (BLE=1).
	while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
	buffer[0] = I2C1->RXDR;
	// Get LSB.
	while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
	buffer[1] |= I2C1->RXDR;
	pnRawDataZ = ((int16_t)((uint16_t)buffer[0] << 8) + buffer[1]);
	pData =(pnRawDataZ * sensitivity);
pData должно быть 1000 mg. Но оно 15344 или -16912 если перевернуть плату.

Даташит тут: http://www.st.com/resource/en/datasheet/lsm303dlhc.pdf.
Реклама
Ответить

Вернуться в «Теория»