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



    Урок 47

 

Часть 2

 

Подключаем гироскоп LSM6DS3

 

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

Добавим ещё одну функцию Gyro_GetXYZ, предназначенную для опроса осей гироскопа. Сделаем её полностью на основе подобной для акселерометра (Accel_GetXYZ), скопировав в функцию также и весь код. Исправим код, используя в опросе регистры, предназначенные именно для чтения осей гироскопа

 

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

void Gyro_GetXYZ(int16_t* pData)

{

        uint8_t buffer[6];

        uint8_t i=0;

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

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

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

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

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

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

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

        {

                pData[i] = ((int16_t)((uint16_t)buffer[2*i+1]<<8)+buffer[2*i]);

        }

}

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

Функцию Accel_ReadAcc также для порядка переименуем в более универсальную – AccelGyro_Read. То же самое проделаем и с прототипом данной функции

 

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

void AccelGyro_Read(void)

{

        int16_t buffer[3] = {0};

 

Исправим в ней строку

 

        int16_t xval, yval, zval;

        Gyro_GetXYZ(buffer);

 

Раскомментируем строки кода, отвечающие за вывод считанной с осей информации в текстовый вид, а в графический закомментируем

 

        sprintf(str1,»X:%06d Y:%06d Z:%06drn», 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(zval>500)

        {

 

В бесконечном цикле в функции main() раскомментируем и исправим вызов функции

 

  /* USER CODE BEGIN 3 */

                AccelGyro_Read();

 

Соберем код, прошьем контроллер и посмотрим: при вращении платы против часовой стрелки относительно вертикальной оси должен загораться зелёный светодиод. Затем проверим данные в программе Hyper Terminal. Должен быть вот такой резултьтат.

 

image00

 

Попробуем немного скорректировать показания, т.к. если не крутить плату, то показания несколько будут отличаться от 0.

xval=buffer[0];

        yval=buffer[1]+161;

        zval=buffer[2]+80;

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

Соберем проект и еще раз посмотрим показания.

 

 

Теперь наоборот, раскомментируем код для визуализации, а для текстового вывода закомментируем. Также поменяем оси x и y между собой, одну ось перевернем в буфере из-за перпендикулярного расположения маленькой платы, так будет крутить кубик удобнее.

 

        zval=buffer[2];

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

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

        xval=-xval;

        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);

 

Соберем код и прошьем контроллер. Запустим сначала программу NS Port Monitor. Покрутим плату. Результат должен быть таким (для увеличения размера нажмите на картинку):

 

image03_0500

 

Теперь запустим ещё одну программу, NS Port Visual. Также покрутим плату. Результат должен быть таким:

 

image02

 

 

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

 

Исходный код

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

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

Программа Hyper Terminal

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

Программа NS Mag Visual

 

 

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

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

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

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

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

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

 

 

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

 

STM32 Подключаем гироскоп LSM6DS3

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

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

*