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, о назначении которого мы уже хорошо знаем из прошлого занятия. Регистр используем тот же, бит включаем шестой

Идем дальше по регистрам
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)


Продолжаем писать код настройки регистров управления
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);
Ну тут всё также как и на прошлом занятии. Пока отключим датчик. Используем первый управляющий регистр


Дальше будет следующий код:
//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). Регистр тот же.

Пишем дальше:
//Включим оси
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. Регистр используем девятый


Пишем дальше наш код:
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 кГц. Регистр первый. Мы его уже использовали выше

Также подправим код сбора данных с датчика, просто изменив адрес датчика и регистры:
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 работу нашего датчика

Закомментируем код вывода на терминал. Раскомментируем код вывода в программу визуализации. Программу будем использовать также 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)
Соберем проект, прошьем контроллер, запустим программу и проверим результат на практике (нажмите на картинку для увеличения изображения)
Техническая документация на датчик
Техническая документация на оценочную плату
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Оценочную плату X-NUCLEO-IKS01A1 можно приобрести здесь STM32 X-NUCLEO-IKS01A1
Оценочную плату STEVAL-MKI160V1 можно приобрести здесь STEVAL-MKI160V1
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)




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