Урок 39
Подключаем акселерометр LSM303DLHC
Часть 4
В предыдущей части нашего урока мы закончили наконец-то полностью инициализацию акселерометра.
Теперь наконец-то самое интересное – снятие показаний с датчика. Для этого мы сначала напишем следующую функцию:
//—————————————
void Accel_GetXYZ(int16_t* pData)
{
int16_t pnRawData[3];
uint8_t ctrlx[2]={0,0};
int8_t buffer[6];
uint8_t i = 0;
uint8_t sensitivity = LSM303DLHC_ACC_SENSITIVITY_2G;
/* Read the acceleration control register content */
ctrlx[0] = Accel_IO_Read(0x32, LSM303DLHC_CTRL_REG4_A);
ctrlx[1] = Accel_IO_Read(0x32, LSM303DLHC_CTRL_REG5_A);
/* Read output register X, Y & Z acceleration */
buffer[0] = Accel_IO_Read(0x32, LSM303DLHC_OUT_X_L_A);
buffer[1] = Accel_IO_Read(0x32, LSM303DLHC_OUT_X_H_A);
buffer[2] = Accel_IO_Read(0x32, LSM303DLHC_OUT_Y_L_A);
buffer[3] = Accel_IO_Read(0x32, LSM303DLHC_OUT_Y_H_A);
buffer[4] = Accel_IO_Read(0x32, LSM303DLHC_OUT_Z_L_A);
buffer[5] = Accel_IO_Read(0x32, LSM303DLHC_OUT_Z_H_A);
/* Check in the control register4 the data alignment*/
if(!(ctrlx[0] & LSM303DLHC_BLE_MSB))
{
for(i=0; i<3; i++)
{
pnRawData[i]=((int16_t)((uint16_t)buffer[2*i+1] << 8) + buffer[2*i]);
}
}
else /* Big Endian Mode */
{
for(i=0; i<3; i++)
{
pnRawData[i]=((int16_t)((uint16_t)buffer[2*i] << 8) + buffer[2*i+1]);
}
}
/* Normal mode */
/* Switch the sensitivity value set in the CRTL4 */
switch(ctrlx[0] & LSM303DLHC_FULLSCALE_16G)
{
case LSM303DLHC_FULLSCALE_2G:
sensitivity = LSM303DLHC_ACC_SENSITIVITY_2G;
break;
case LSM303DLHC_FULLSCALE_4G:
sensitivity = LSM303DLHC_ACC_SENSITIVITY_4G;
break;
case LSM303DLHC_FULLSCALE_8G:
sensitivity = LSM303DLHC_ACC_SENSITIVITY_8G;
break;
case LSM303DLHC_FULLSCALE_16G:
sensitivity = LSM303DLHC_ACC_SENSITIVITY_16G;
break;
}
/* Obtain the mg value for the three axis */
for(i=0; i<3; i++)
{
pData[i]=(pnRawData[i] * sensitivity);
}
}
//—————————————
Теперь попробуем разобраться с макросами.
LSM303DLHC_ACC_SENSITIVITY_xG – это серия макросов для настройки чувствительности акселерометра. Цифра перед G – множитель, на который мы умножаем значение G (9,8 м/с2).
LSM303DLHC_CTRL_REG4_A и LSM303DLHC_CTRL_REG5_A – это регистры 0x23 и 0x24, из которых мы считаем некоторые настройки датчика.
LSM303DLHC_OUT_X_L_A, LSM303DLHC_OUT_X_H_A, LSM303DLHC_OUT_Y_L_A, LSM303DLHC_OUT_Y_H_A, LSM303DLHC_OUT_Z_L_A и LSM303DLHC_OUT_Z_H_A – регистры в которых находятся показания датчика – раздельно младшие и старшие байты всех трёх осей координат. Их мы заносим в определенные ячейки буфера с байтами buffer.
Проверим установку бита LSM303DLHC_BLE_MSB, о котором мы уже говорили выше. В зависимости от его установки мы распределяем считанные байты в уже шестнадцатиразрядном буфере.
В конце функции изменим двухбайтовые величины считанных значений в зависимости от установленной чувствительности датчика и занесем их в глобальный буфер, который мы и будем использовать в дальнейшем для отслеживания показаний.
Ну а теперь начнем писать пользовательскую функцию использования считанных показаний и мониторинга таковых. Создадим несколько переменных, которые нам в дальнейшем пригодятся. Распределим данные из буфера также по переменным.
//—————————————
void Accel_ReadAcc(void)
{
int16_t buffer[3] = {0};
int16_t xval, yval, zval = 0x00;
uint16_t tmp16 = 0;
Accel_GetXYZ(buffer);
xval = buffer[0];
yval = buffer[1];
zval = buffer[2];
}
//—————————————
Добавим прототип данной функции в lsm303dlhc.h.
void Accel_ReadAcc(void);
//————————————————
#endif /* LSM303DLHC_H_ */
Вызовем данную функцию в главной функции программы main() в бесконечном цикле
/* USER CODE BEGIN 3 */
Accel_ReadAcc();
}
/* USER CODE END 3 */
В следующей части нашего занятия мы закончим работу с акселерометром LSM303DLHC, допишем весь код и увидим работу на практике.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на датчик
Купить отладочную плату можно здесь STM32F3-DISCOVERY
Смотреть ВИДЕОУРОК
Добавить комментарий