Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с L3G4200
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
bva_rzn
Здравструйте.
На плате есть два датчика: L3G4200 и LSM303. Схема подключения взята из документаций на эти датчики. Датчики подключенны к
PIC18. Интерфейс обмена i2c. Реализован программно. Скорость менял от 30 кбис/с до 400 кбит/с.
Настройки датчика:

Write_byte(CTRL_REG4,0x80);
Write_byte(CTRL_REG3,0x08);
Write_byte(CTRL_REG2,0x06);
Write_byte(CTRL_REG1,0x0F);

Данные считываю блоком начиная с адреса STATUS_REG: GetI2C(STATUS_REG|0x80);
Данные считываются. Регистр WHO_AM_I так же читается, т.е. i2c работает.

Проблема в том, что в данных, считанных из датчика наблюдаются большие выбросы, хотя он неподвижен.
В чём может быть проблема?



Alex_1811
Цитата(bva_rzn @ Oct 18 2011, 14:19) *
Проблема в том, что в данных, считанных из датчика наблюдаются большие выбросы, хотя он неподвижен.
В чём может быть проблема?

У меня работает так
Код
void IMU_Gyro_Init(void)
{
  L3G_WriteReg(0xD2+0 ,0x20 ,0x8F ); // CTRL_REG1   400Hz ODR, 20hz filter, run!
  L3G_WriteReg(0xD2+0 ,0x24 ,0x02 ); // CTRL_REG5   low pass filter enable
}

// -------------------------------- //
void IMU_Read_Gyro(void)
{
    unsigned char GIR[6];

    SENS_ReadData(0xD2, (0x28|(1<<7)), GIR);
    IMU_GYRO.X  = GIR[1]<<8;
    IMU_GYRO.X |= GIR[0];
    IMU_GYRO.Y  = GIR[3]<<8;
    IMU_GYRO.Y |= GIR[2];
    IMU_GYRO.Z  = GIR[5]<<8;
    IMU_GYRO.Z |= GIR[4];
}

// -------------------------------- //
unsigned short SENS_ReadData(unsigned char addr, unsigned char reg, unsigned char *data)
{
    volatile unsigned short SR2;
    //volatile int tmp;
    unsigned short rsp = 0;

    I2C1->CR1 |= I2C_CR1_START;
    rsp += I2C_Wait_Response(I2C_SR1_SB);
    I2C1->DR = addr;
    rsp += I2C_Wait_Response(I2C_SR1_ADDR);
    SR2  = I2C1->SR2;
    I2C1->DR = reg;
    rsp += I2C_Wait_Response(I2C_SR1_TXE);
    I2C1->CR1 |= I2C_CR1_START;
    rsp += I2C_Wait_Response(I2C_SR1_SB);
    I2C1->DR = addr|(1<<0);
    rsp += I2C_Wait_Response(I2C_SR1_ADDR);
    SR2  = I2C1->SR2;
    I2C1->CR1 |= I2C_CR1_ACK;
    rsp += I2C_Wait_Response(I2C_SR1_RXNE);
    *data++ = I2C1->DR;
    rsp += I2C_Wait_Response(I2C_SR1_RXNE);
    *data++ = I2C1->DR;
    rsp += I2C_Wait_Response(I2C_SR1_RXNE);
    *data++ = I2C1->DR;
    rsp += I2C_Wait_Response(I2C_SR1_RXNE);
    *data++ = I2C1->DR;
    rsp += I2C_Wait_Response(I2C_SR1_RXNE);
    *data++ = I2C1->DR;
    rsp += I2C_Wait_Response(I2C_SR1_RXNE);
    *data++ = I2C1->DR;
    I2C1->CR1 &= ~I2C_CR1_ACK;
    I2C1->CR1 |= I2C_CR1_STOP;
    return rsp;
}

Ну и мой вопрос.

Как посчиталь угол наклона по полученным данным?
Данные читаю каждые 10ms.
Гироскоп настроен на 2000 dps.
Предполагаю что так:
angel_X = angel_X + gyroX*0.01;
bva_rzn
Добрый день.

Какой конкретно нужно посчитать угол: крен или тангаж?
Вычисление угла зависит от задачи.
Если в двух словах, то углы ориентации (крен, тангаж, курс) по данным с гироскопа считаются так:
1) начальная выставка. По данным других датчиков (акселерометры, магнитометры, спутниковый приёмник) вычисляются начальные углы ориентации.
2) при каждом новом поступлении данных с гироскопа вычислятся или матрица направляющих косинусов, или вектор с параметрами собственного кватерниона и по ним определяются углы ориентации.

Особенность этих датчиков - наличие дрейфа гироскопов.
Я работаю с ADIS16405BMLZ, так вот если не делать никаких телодвижений по компенсации этого дрейфа, то уход углов ориетнации около 1 градуса за минуту.

Поэтому как вычислять углы нужно в зависимости от задачи.
Для вычисления крена и тангажа проще использовать акселерометр (трёхосевой).

Если интересно, могу написать в личку.
Alex_1811
Цитата(bva_rzn @ Jan 14 2012, 23:13) *
Какой конкретно нужно посчитать угол: крен или тангаж?

