Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Кто работал с L3G4200D?
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
Alexander_84
Здравствуйте, с гироскопами сталкиваюсь впервые. Вообщем задача пока просто измерять углы по 2 осям. Гироскоп подлючен по I2C к ARM. Интерфейс работает нормально (регистр WHO_AM_I считывется правильно), а когда пытаюсь считывать углы получаю ерунду: устройво лежит в покое, при этом показания например по оси x меняютя ( принимают значения 30000, 60000, 771, 64000...). Из настроек по умолчанию в CTRL_REG1 изменил power_down на normal_mode и DATA_RATE поставил 200Гц, в CTRL_REG4 BDU поставил в 1. С настройками по умолчанию считываю первый раз значение и больше оно не меняется при вращении устройства. Вообщем как заставить это работать и измеряется абсолютный угол или изменение угла?
-=TRO=-
С этим чипом ещё не работал, только жду заказа, но возможно по аналогии с компасами, при чтении из первого регистра(данных по осям) остальные блокируются до того момента пока вы не прочитаете последовательно их все.
Данилыч
Цитата(Alexander_84 @ Apr 4 2011, 12:07) *
Здравствуйте, с гироскопами сталкиваюсь впервые. Вообщем задача пока просто измерять углы по 2 осям. Гироскоп подлючен по I2C к ARM. Интерфейс работает нормально (регистр WHO_AM_I считывется правильно), а когда пытаюсь считывать углы получаю ерунду: устройво лежит в покое, при этом показания например по оси x меняютя ( принимают значения 30000, 60000, 771, 64000...). Из настроек по умолчанию в CTRL_REG1 изменил power_down на normal_mode и DATA_RATE поставил 200Гц, в CTRL_REG4 BDU поставил в 1. С настройками по умолчанию считываю первый раз значение и больше оно не меняется при вращении устройства. Вообщем как заставить это работать и измеряется абсолютный угол или изменение угла?


Здравствуйте! Сначала у меня была точно такая же история. Потом почти все получилось.

1. В соответствии с даташитом CD00265057 данные угловой скорости по осям представлены как числа в дополнительном коде.
После соответствующих преобразований получаются удобочитаемые значения в диапазоне приблизительно от 0 до +/-5000.

2. Если Вас отвлекают шумы (около +/-50), то для начала полученные 2-байтовые значения можно загрубить. Я сдвигал их вправо на 8 бит!
Получается очень наглядно.

Сейчас работаю над системой прерываний. В скупо написанном даташите встречаются ошибки.
ren5
Цитата(Alexander_84 @ Apr 4 2011, 12:07) *
Здравствуйте, с гироскопами сталкиваюсь впервые. Вообщем задача пока просто измерять углы по 2 осям. Гироскоп подлючен по I2C к ARM. Интерфейс работает нормально (регистр WHO_AM_I считывется правильно), а когда пытаюсь считывать углы получаю ерунду: устройво лежит в покое, при этом показания например по оси x меняютя ( принимают значения 30000, 60000, 771, 64000...). Из настроек по умолчанию в CTRL_REG1 изменил power_down на normal_mode и DATA_RATE поставил 200Гц, в CTRL_REG4 BDU поставил в 1. С настройками по умолчанию считываю первый раз значение и больше оно не меняется при вращении устройства. Вообщем как заставить это работать и измеряется абсолютный угол или изменение угла?

скорее всего ошибка в чтении по I2C, получал такие данные, когда пытался прочитать серией все 6 регистров, стандартной подпрограммой, изменил протокол чтения, согласно даташита, и все стало читаться нормально
можно ничего не менять, попробуй считывать отдельно из каждого регистра, а не серией
шумы убираю упрощенным алгоритмом Калмана
rzn62
Здравствуйте! Проблема с гироскопом следующая. В управляющие регистры внесены те же изменения, что и у Alexander_84. Обмен данными - по I2C, чтение и запись поочередно для каждого регистра, не серией. При неподвижном гироскопе старший байт угловой скорости по ВСЕМ осям 11111110 = FE h (младшие байты разные). Такое характерно для ВСЕХ 4-х приобретенных гироскопов из одной партии. Если перевести из доп. кода и умножить на 0,00875 (цена младшего разряда при Wmax = 250 град/с), по модулю выходит больше 1 град/с. Это нормально, что "ноль" смещен на такую величину, притом одинаково по всем трем осям?

Пробовали режим SELF TEST, при переводе из доп. кода выдает значение 146 град/с (если цену младшего разряда брать из datasheet с сайта производителя 0,00875 град/с) или 126,7 град/с (если цена младшего разряда 250/32768 град/с), что заявленным 130 град/с никак не соответствует.

Вопросы: 1) если кто с подобным встречался, подскажите, пожалуйста, чем такой эффект может быть вызван?
2) почему регистр STATUS_REG имеет значение 11111111 (происходит перезапись данных угловой скорости), даже если в старший бит CTRL_REG4 поставить "1", т.е. запретить перезапись содержимого выходных регистров до завершения чтения из них данных?
MrAlex
Цитата(rzn62 @ Jul 22 2011, 14:07) *
Вопросы: 1) если кто с подобным встречался, подскажите, пожалуйста, чем такой эффект может быть вызван?

Допустимое смещение нуля по ДШ +/- 10 гр/сек, при диапазоне +/- 250
Цитата
2) почему регистр STATUS_REG имеет значение 11111111 (происходит перезапись данных угловой скорости), даже если в старший бит CTRL_REG4 поставить "1", т.е. запретить перезапись содержимого выходных регистров до завершения чтения из них данных?

