Урок 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;
}
Скомпилируем проект, прошьем контроллер и посмотрим результат. Отклоняя в разные стороны плату, мы видим определенный светящийся светодиод
Но светодиоды – это хорошо. Но зачем же мы тогда включали 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, то такую же скорость мы выставим и в мониторе порта.
Должна получиться следующая картина:
Теперь попробуем несколько визуализировать наши показания. Для этого я нашел бесплатную программку 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 и настроим ее следующим образом:
Запустим монитор. Пошевелим плату в разные стороны. Должно получиться вот такое
Предыдущая часть Программирование МК STM32 Следующий урок
Техническая документация на датчик
Купить отладочную плату можно здесь STM32F3-DISCOVERY
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
уроки хорошие. проверяю, что пишет в регистры и вижу: ничего не пишет. все работает с настройками по умолчанию. проверяли у себя? проверял reg4
Ну я особо не проверял, так как не было надобности. Вроде датчик нормально и шустренько работает.
аксель работает, но с настройками по умолчанию, если пытаться при помощи вашей функции записать в регистр, то ничего не пишется. или у меня косяк?
Не знаю, надо будет проверить. А как Вы определили, что ничего не пишется? Считывали потом регистр или отслеживали статус возврата?
статус возврата — ок, считывал регистр
неправильно работает функция AccInit, если в нее напрямую писать адрес Accel_IO_Write(0x32,LSM303DLHC_CTRL_REG4_A,0x38), то работает.
голову сломал с конвертацией в ускорение. если плата лежит на столе, то по оси z показывает 1 g. Настроил FS = 11, то есть 16g, чувствительность (или сколько mg приходится на каждый бит) по даташиту 12 mg/lsb, при этом на выходе число в районе 16500 (кстати при настройке FS = 00, то есть 1g тоже 16500, что запутывает еще больше).
если 16500 mg = число на выходе х чувствительность, то ускорение у нас почти как на юпитере.
Доброго времени суток,
с эти датчиком вообще странностей хватает. Ускорение свободного падения направлено вниз всегда, ось чувствительности Z датчика согласно Figure 2. Pin connections даташита направлена вверх. То есть мы получаем, что вектор ускорения при проекции его на ось Z датчика вообще-то должен быть отрицательным. Но он положителен, то же самое и с остальными осями, как будто они инвертированы.
По поводу пересчета в единицы G — явно ошибка в даташите. Следующим развитием этого датчика стали LSM303C и LSM303AGR, LSM303AGR вот как раз в их даташитах и оси по другому направлены и Linear acceleration sensitivity указаны нормальные.
(внешние ссылки убраны)