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