Подразумевается, что произошла утеря данных вследствие несвоевременного прочтения.
klen
таже беда, моя тема ниже чуток но никио не ответил.
а) я взял кусок кода "ихний" - тоесть ST-мовский пример который к этому датчику идет с доками, внем нада только spi прикрутиить, spi работает отлично - читает id и можно запичсать число в регистр а потом его считать. - значит не в spi дело
2) с дуру был впаян неправильный кондер в филтр фапч. но температуру то он должен же был мериить.

тоже не дает измерений - значения как вкопаные не меняются

к уого какую температуру показывает и как это значение в градусы перевести?

если не слтожно у кого заработало дайте кусок кода с инициализвцией и чтением. какой интерфейс - i2c или spi неважно
MrAlex
Цитата(klen @ Jul 25 2011, 16:48) *
к уого какую температуру показывает и как это значение в градусы перевести?

При комнатной температуре показывает 23 - 25 непосредственно в градусах(8 бит в дополнительном коде), но масштаб отрицательный при нагреве показания уменьшается.
rzn62
Цитата(klen @ Jul 25 2011, 16:48) *
если не слтожно у кого заработало дайте кусок кода с инициализвцией и чтением. какой интерфейс - i2c или spi неважно


Присоединяюсь. :-)

Цитата(klen @ Jul 25 2011, 16:48) *
тоже не дает измерений - значения как вкопаные не меняются


Если совсем не меняются, возможно, гироскоп после подачи питания "самостоятельно" уходит в режим power down (нужно прописать единичку в бит PD CTRL_REG1) либо, если старший бит CTRL_REG4 BDU = "1", не считываются все 6 байт угловых скоростей и гироскоп не обновляет выходные регистры. Предположение, конечно. Есть приложение к ДШ - AN3393 Application note; в нем некоторые вопросы, в частности, алгоритм инициализации (Startup sequence), рассмотрены чуточку подробнее. Может кому пригодится.

На сегодняшний день гироскоп вроде задышал - в режиме покоя пошли близкие к нулю данные (в пределах +/- 0,6..0,8 град/с), но периодически (в среднем на каждый 50-й отсчет) выскакивает такой косяк, как повторное чтение предыдушего байта: например, значение младшего байта по одной оси повторно считывается как старший байт скорости по другой оси. В результате - дикие выбросы, вплоть до Wmax. Ошибка в протоколе I2C?

Нажмите для просмотра прикрепленного файла
MrAlex
Цитата(rzn62 @ Jul 27 2011, 21:35) *
Присоединяюсь. :-)

Неспортивно.
Законченные библиотеки можно поискать в проектах под Ардуины.

Цитата(rzn62 @ Jul 27 2011, 21:35) *
Если совсем не меняются, возможно, гироскоп после подачи питания "самостоятельно" уходит в режим power down (нужно прописать единичку в бит PD CTRL_REG1) ...

После пода питания гироскоп всегда находится в powerdown mode, кроме PD надо выставить Zen,Yen,Xen.

Цитата(rzn62 @ Jul 27 2011, 21:35) *
старший бит CTRL_REG4 BDU = "1"

блокирует результат одной оси пока не будут прочитаны оба регистра ( H - L ), результаты двух других осей могут быть обновлены.
rzn62
Цитата(MrAlex @ Jul 28 2011, 09:37) *
Неспортивно.


Знаете, MrAlex, когда у Вас гироскоп уже работает, можно рассуждать и о спортивной этике, и показать мне желтую карточку за неспортивное поведение на форуме. А когда с Вас требуют результат, от которого зависит работа Ваших коллег, в бестолковку невольно начинают лезть мысли типа "вороне как-то бог послал кусочек сыра". Мой коллега со светлой (не в смысле цвета волос) головой прочитал с гироскопа адекватные данные. Как тут уже писали выше, стандартный протокол чтения нужно изменить в соответствии с ДШ.

Цитата(MrAlex @ Jul 28 2011, 09:37) *
После пода питания гироскоп всегда находится в powerdown mode, кроме PD надо выставить Zen,Yen,Xen.

Не шибко силен в англицком, но фраза "After power supply is applied, the L3G4200D performs a 10 ms boot procedure to load the trimming parameter. After the boot is completed, the device is automatically configured in power-down mode" заканчивается словами "...после завершения процедуры загрузки устройство автоматически переходит в режим Power Down". Это и подразумевал, когда написал "самостоятельно". Биты Zen,Yen,Xen, судя по ДШ, по умолчанию уже выставлены в "1".

Цитата(MrAlex @ Jul 28 2011, 09:37) *
блокирует результат одной оси пока не будут прочитаны оба регистра ( H - L ), результаты двух других осей могут быть обновлены.

Да, признаю, сегодня убедился.

По поводу измеряемой температуры: при +30 в помещении выдает 11111001, что при переводе из доп. кода дает -7. Нагревать/охлаждать гироскоп пока не пробовали. Фраза "The L3G4200D is provided with an internal temperature sensor that is suitable for delta temperature measurement." вроде как не обещает возможности измерения абсолютных значений температуры.
MrAlex
Цитата(rzn62 @ Jul 28 2011, 22:15) *
Мой коллега со светлой (не в смысле цвета волос) головой прочитал с гироскопа адекватные данные.

Значит вопросы сняты.
klen
Цитата(MrAlex @ Jul 29 2011, 11:09) *
Значит вопросы сняты.

код в студию
Alex_1811
Цитата(klen @ Aug 3 2011, 17:02) *
код в студию

