Урок 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, так как он меньше тормозит, чем некоторые подобные утилиты.
Отлично!
Теперь попробуем посмотреть показания с помощью какой-нибудь утилиты визуализации. Но так как какой-нибудь утилиты я не нашел, чтобы корректно работала с 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;
}
}
Запустим утилиту и посмотрим изменение графика осей во времени в зависимости от положения отладочной платы, а следовательно и датчика-акселерометра (нажмите на картинку для увеличения изображения)
Предыдущая часть Программирование МК STM32 Следующий урок
Техническая документация на датчик
Отладочную плату можно приобрести здесь STM32F4-DISCOVERY
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Здравствуйте, на Windows 10 запуск программы "NS Port Monitor" выдает ошибку отсутствия DLL. Вы не знаете как решить эту проблему?
Здравствуйте. Подключил датчик, настроил фифо, чтобы не терять данные и не грузить процессор. Есть параметр add_inc в ctrl_reg6 чтобы адресс сам умеличивался. Тогда можно считать 192 32х6 байтов за раз. Но вот в каком порядке сохраняются значения не понятно? Может Вы знаете?
Вообще странности есть в работе с сенсором. В даташите clk от spi должен бить high поляризован, а он так на деле не работает, только с low поляризацией.