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