Поделитесь кодом, пожалуйста!!!!
MrAlex
Цитата(Alex_1811 @ Aug 25 2011, 21:58) *
Поделитесь кодом, пожалуйста!!!!

Кодом чего с вами поделится?

CODE
TWI_Init();

Hardware_TWI_Enable();
if(!L3G4200D_Init((unsigned short*)&SensorsRawData[0u]))
G_SENSOR_MODE |= SENSOR_L3G4200D;

Вот и весь код, остальное - это библиотеки собранные в проект.

Инициализируется следующим образом:
Write CTRL_REG1 (20h) = BW1 | BW0 | PD | Zen | Yen | Xen
Write CTRL_REG2 (21h) = 0x00, // High Pass Filter not used
Write CTRL_REG3 (22h) = I2_DRDY
Write CTRL_REG4 (23h) = BDU
Write CTRL_REG5 (24h) = Out_Sel0
Данные считываются одним блоком начиная со статуса. FIFO не используется.

Разные варианты настроек расписаны в appnote:
http://www.st.com/internet/com/TECHNICAL_R.../DM00026768.pdf
Bearpaw
Привет всем! Пытаюсь запустить сей гироскоп по СПИ. МК - stm32f103. Проблемма заключается в том что по SPI я могу прочитать ТОЛЬКО регистр WHO_AM_I. Любой другой регистр я прочитать не могу. Но, судя по тому что из WHO_AM_I я читаю правильное (0xD3) значение, SPI работает. В чём может быть проблемма?
Если надо выложу код.