Нужно считать крен, тангаж и курс.
Цитата(bva_rzn @ Jan 14 2012, 23:13) *
Для вычисления крена и тангажа проще использовать акселерометр (трёхосевой).

Объект будет двигаться с ускорением так что предполагаю акселерометр не покатит.
Цитата(bva_rzn @ Jan 14 2012, 23:13) *
Если интересно, могу написать в личку.

Очень интересно.
bva_rzn
Нужно считать крен, тангаж и курс.

Для вычисления углов ориентации нужно на каждом такте поступления данных с гироскопа по 3 - м осям вычислять
матрицу направляющих косинусов DCM (с кватернионами тоже самое, только там вектор). Угловые скорости нужно подставлять в кососимметричную матрицу.

Углы ориентации вычисляются из DCM в зависимости от того, какой поворот был первым, второым, третьим.
Начальное значение DCM определяется по показаниям акселерометров и магнитометров, спутникового приёмника.

Объект будет двигаться с ускорением так что предполагаю акселерометр не покатит.

Прокатит. Только после того, как при помощи него и магнитометра компенсирован дрейф гироскопов и найдены углы ориентации (на каждом такте), нужно пересчитывать показания акселерометров в ошибки в углах ориентации (эти ошибки как раз и вызваны наличием ускорения) и
компенсировать их в матрице DCM, полученной по показаниям гироскопов. Это самый простой вариант. Есть ещё вариант, но в нём необходимо знать где мы находимся и знать напрящённость магнитного поля в этой точке.

Очень интересно.
[/quote]
нечитатель
То ли частная консультация "эксперту задан вопрос - от эксперта получен ответ либо вопрос больше неактуален либо вопрошавший самостоятельно решил свою проблему - короче автор удовлетворён и закрыли проехали", то ли публичные прения на какую-то такую заданную тему... шёл мимо, увидел щель, подумал вставить тоже:

1.
Если в больших выбросах, о которых сверху заголовок, старший бит в старшем байте =1 - тогда это не большие по модулю положительные, а малые по модулю отрицательные значения. "Минус немножко". Иностранными словами называется "2's complement" такая запись чисел.

Иначе любопытно, чем дело кончилось и как проблема устранена.

2.
angel_X = angel_X + gyroX*0.01

"Предполагаю, что" оригинальный подход к решению задачи... типа как ответ должен быть либо получен готовый уже от решавших её, либо угадан через интуицию?

gyroX (поп/сек) * период опроса (сек) = angel_X (поп) ... получили угол поворота в попугаях, один попугай ~ LSBit
angel_X (поп) * чувствительность (град/поп) = angel_X (град) ... получили угол в градусах

(для диапазона 2000dps чувствительность = 70 миллиградусов на каждого попугая = 0.07 градуса на попугая)

... а дальше угол в градусах умножаем на ещё что-нибудь, чтобы результат получился в удобных для дальнейшего его использования единицах. Например, в единицах "1/256 полного оборота".

---
На бумажке карандашиком это всё красиво и просто, а в настоящей микросхеме придётся ещё помнить про каждого из нарисованных чисел способ кодирования и разрядность. В битах.
Чтобы сначала все исходные данные, а потом на каждом этапе вычисления результат помещался(ись) в отведённое(ые) ему(им) место(а). Без переполнения, но/и с приемлемой точностью.
И чтобы алгоритмы соответственно...
... но это актуально только для задро ассемблерщиков красноглазых, а профессионалам можно не заморачиваться об такие мелочи, тупо всё сразу считая в супермегафлоатах @ стопицотмегагерцтактовой. Через готовые стандартные либы. Решая задачу вместо ковыряния байтиков под микроскопом.

3.
Прежде чем использовать полученный с сабжа очередной отсчёт, его полезно слегка обработать:

а). вычесть из него zero rate level (про который см. далее),
б). потом обнулить отсчёт, если он слишком близок к нулю (т.о. убираем шум, зато/и игнорируем медленные вращения).

4.
Zero rate level:

а). наше изделие находится в состоянии покоя,
б). собираем сколько-нибудь отсчётов, суммируем и делим на количество,
в). полученный zero rate level запоминаем, теперь нашему изделию можно начинать шевелиться.

г). время от времени перекалибровываемся повторно, начиная с п. 4а.

Обратить внимание на подчёркнутое в состоянии покоя, много думать.

5.
Почитать:

AN3393 L3G4200D: three axis digital output gyroscope ... от производителя сабжа про "как подключать, настраивать и получать какие-то данные"
TA0343 Everything about STMicroelectronics’ 3-axis digital MEMS gyroscopes ... от производителя сабжа про "как понимать полученные данные и что с ними делать дальше"
Helmet Locating and Tracking System Final Report ... учебный проект студентов, на соответствующем уровне подробненько и понятненько в сочетании с TA0343
Alex_1811
Спасибо за ответы.
С гироскопом разобрался.
Крен, тангаж и курс получил в связке L3G4200+LSM303 по алгоритму FreeIMU.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.