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



Урок 41

 

Часть 4

 

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

 

В предыдущей чатсти нашего занятия мы закончили писать инициализацию акселерометра, а также написали функцию считывания данных с датчика.

 

Продолжим функцию Accel_ReadAcc. Занесем показания датчика в буфер:

 

  Accel_GetXYZ(buffer);

  xval = buffer[0];

  yval = buffer[1];

  zval = buffer[2];

 

  HAL_Delay(20);

 

Теперь обработаем данные показания и в зависимости от их значений зажжем определенные светодиоды на плате.

 

  zval = buffer[2];

  if((ABS(xval))>(ABS(yval)))

  {

                if(xval > 200)

                {

                        LD5_ON;

                }

                else if(xval < -200)

                {

                        LD4_ON;

                }

  }

  else

  {

                if(yval > 200)

                {

                        LD3_ON;

                }

                else if(yval < -200)

                {

                        LD6_ON;

                }

  }

  HAL_Delay(20);

 

 

И, соответственно, в конце функции мы все светодиоды тушим.

        HAL_Delay(20);

        LD3_OFF;

        LD4_OFF;

        LD5_OFF;

        LD6_OFF;

}

 

Прошьём контроллер и посмотрим результат.

Если всё нормально, попробуем данные результаты передать в ПК через USB CDC. Некоторый код возьмем из прошлого урока.

Подключим файл для USB CDC

 

#include «lis3dsh.h»

#include «usbd_cdc_if.h»

//————————————

 

Добавим глобальные переменную в файл lis3dsh.c

 

extern SPI_HandleTypeDef hspi1;

uint8_t buf2[8]={0};

char str1[30]={0};

//————————————

 

Вставим код в функцию Accel_ReadAcc

 

  zval = buffer[2];

  sprintf(str1,»X:%06d Y:%06d Z::%06drn», xval, yval, zval);

  CDC_Transmit_FS((uint8_t*)str1, strlen(str1));

  if((ABS(xval))>(ABS(yval)))

 

Соберем код, прошьем контроллер и посмотрим результат с помощью, например, монитора порта, встроенного в ПО для Arduino, так как он меньше тормозит, чем некоторые подобные утилиты.

 

image16

 

Отлично!

 

 

        Теперь попробуем посмотреть показания с помощью какой-нибудь утилиты визуализации. Но так как какой-нибудь утилиты я не нашел, чтобы корректно работала с USB, то пришлось её писать самому. Чтобы воспользоваться данной утилитой, заполним буфер соответствующим образом, закомментировав код символьной передачи в USB, и вызовем функцию передачи:

 

  zval = buffer[2];

//        sprintf(str1,»X:%06d Y:%06d Z:%06drn», xval, yval, zval);

//        CDC_Transmit_FS((uint8_t*)str1, strlen(str1));

        

        buf2[0]=0x11;

        buf2[1]=0x55;

        buf2[2] = (uint8_t) (xval >> 8);

        buf2[3] = (uint8_t) xval;

        buf2[4] = (uint8_t) (yval >> 8);

        buf2[5] = (uint8_t) yval;

        buf2[6] = (uint8_t) (zval >> 8);

        buf2[7] = (uint8_t) zval;

        CDC_Transmit_FS(buf2, 8);

        if((ABS(xval))>(ABS(yval)))

 

Также уберём пока множитель в функции сбора информации

 

  for(i=0; i<3; i++)

  {

    valueinfloat = ((buffer[2*i+1] << 8) + buffer[2*i]) * sensitivity;

    pData[i] = (int16_t)valueinfloat;

 

А вместо 200 в коде управления светодиодами поставим 2000, дописав нолики к 200, чтобы светодиоды были менее чувствительны к ускорениям

 

        if((ABS(xval))>(ABS(yval)))

  {

                if(xval > 2000)

                {

                        LD5_ON;

                }

                else if(xval < -2000)

                {

                        LD4_ON;

                }

        }

        else

        {

                if(yval > 2000)

                {

                        LD3_ON;

                }

                else if(yval < -2000)

                {

                        LD6_ON;

                }

        }

 

Запустим утилиту и посмотрим изменение графика осей во времени в зависимости от положения отладочной платы, а следовательно и датчика-акселерометра (нажмите на картинку для увеличения изображения)

 

image00_0500

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

Исходный код

 

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

Программа NS Port Monitor

 

 

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

 

 

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

 

STM32 Подключаем акселерометр LIS3DSH

 

3 комментария на “STM Урок 41. Подключаем акселерометр LIS3DSH. Часть 4
  1. Здравствуйте, на Windows 10 запуск программы "NS Port Monitor" выдает ошибку отсутствия DLL. Вы не знаете как решить эту проблему?

  2. Павел:

    Здравствуйте. Подключил датчик, настроил фифо, чтобы не терять данные и не грузить процессор. Есть параметр add_inc в ctrl_reg6 чтобы адресс сам умеличивался. Тогда можно считать 192 32х6 байтов за раз. Но вот в каком порядке сохраняются значения не понятно? Может Вы знаете?

  3. Павел:

    Вообще странности есть в работе с сенсором. В даташите clk от spi должен бить high поляризован, а он так на деле не работает, только с low поляризацией.

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

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

*