P.S.: я тут на платку посмотрел и мне кажется что может быть непропай на Vdd-контакте (Vdd-IO скорее всего работает норм, ибо не было бы ответа по SPI тогда, верно?), может ли это быть причиной такой неработоспособности?
delphi
Привет всем. Описанная в первом посте проблема на 100% совпала с моей. Я очень долго поднимал этот датчик, до этого все давалось легче и быстрее. Например акселерометр поднялся за 2 дня. А с этим, извините, дерьмом, провозился. Значит, проблема постоянных значений на выходе решилась в моем случае постоянным вызовом инициализации регистра 0x20. Странно, но его значение иногда портилось. Приходилось его обновлять. В схеме я не впаял фильтр ФАПЧ и тем, у кого подобная проблема, советую прозвонить эту цепь. Я думаю, что проблемы могут сидеть тут.
Где-то через 3-4 дня выложим на robot-develop.org статью с кодом для этого датчика и для акселлерометра MMA7455L. Также есть подозрение на функции чтения и записи регистров. Я унаследовал их из кода для акселерометра (предыдущий проект). Попробую с другим вариантом, работающим в прерывании. Еще есть большое подозрение на качество партии этого дерьма. Я для интереса портировал ардуино либу и результат - как в начале статьи. Читаются несколько значений и потом не обновляются. Но код работает на модулях от polulu. Я негативно отношусь к качеству поставленных модулей. Потрачу еще 1 день на проверку косяков при чтении и записи, но мне кажется, дело именно в модулях. Покупал их в Терралектронике.
Также было замечено, что при запрещении обновления значения регистра до конца чтения или записи ( output registers not updated until MSB and LSB
reading) все благополучно виснет. Модуль не отвечает.
delphi
Это проблема протокола. Он неправильно читает сразу несколько регистров. Внимательно изучайте диаграмму чтения нескольких регистров и правьте код, либо довольствуйтесь чтение регистров по одному.
Andrew-S
Как раз сейчас вожусь с этим датчиком. Настройки нужные (на мой взгляд) сделал, регистры читаю пачкой, начиная с температуры. Настроил ODR на 200 Гц, читаю с него с частотой 100Гц. Диапазон скоростей 500 град/с. Бит BDU выставил в 1. Получил интересный эффект. Датчик лежит неподвижно на столе. Читаю значения скоростей с регистров в районе нуля +- шумы. Но раз в несколько секунд (3-5с) получаю с некоторых осей значения типа 0x00FA, 0xFF13, 0xFF05, 0x00F9. Эти значения примерно соответствуют +-4 град/сек и отличаются от правильных значений на 1 байт. Такое ощущение что если у 0xFF13 выкинуть FF и оставить 0x0013, то получится адекватное значение, соответствующее отклонению в 0.3 град/сек. А если к 0x00F9 добавить старший байт FF, то получится 0xFFF9, вполне себе разумное значение около нуля. Куда копать дальше пока не знаю. При этом нет ошибок чтения i2c.
Andrew-S
Продолжаю исследования, пока безрезультатно. Попробовал подключить HPF и LPF2, результат тот же. Появилась мысль включить режим self test, выставил два бита ST0 и ST1 в CTRL4, но при этом режим не включился. Как были значения близкие к нулю на лежачей плате, так и остались. Отсюда возникло сомнение, либо этот режим несовместим с какими-либо фильтрами и работает только при определенной конфигурации, либо устройство неадекватно воспринимает конфигурацию. Тогда может и контроль за целостностью, управляемый BDU не работает. Есть какие-нибудь мысли?
MrAlex
Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут
Alex_1811
Обрати особое внимание на питание.
mataor
Добавлюсь и я в ваш огород)))
C этим гироскопом ковырялся полдня, ито в основном из-за того что сейчас начался ковыряццо с xmega128a3 и его TWI.
Гир отсюда http://www.ebay.com/itm/L3G4200D-Triple-Ax...a#ht_535wt_1396 - подключай питание и I2C/SPI и работай - так же мона найти и схемку модуля
инициализацию и снятие показаний взял из MultiWii исходников - там кстати дофига гир, акселерометров, магнетометров, барометров + GPS
в итоге получился такой код (извиняюсь он еще не причесан):
Код
USART_puts(eUSARTF0, "L3G4200D test\r\n");

    USART_puts(eUSARTF0, "TWI_Baud ");outputHex(TWI_BAUDSETTING);USART_puts(eUSARTF0, "\r\n");
    uint8_t l3g4200address=L3G4200D_ADDRESS1; // gyro can be assigned to 2 addresses, we check the two here
    
    USART_puts(eUSARTF0, "Trying address ");
    outputHex(l3g4200address);
    USART_puts(eUSARTF0, "...\r\n");
    
    // Задаем адрес ячейки для чтения
      sendBuffer[0]=0x0F; // WHOAMI регистр
    
    TWI_MasterWriteRead(&twiMaster, l3g4200address, &sendBuffer[0], 1, 1);
    while (twiMaster.status != TWIM_STATUS_READY); // ждем
    
    if (twiMaster.readData[0x00]!=L3G4200D_WHOAMI)
    {
        USART_puts(eUSARTF0,"Not found...\r\n");
        l3g4200address=L3G4200D_ADDRESS2;
        USART_puts(eUSARTF0,"Trying address ");
        outputHex(l3g4200address);
        USART_puts(eUSARTF0, "...\r\n");
        sendBuffer[0]=0x0F; // WHOAMI регистр
        TWI_MasterWriteRead(&twiMaster, l3g4200address, &sendBuffer[0], 1, 1);
        while (twiMaster.status != TWIM_STATUS_READY); // ждем
        
        if (twiMaster.readData[0x00]!=L3G4200D_WHOAMI)
        {
            USART_puts(eUSARTF0,"Not found...\r\n");
            USART_puts(eUSARTF0,"Please check I2C bus connection, pull ups on SDA/SCL, power to the gyro, decoupling capacitors etc...\r\n");
            for(;;);
        }
      }
      USART_puts(eUSARTF0, "L3G4200D answered !\r\n");
      USART_puts(eUSARTF0,"Configuring gyro for basic measurements, no filtering, 500sps...\r\n");
      
      sendBuffer[0]=0x20;//Адрес старта
      sendBuffer[1]=0x8F;//значение
      TWI_MasterWriteRead(&twiMaster, L3G4200D_ADDRESS2, sendBuffer, 2, 0);
      while (twiMaster.status != TWIM_STATUS_READY); // ждем
      sendBuffer[0]=0x24;//Адрес старта
      sendBuffer[1]=0x02;//значение
      TWI_MasterWriteRead(&twiMaster, L3G4200D_ADDRESS2, sendBuffer, 2, 0);
      while (twiMaster.status != TWIM_STATUS_READY); // ждем
      //sendBuffer[0]=0x23;//Адрес старта
      //sendBuffer[1]=0x90;//значение
      //TWI_MasterWriteRead(&twiMaster, L3G4200D_ADDRESS2, sendBuffer, 2, 0);
      //while (twiMaster.status != TWIM_STATUS_READY); // ждем
      
      // Проверка что записали в регистры
      USART_puts(eUSARTF0,"Reading writed registr\r\n");
      sendBuffer[0]=0x20;
      TWI_MasterWriteRead(&twiMaster, l3g4200address, &sendBuffer[0], 1, 1);
      while (twiMaster.status != TWIM_STATUS_READY); // ждем
      outputHex(twiMaster.readData[0x00]);USART_puts(eUSARTF0,"  ");
      //sendBuffer[0]=0x23;
      //TWI_MasterWriteRead(&twiMaster, l3g4200address, &sendBuffer[0], 1, 1);
      //while (twiMaster.status != TWIM_STATUS_READY); // ждем
      //outputHex(twiMaster.readData[0x00]);USART_puts(eUSARTF0,"  ");
      sendBuffer[0]=0x24;
      TWI_MasterWriteRead(&twiMaster, l3g4200address, &sendBuffer[0], 1, 1);
      while (twiMaster.status != TWIM_STATUS_READY); // ждем
      outputHex(twiMaster.readData[0x00]);USART_puts(eUSARTF0,"  ");
      USART_puts(eUSARTF0,"\r\n");
            
      USART_puts(eUSARTF0,"Reading x,y,z data\r\n");


    while (1)
    {
        // read 3 int16 which is 6 bytes.
        sendBuffer[0]=(0x80|0x28); //
        TWI_MasterWriteRead(&twiMaster, l3g4200address, sendBuffer, 1, 6);
        while (twiMaster.status != TWIM_STATUS_READY); // ждем
        gyroscope[0]=((twiMaster.readData[1]<<8) | twiMaster.readData[0])/20;
        gyroscope[1]=((twiMaster.readData[3]<<8) | twiMaster.readData[2])/20;
        gyroscope[2]=((twiMaster.readData[5]<<8) | twiMaster.readData[4])/20;
            
        USART_puts(eUSARTF0,"Angles x,y,z in °/s : ");
        float angle;
        int i=0;
        while(i<3)
        {
            angle=gyroscope[i]*0.0175f;
            dtostrf(angle,5,4, buffer);
            USART_puts(eUSARTF0,buffer);
            if (i!=2) USART_puts(eUSARTF0,", ");
            i++;
        }
        
        USART_puts(eUSARTF0,"    raw : ");    

        i=0;
        while(i<3)
        {
            itoa( gyroscope[i], buffer, 10);  // output 16 bit signed value to decimal.      
            USART_puts(eUSARTF0,buffer);
            if (i!=2) USART_puts(eUSARTF0,", ");
            i++;
        }
        USART_puts(eUSARTF0,"\r\n");

        _delay_ms(250); // wait 100ms so user can read something
        _delay_ms(250); // wait 100ms so user can read something
        _delay_ms(250); // wait 100ms so user can read something
        _delay_ms(250); // wait 100ms so user can read something
        
    }
