STM Урок 39. Подключаем акселерометр LSM303DLHC. Часть 5



Урок 39

 

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

 

Часть 5

 

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

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

 

zval = buffer[2];

        if(xval > 1500)

        {

                LD3_ON;

                if(yval > 1500)

                {

                        LD3_OFF;

                        LD4_ON;

                }

                else if(yval < -1500)

                {

                        LD3_OFF;

                        LD5_ON;

                }

        }

        else if(xval < -1500)

        {

                LD10_ON;

                if(yval > 1500)

                {

                        LD10_OFF;

                        LD8_ON;

                }

                else if(yval < -1500)

                {

                        LD10_OFF;

                        LD9_ON;

                }

        }

        else

        {

                if(yval > 1500)

                {

                        LD6_ON;

                }

                else if(yval < -1500)

                {

                        LD7_ON;

                }

        }

        HAL_Delay(10);

        LD3_OFF;

        LD6_OFF;

        LD7_OFF;

        LD4_OFF;

        LD10_OFF;

        LD8_OFF;

        LD9_OFF;

        LD5_OFF;

}

 

 

Скомпилируем проект, прошьем контроллер и посмотрим результат. Отклоняя в разные стороны плату, мы видим определенный светящийся светодиод

 

image28

 

Но светодиоды – это хорошо. Но зачем же мы тогда включали USART и подключали переходник? Попробуем отправить снятые показания на компьютер и поточнее посмотреть на них там.

Добавим некоторые глобальные переменные в файл lsm303dlhc.c.

extern I2C_HandleTypeDef hi2c1;

extern UART_HandleTypeDef huart2;

uint8_t buf2[14]={0};

char str1[30]={0};

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

 

Добавим в нашу функцию следующий код

 

zval = buffer[2];

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

        HAL_UART_Transmit(&huart2, (uint8_t*)str1, strlen(str1), 0x1000);

        if(xval > 1500)

 

 

Соберем проект, прошьем микроконтроллер и попробуем последить за показаниями в какой-нибудь терминальной программе. Для отслеживания слишком быстроидущих показаний я использую монитор порта Arduino, так как он меньше тормозит.

Так как мы скорость USART2 в Cube MX установили 115200 bps, то такую же скорость мы выставим и в мониторе порта.

Должна получиться следующая картина:

 

image19

 

Теперь попробуем несколько визуализировать наши показания. Для этого я нашел бесплатную программку SFMonitor.

Но перед тем, как её настраивать и использовать, мы внесем некоторые изменения в код. Уберем предыдущий код вывода данных в шину USART ну или закомментируем:

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

        HAL_UART_Transmit(&huart2, (uint8_t*)str1, strlen(str1), 0x1000);

И добавим новый код для передачи в шину

 

  zval = buffer[2];

        buf2[0]=0x12;

        buf2[1]=0x10;

        buf2[2]=(uint8_t)(xval>>8);

        buf2[3]=(uint8_t)xval;

        buf2[4]=0x10;

        buf2[5]=0x10;

        buf2[6]=(uint8_t)(yval>>8);

        buf2[7]=(uint8_t)yval;

        buf2[8]=0x13;

Байты 0x12, 0x10 и 0x13 вставлены в поток в соответствии с требованиями протокола программы. Объяснение есть на сайте разработчика http://www.poprobot.ru/soft/sfmonitor . К сожалению, мне не удалось отобразить в данной программе показания всех трех осей одновременно, видимо какие-то требования к передаче данных для нее не соблюдены, но двух одновременно удалось.

Соберем код, прошьем контроллер. Запустим программу SFMonitor и настроим ее следующим образом:

 

image20 image21image22 image23  image24image00 image01image02

 

        Запустим монитор. Пошевелим плату в разные стороны. Должно получиться вот такое

 

image04

 

 

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

 

Исходный код

 

 

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

Программа SF Monitor

 

 

Купить отладочную плату можно здесь STM32F3-DISCOVERY

 

 

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

 

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

 

8 комментариев на “STM Урок 39. Подключаем акселерометр LSM303DLHC. Часть 5
  1. Khasanshin:

    уроки хорошие. проверяю, что пишет в регистры и вижу: ничего не пишет. все работает с настройками по умолчанию. проверяли у себя? проверял reg4

    • Ну я особо не проверял, так как не было надобности. Вроде датчик нормально и шустренько работает.

      • Khasanshin:

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

        • Не знаю, надо будет проверить. А как Вы определили, что ничего не пишется? Считывали потом регистр или отслеживали статус возврата?

  2. Khasanshin:

    неправильно работает функция AccInit, если в нее напрямую писать адрес Accel_IO_Write(0x32,LSM303DLHC_CTRL_REG4_A,0x38), то работает. 

  3. Khasanshin:

    голову сломал с конвертацией в ускорение. если плата лежит на столе, то по оси z показывает 1 g.  Настроил FS = 11, то есть 16g, чувствительность (или сколько mg приходится на каждый бит) по даташиту 12 mg/lsb, при этом на выходе число в районе 16500 (кстати при настройке FS = 00, то есть 1g тоже 16500, что запутывает еще больше). 

    если 16500 mg = число на выходе х чувствительность, то ускорение у нас почти как на юпитере. 

  4. Mikhail:

    Доброго времени суток,
    с эти датчиком вообще странностей хватает. Ускорение свободного падения направлено вниз всегда, ось чувствительности Z датчика согласно Figure 2. Pin connections даташита направлена вверх. То есть мы получаем, что вектор ускорения при проекции его на ось Z датчика вообще-то должен быть отрицательным. Но он положителен, то же самое и с остальными осями, как будто они инвертированы.
    По поводу пересчета в единицы G — явно ошибка в даташите. Следующим развитием этого датчика стали LSM303C и LSM303AGR, LSM303AGR вот как раз в их даташитах и оси по другому направлены и Linear acceleration sensitivity указаны нормальные.

    (внешние ссылки убраны)

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

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

*