STM Урок 39. Подключаем акселерометр LSM303DLHC. Часть 4

 

 

 

Урок 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 Следующая часть

 

Техническая документация на датчик

Программа SF Monitor

 

 

Купить отладочную плату можно здесь STM32F3-DISCOVERY

 

 

Смотреть ВИДЕОУРОК

 

STM Подключаем акселерометр LSM303DLHC

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*