Andrew-S
Всем спасибо за советы. Буду дальше экспериментировать. Получается действительно на моей стороне проблемы если у всех работает.

Цитата(mataor @ Apr 5 2012, 07:20) *
Добавлюсь и я в ваш огород)))
C этим гироскопом ковырялся полдня, ито в основном из-за того что сейчас начался ковыряццо с xmega128a3 и его TWI.

Код
    while (twiMaster.status != TWIM_STATUS_READY); // ждем

Я не знаком с этим контролером, поясните, пожалуйста, что это за статус?

Код
gyroscope[2]=((twiMaster.readData[5]<<8) | twiMaster.readData[4])/20;

И вот здесь не понятно зачем делить на 20?


Цитата(Alex_1811 @ Apr 4 2012, 22:31) *
Обрати особое внимание на питание.

С питанием вроде ОК.

Цитата(MrAlex @ Apr 4 2012, 22:28) *
Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут

Это как бы намек что я конфигурацию не проверил после записи?
mataor
TWIM_STATUS_READY - не обращайте внимания.... это просто бит отвечающий за окончание передачи/приема по i2c))) просто тут у меня оно так организовано чрез прерывания)))
деление на 20 - я кстати сам ток заметил))) сам кусок брал с MultiWii... кстати начинал опираясь на вот эту статейку https://sites.google.com/site/donutscience/...c-communication
а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23...

да кстати.... сам не совсем понял... но данные нужно читать начиная не с 0x28 регистра... а (0x80|0x28)
Andrew-S
Цитата(mataor @ Apr 5 2012, 17:06) *
а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23...

да кстати.... сам не совсем понял... но данные нужно читать начиная не с 0x28 регистра... а (0x80|0x28)

mataor, понял, спасибо! То есть у Вас аномалий не наблюдается в показаниях датчика. С регистрами конфигурации у меня как раз в порядке. По поводу адреса (0x80|0x28) - это нужно делать если нужно читать несколько подряд регистров одной командой чтения. Это описано в документации. Кстати в ней много опечаток, отсюда тоже возникают сомнения. Я пока не разобрался в чем у меня дело.
mataor
никаких аномалий нет... в спокойном положении при данных настройках макс отклонения сырых данных скачут +/-4, в среднем даже +/-2
Andrew-S
Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить?
ren5
Цитата(Andrew-S @ Apr 16 2012, 15:51) *
Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить?

не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях
Andrew-S
Цитата(ren5 @ Apr 16 2012, 17:28) *
не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях

А есть предыдущая ревизия этого документа, там все то же самое, но вместо 0.47мкФ стоит 470пФ.
Mityan
Извините, пожалуйста, может ли кто-нибудь разместить здесь для примера график - какие показания гироскоп выдает и при каких настройках.

А то я уже две недели мучаюсь, подозреваю, что микросхемы плохие, но мне не верят.
Настройки таковы:
CTRL_REG4 = 0xB0 (BDU = 1, FS = 2000 dps)
CTRL_REG5 = 0x40 (FIFO Enabled)
CTRL_REG1 = 0x0A (PD = 1, Y axis enabled only)

Читается и WHO_AM_I, и CTRL_REG1-CTRL_REG5 пачкой, значения совпадают с выставленными.
Схемотехника вроде правильная, включая номинал конденсатора в фильтре.
Питание 5 В от USB, затем LDO на 3 В - на VDD. Эти же 5 В на мк С8051, с выхода встроенного опорника которого 2.5 В на VDDIO гироскопа.
Когда читаю показания по осям, получаю какой-то мусор - шум, дисперсия которого зависит от приданных устройству угловых скоростей (начинаю вращать - всплески шума больше).

После чтения регистров делаю преобразование:
если 16-битное х число больше 32767, то х=х-65536 - из twos complement в знаковый
Затем умножаю на 0.07 для перевода в dps.

Вот результат: на 6-й секунде записи поворачиваю плату вокруг оси OY (OX отключена) на 360 градусов, на 14 секунде, держа плату горизонтально, отвожу руку в сторону, затем возвращаю назад.

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


Объясните мне еще такой момент, пожалуйста. В режиме selftest гироскоп должен постоянную величину выдавать (для 2000 dps это 530) и на движения не реагировать, или как? У меня все то же самое, только со смещением на 490 dps где-то.
Andrew-S
Mityan, получил такой график. Покачал плату с датчиком по трем осям. Частота съема 100 Гц. По оси абсцисс - номер выборки, по оси ординат - угловая скорость в градусах в секунду. Настройки такие :
CTL1 is 0X2f, CTL2 is 0X00, CTL3 is 0X00, CTL4 is 0X80, CTL5 is 0X02 . Остальные по-умолчанию. Читаю все угловые скорости пачкой - 6 байт. Регистр статуса в этом примере не проверяю. А по поводу выбросов о чем я писал тут несколько постов назад - все-таки думаю на дефект микросхем. Два датчика ведут себя похоже. Попробовал снизить скорость до 100 Гц (и опрос 100 Гц и реже) и выкинуть фильтры - работает несколько часов без нареканий. А если опрашивать чаще, что датчик еще не успевает обновить данные, то выбросы наблюдаются часто. За этим должен следить BDU, но у меня этот бит никак не влияет на поведение.
Нажмите для просмотра прикрепленного файла
Shopper
Кто-нибудь пробовал нагревать гироскоп до температуры выше 35 градусов? (у меня гиро стоит в закрытом корпусе, где есть сильно нагревающиеся компоненты)

