STM Урок 43. Подключаем акселерометр LSM6DS3. Часть 2



Урок 43

 

Часть 2

 

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

 

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

Продолжим дальше работать с регистрами управления

 

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,value);

        //установим бит BDU

        value = Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C);

value &= ~LSM6DS3_ACC_GYRO_BDU_MASK;

        value|=LSM6DS3_ACC_GYRO_BDU_BLOCK_UPDATE;

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,value);

 

Здесь мы включаем бит BDU, о назначении которого мы уже хорошо знаем из прошлого занятия. Регистр используем тот же, бит включаем шестой

 

image03

 

Идем дальше по регистрам

 

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,value);        

        //выбор режима FIFO

        value = Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_FIFO_CTRL5);

value &= ~LSM6DS3_ACC_GYRO_FIFO_MODE_MASK;

        value|=LSM6DS3_ACC_GYRO_FIFO_MODE_BYPASS;

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_FIFO_CTRL5,value);

 

В данном коде мы выбираем режим ввода-вывода, работая уже с пятым регистром управления FIFO (Для FIFO существуют отдельные регистры). Режим мы установи без изменения (bypass)

 

image06

image05

 

Продолжаем писать код настройки регистров управления

 

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_FIFO_CTRL5,value);

        //пока выключим датчик (ODR_XL = 0000)

        value = Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL);

        value&=~LSM6DS3_ACC_GYRO_ODR_XL_MASK;

        value|=LSM6DS3_ACC_GYRO_ODR_XL_POWER_DOWN;

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,value);

 

 

Ну тут всё также как и на прошлом занятии. Пока отключим датчик. Используем первый управляющий регистр

 

image08

image07

 

Дальше будет следующий код:

 

        //Full scale selection 2G

        value = Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL);

        value&=~LSM6DS3_ACC_GYRO_FS_XL_MASK;

        value|=LSM6DS3_ACC_GYRO_FS_XL_2g;

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,value);

 

Тут понятно. Включаем максимально-возможное измерение (амплитуду измерения 2G). Регистр тот же.

 

image11

 

Пишем дальше:

 

        //Включим оси

        value = Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_CTRL9_XL);

        value&=~(LSM6DS3_ACC_GYRO_XEN_XL_MASK|\

                                         LSM6DS3_ACC_GYRO_YEN_XL_MASK|\

                                         LSM6DS3_ACC_GYRO_ZEN_XL_MASK);

        value|=(LSM6DS3_ACC_GYRO_XEN_XL_ENABLED|\

                                        LSM6DS3_ACC_GYRO_YEN_XL_ENABLED|\

                                        LSM6DS3_ACC_GYRO_ZEN_XL_ENABLED);

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL9_XL,value);

 

 

Здесь мы уже включаем оси (с каких осей будут сниматься данные). Используем, как обычно, все три оси – X,Y и Z. Регистр используем девятый

 

image09

image10

 

Пишем дальше наш код:

 

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL9_XL,value);

        //Включим Data Rate 104 Гц

        value = Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL);

        value&=~LSM6DS3_ACC_GYRO_ODR_XL_MASK;

        value|=LSM6DS3_ACC_GYRO_ODR_XL_104Hz;

        Accel_IO_Write(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,value);        

}

 

Это окончание нашей инициализации. Здесь мы, конечно, должны включить наш датчик. Частоту снятия данных будем использовать 104 кГц. Регистр первый. Мы его уже использовали выше

 

image12

 

Также подправим код сбора данных с датчика, просто изменив адрес датчика и регистры:

 

        uint8_t i=0;

        buffer[0]=Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_OUTX_L_XL);

        buffer[1]=Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_OUTX_H_XL);

        buffer[2]=Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_OUTY_L_XL);

        buffer[3]=Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_OUTY_H_XL);

        buffer[4]=Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_OUTZ_L_XL);

        buffer[5]=Accel_IO_Read(0xD4,LSM6DS3_ACC_GYRO_OUTZ_H_XL);

 

В функции Accel_ReadAcc пока текстовое отображение данных с датчика через терминал

 

        zval=buffer[2];

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

        HAL_UART_Transmit_DMA(&huart2, (uint8_t*)str1,strlen(str1));

//        buf2[0]=0x11;

 

Соберем код, прошьем контроллер и проверим в мониторе порта Arduino работу нашего датчика

 

image13

 

Закомментируем код вывода на терминал. Раскомментируем код вывода в программу визуализации. Программу будем использовать также NS Port Monitor, поэтому код составим в соответствии с требованиями протокола данной программы (первые байты 0x11 и 0x55).

 

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

//        HAL_UART_Transmit_DMA(&huart2, (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;

        HAL_UART_Transmit_DMA(&huart2,buf2,8);

        if(xval>1500)

 

Соберем проект, прошьем контроллер, запустим программу и проверим результат на практике (нажмите на картинку для увеличения изображения)

 

image14_0500

 

 

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

 

Исходный код

 

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

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

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

 

 

Отладочную плату можно приобрести здесь Nucleo STM32F401RE

Оценочную плату можно приобрести здесь STM32 X-NUCLEO-IKS01A1

Приобрести платы с датчиком LSM6DS3 можно у следующих продавцов:

Надёжный продавец LSM6DS33 STEVAL-MKI160V1

Здесь дешевле LSM6DS33 STEVAL-MKI160V1

Здесь другая плата, намного дешевле, но от другого разработчика LSM6DS33

 

 

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

 

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

 

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

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

*