У L3G4200D возникают странные глюки при повышении температуры.
При нагреве:
- Появляется серия скачков на выходе при определённой температуре
- Скачкообразно изменяется ноль и в разы повышается шум при другой температуре
При остывании:
- При той же температуре возникает серия скачков
- Скачкообразного изменения выхода больше не происходит.

Вот график:
http://www.zhopper.narod.ru/value_x_1.jpg
Ордината - выход гиро, температура * 100
Абсцисса - время. 2000 = 1сек.
- красный график выход гироскопа, ось Х
- синий график - температура, сырое значение

После повторной инициализации ничего с выходом гиро не происходит, вот повтор после инициализации:
http://www.zhopper.narod.ru/value_x_2.jpg

Лечится только выключением и повторным включением питания гиро.

Могут быть вариации:
- Скачок выхода без увеличения шума
- Отсутствие серии скачков
- Обнуление выхода температуры, всегда показывает 0.
Проверялось на 20-ти гиро с разных партий, все глючат.
Andrew-S
Цитата(Shopper @ Apr 26 2012, 00:08) *
Кто-нибудь пробовал нагревать гироскоп до температуры выше 35 градусов? (у меня гиро стоит в закрытом корпусе, где есть сильно нагревающиеся компоненты)

Shopper, я пробовал. У меня датчик стоит рядом с горячим вычислительным модулем и рабочая температура платы 35-40 градусов. Если бы были такие выбросы я заметил бы. На графике смущает полочка выброса по температуре, то есть выброс получается одного (или приблизительно) значения.
Shopper
Цитата(Andrew-S @ Apr 26 2012, 14:48) *
Shopper, я пробовал. У меня датчик стоит рядом с горячим вычислительным модулем и рабочая температура платы 35-40 градусов. Если бы были такие выбросы я заметил бы. На графике смущает полочка выброса по температуре, то есть выброс получается одного (или приблизительно) значения.


Можете попробовать подогреть чем либо свой гиро для эксперимента?

Там по температуре не просто полочка, а целая пачка выбросов, совпадающая с выбросами выхода гиро. Эта пачка выбросов возникает примерно при одной и той же температуре. При охлаждении появляется немного позже, с гистерезисом.
Кстати, читаю по SPI, массивом.

Больше всего напрягает изменение выхода гиро. Там не просто скачок "нуля", кроме этого увеличивается шум и выглядит он так:
http://www.zhopper.narod.ru/value_x_4_2.jpg
Практически синусоидальный сигнал.
Mityan
Цитата(Andrew-S @ Apr 23 2012, 09:57) *
Mityan, получил такой график. Покачал плату с датчиком по трем осям. Частота съема 100 Гц. По оси абсцисс - номер выборки, по оси ординат - угловая скорость в градусах в секунду. Настройки такие :
CTL1 is 0X2f, CTL2 is 0X00, CTL3 is 0X00, CTL4 is 0X80, CTL5 is 0X02 . Остальные по-умолчанию. Читаю все угловые скорости пачкой - 6 байт. Регистр статуса в этом примере не проверяю. А по поводу выбросов о чем я писал тут несколько постов назад - все-таки думаю на дефект микросхем. Два датчика ведут себя похоже. Попробовал снизить скорость до 100 Гц (и опрос 100 Гц и реже) и выкинуть фильтры - работает несколько часов без нареканий. А если опрашивать чаще, что датчик еще не успевает обновить данные, то выбросы наблюдаются часто. За этим должен следить BDU, но у меня этот бит никак не влияет на поведение.
Нажмите для просмотра прикрепленного файла


Спасибо. В общем мучался-мучался, потом заменили датчики на аналоговые муратовские ENC-03R. С них сигнал пошел сразу такой, как надо.
Shopper
Проблема, возникающая при повышении температуры L3G4200D решена.
Датчик НЕКОРРЕКТНО РАБОТАЕТ ПРИ ПИТАНИИ 3.3В и выше. Напряжение понижено до 3.0В, всё работает исправно. Никаких скачков при изменении температуры не происходит.
Ruslan1
Цитата(Shopper @ Aug 4 2012, 01:23) *
Проблема, возникающая при повышении температуры L3G4200D решена.
Датчик НЕКОРРЕКТНО РАБОТАЕТ ПРИ ПИТАНИИ 3.3В и выше. Напряжение понижено до 3.0В, всё работает исправно. Никаких скачков при изменении температуры не происходит.

Очень интересно, для каких еще продуктов ST с "Vddtyp=3.0V" это верно? sad.gif

Я бы сказал, что:
1. все параметры датчика в даташите даны при "Vdd = 3.0 V"
2. "The product is factory calibrated at 3.0 V."
3. в даташите не дано НИ ОДНОГО параметра для других напряжений питания в пределах "Wide supply voltage: 2.4 V to 3.6 V"
Артур
Товарищи, которые запустили, как коэффициент для нахождения угла рассчитывали ? А то моя математика не совпадает с математикой даташита.
Я считаю так при ODR=100Hz и диапазоне +/- 250dps :

((250*2)/2^16)/100=7,629E-5
Артур
Вроде нашел. Уже не актуально.
Acvarif
Вроде я попал туда куда надо. Стоит задачка определения крена и дифферента небольшого речного судна при его движении. Пытаюсь понять можно-ли с помощью данного датчика решить эту задачку с точностью 0.5 град и темпом 200 мс. Подскажите пожалуйста. Ведь датчик дает только скорость изменения углов.
Xenia
Цитата(Acvarif @ Feb 23 2015, 22:26) *
Пытаюсь понять можно-ли с помощью данного датчика решить эту задачку с точностью 0.5 град и темпом 200 мс. Подскажите пожалуйста. Ведь датчик дает только скорость изменения углов.


У меня вместо L3G4200D есть L3GD20. Производитель пишет, что они практически эквивалентны. Хотя мой L3GD20 якобы даже лучше т.к. является более новой моделью. Поэтому предлагает апгрейд L3G4200D на L3GD20:
http://www.st.com/st-web-ui/static/active/...keting_pres.pdf
Я же существенной разницы в обоих даташитах не нашла - и корпус у них одинаковый, и программирование тоже.

Мне так же, как и вам, нужны были углы, а не скорость. Поискав в интернете, нашла совет - суммировать скорости на протяжении какого-то времени и тогда эта сумма якобы будет пропорциональна углу, на которой за это время гироскоп изменит свое положение. Это похоже на правду, так как пройденный путь является интегралом скорости по времени. Только тут у нас скорость угловая, а потому после интегрирования или суммирования мы должны получить угол.

Однако у меня ничего хорошего с этой затеей не получилось, хотя не исключаю, что сама где-то напортачила. Эффект такой: зануляю суммы (они отдельно накапливаются по всем 3-м осям), поворачиваю гироcкоп на угол 90°, принимаю эту сумму за 90° (рассчитываю коэффициент пересчета = 90/сумма), потом умножением на этот коэффициент пересчитываю суммы в углы. Результат плачевный - угол определяется с большой ошибкой (до 10°), при повороте против часовой стрелки (в плоскости XY) набирается сумма большая, чем против часовой, из-за чего при обратном повороте в исходное положение получается не нуль, а сильно больше. Возможно, что этот эффект вызван шумом+смещением измеряемых величин в одну сторону от центра и моей неудачной попыткой это отклонение скомпенсировать.
Acvarif
Цитата(Xenia @ Feb 24 2015, 01:17) *
Мне так же, как и вам, нужны были углы, а не скорость. Поискав в интернете, нашла совет - суммировать скорости на протяжении какого-то времени и тогда эта сумма якобы будет пропорциональна углу, на которой за это время гироскоп изменит свое положение. Это похоже на правду, так как пройденный путь является интегралом скорости по времени. Только тут у нас скорость угловая, а потому после интегрирования или суммирования мы должны получить угол.

Думаю такой вариант пройдет если не нужны мгновенные углы. В моем случае предлагается это http://www.findpatent.ru/patent/248/2486098.html Толком не понял... Буду признателен если кто вкратце доступно пояснит в чем тут фишка.
Xenia
Цитата(Acvarif @ Feb 24 2015, 09:26) *
Думаю такой вариант пройдет если не нужны мгновенные углы.


Зачем вам мгновенные углы, если ваше ... корыто плавает медленно? sm.gif По электронным понятиям, конечно. Чем вам раз в секунду не нравится? Все равно рули вашей лодки вы быстрее, чем за одну секунду, с места не сдвините.

Но в принципе и по одному измерению можно сосчитать угол, ведь оно выдает скорость за период преобразования, а стало быть, тоже является интегралом. А частота преобразования там регулируемая (выбор из списка) в интервале от 95 Гц до 760 Гц. Я, например, использовала самую медленную частоту - 95 Гц, опрашивая гироскоп с частотой 96 Гц. И мне как-то странно, что для вашей лодки этого мало.
Acvarif
Может оно и так. Дело в том, что частота излучения впередсмотрящего эхолота (углы нужны для него) 200 мс. Угол нужен один раз за излучение. Понятно, что за это время можно проинтегрировать угловую скорость с датчика и рассчитать среднюю. Как из этих данных получить угол? Не врубаюсь. Что Вы думаете по поводу статьи с применением гироскопа и акселерометра?
A. Fig Lee
Не знаю насчет точности, но угол надо мерять с помощью LIS3DH и аналогичных. Разница в осях и даст угол
Xenia
Цитата(Acvarif @ Feb 24 2015, 10:40) *
Может оно и так. Дело в том, что частота излучения впередсмотрящего эхолота (углы нужны для него) 200 мс. Угол нужен один раз за излучение. Понятно, что за это время можно проинтегрировать угловую скорость с датчика и рассчитать среднюю. Как из этих данных получить угол? Не врубаюсь.

200 мс это видимо период, а не частота. А частотой с периодом 200 мс будет 5 Гц.

Берем самое медленное преобразование 95 Гц (оно меньше всего шумит). Ему соответствует период 1000/95 = 10.526 мс. Значит, за время 200 мс надо будет сделать 200/10.526 = 19 преобразований. Любопытно, что в вашем случае число получилось целое sm.gif. Следовательно, надо просуммировать 19 замеров подряд - эта величина и будет пропорциональна углу поворота за время 200 мс.

Разные премудрости на этот счет можно найти в статье "STM32 и гироскоп L3GD20. Часть 2.". Но, насколько я поняла, суммировать отсчеты придется и дальше, чтобы всегда знать текущий азимут. Ведь эти отсчеты соответствуют углу ПОВОРОТА за время изменения, на не угол наклона к горизонту или земной оси. Скажем, если за первые 200 мс ваша лодка повернулась по часовой стрелке (в плоскости XY) на угол +7°, а в следующие 200 мс еще на +5°, то в сумме она повернулась на 7+5=12°. Если станет поворачиваться в обратную сторону, гироскоп станет выдавать отрицательные углы поворота. Таким образом, в момент старта гироскоп должен быть ориентирован по сторонам света, а сумматор обнулен. А в дальнейшем эта сумма будет расти (при положительных измерениях) или убывать (при отрицательных измерениях).

Там (кажется в даташите) есть какие-то формулы, чтобы переводить текущую сумму в градусы. И если бы большой математик, то можете на здоровье с той формулой возиться. Я же предлагаю повернуть гироскоп на угол 90° (т.к. прямой угол легко определяется без транспортира) и попросту запомнить ту сумму, которая за время этого поворота набирается. А дальше пересчитываете суммы по пропорции, зная, какая величина соответствует 90°-ам. Не нравится вам мои 90° - поверните гироскоп на полный оборот - получите 360°, на них тоже можно калиброваться. Фактически я предлагаю вам откалибровать гироскоп, определив цену его деления экспериментально, а не колупаться в формулах.

Цитата(Acvarif @ Feb 24 2015, 10:40) *
Что Вы думаете по поводу статьи с применением гироскопа и акселерометра?

По поводу этой статьи я ничего ее думаю, т.к. ... не понимаю, что в ней написано. sm.gif
Acvarif
Цитата(Xenia @ Feb 25 2015, 03:40) *
200 мс это видимо период, а не частота. А частотой с периодом 200 мс будет 5 Гц.

Берем самое медленное преобразование 95 Гц (оно меньше всего шумит). Ему соответствует период 1000/95 = 10.526 мс. Значит, за время 200 мс надо будет сделать 200/10.526 = 19 преобразований. Любопытно, что в вашем случае число получилось целое sm.gif. Следовательно, надо просуммировать 19 замеров подряд - эта величина и будет пропорциональна углу поворота за время 200 мс.

Разные премудрости на этот счет можно найти в статье "STM32 и гироскоп L3GD20. Часть 2.". Но, насколько я поняла, суммировать отсчеты придется и дальше, чтобы всегда знать текущий азимут. Ведь эти отсчеты соответствуют углу ПОВОРОТА за время изменения, на не угол наклона к горизонту или земной оси. Скажем, если за первые 200 мс ваша лодка повернулась по часовой стрелке (в плоскости XY) на угол +7°, а в следующие 200 мс еще на +5°, то в сумме она повернулась на 7+5=12°. Если станет поворачиваться в обратную сторону, гироскоп станет выдавать отрицательные углы поворота. Таким образом, в момент старта гироскоп должен быть ориентирован по сторонам света, а сумматор обнулен. А в дальнейшем эта сумма будет расти (при положительных измерениях) или убывать (при отрицательных измерениях).

Там (кажется в даташите) есть какие-то формулы, чтобы переводить текущую сумму в градусы. И если бы большой математик, то можете на здоровье с той формулой возиться. Я же предлагаю повернуть гироскоп на угол 90° (т.к. прямой угол легко определяется без транспортира) и попросту запомнить ту сумму, которая за время этого поворота набирается. А дальше пересчитываете суммы по пропорции, зная, какая величина соответствует 90°-ам. Не нравится вам мои 90° - поверните гироскоп на полный оборот - получите 360°, на них тоже можно калиброваться. Фактически я предлагаю вам откалибровать гироскоп, определив цену его деления экспериментально, а не колупаться в формулах.


По поводу этой статьи я ничего ее думаю, т.к. ... не понимаю, что в ней написано. sm.gif

Спасибо. Стало яснее. Кроме того почитав этот материал http://www.poprobot.ru/theory/discrete_integration, который подтверждает Вашы выкладки про суммирование и этот http://www.poprobot.ru/theory/complementary_filter стало понятно совместное использование гироскопа и акселерометра.
Xenia
Цитата(Acvarif @ Feb 25 2015, 10:35) *
Спасибо. Стало яснее. Кроме того почитав этот материал http://www.poprobot.ru/theory/discrete_integration, который подтверждает Вашы выкладки про суммирование...


Не совсем, т.к. ни метод прямоугольников, ни метод трапеций, здесь не нужен, поскольку данный гироскоп выдает не мгновенное значение скорости, а среднее за весь период измерения! Это же видно из его поведения, поскольку измеренные значения возрастают, если я уменьшаю частоту измерений, и уменьшаются, если частота возрастает. Поэтому сумма, накопленная суммированием нескольких/многих измерений в течении одного и того же времени, получается приблизительно одинаковой. Т.е. если вы выберете большую частоту оцифровки, то измерения будут маленькими, но получится много слагаемых. А если оцифровывать медленнее, то, соответственно этому, каждый замер вырастет, но число слагаемых уменьшится. В итоге суммирования получите один и тот же результат, т.е. ... какими бы ломтями вы не нарезали буханку хлеба, в сумме его не станет ни больше, ни меньше.

Оно и правильно, т.к. суммарный угол поворота лодки не должен зависеть от того, с какой частотой у вас работает гироскоп. Соотвественно этому, и при повороте на 90° сумма должна набегать одинаковая, на какой-бы частоте вы гироскоп ни запускали. Но если сам промежуток времени больше периода оцифровки гироскопом, то выгоднее выбрать наименьшую скорость оцифровки, чтобы реже тот гироскоп опрашивать (слишком часто это делать погано, т.к. интерфейс у него I2C).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.