реклама на сайте
подробности

 
 
> Кто работал с L3G4200D?
Alexander_84
сообщение Apr 4 2011, 08:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 14-09-08
Пользователь №: 40 181



Здравствуйте, с гироскопами сталкиваюсь впервые. Вообщем задача пока просто измерять углы по 2 осям. Гироскоп подлючен по I2C к ARM. Интерфейс работает нормально (регистр WHO_AM_I считывется правильно), а когда пытаюсь считывать углы получаю ерунду: устройво лежит в покое, при этом показания например по оси x меняютя ( принимают значения 30000, 60000, 771, 64000...). Из настроек по умолчанию в CTRL_REG1 изменил power_down на normal_mode и DATA_RATE поставил 200Гц, в CTRL_REG4 BDU поставил в 1. С настройками по умолчанию считываю первый раз значение и больше оно не меняется при вращении устройства. Вообщем как заставить это работать и измеряется абсолютный угол или изменение угла?
Go to the top of the page
 
+Quote Post
4 страниц V  < 1 2 3 4 >  
Start new topic
Ответов (15 - 29)
Bearpaw
сообщение Jan 2 2012, 19:49
Сообщение #16





Группа: Новичок
Сообщений: 1
Регистрация: 28-12-11
Пользователь №: 69 140



Привет всем! Пытаюсь запустить сей гироскоп по СПИ. МК - stm32f103. Проблемма заключается в том что по SPI я могу прочитать ТОЛЬКО регистр WHO_AM_I. Любой другой регистр я прочитать не могу. Но, судя по тому что из WHO_AM_I я читаю правильное (0xD3) значение, SPI работает. В чём может быть проблемма?
Если надо выложу код.

P.S.: я тут на платку посмотрел и мне кажется что может быть непропай на Vdd-контакте (Vdd-IO скорее всего работает норм, ибо не было бы ответа по SPI тогда, верно?), может ли это быть причиной такой неработоспособности?
Go to the top of the page
 
+Quote Post
delphi
сообщение Mar 13 2012, 17:19
Сообщение #17





Группа: Участник
Сообщений: 11
Регистрация: 11-03-11
Пользователь №: 63 544



Привет всем. Описанная в первом посте проблема на 100% совпала с моей. Я очень долго поднимал этот датчик, до этого все давалось легче и быстрее. Например акселерометр поднялся за 2 дня. А с этим, извините, дерьмом, провозился. Значит, проблема постоянных значений на выходе решилась в моем случае постоянным вызовом инициализации регистра 0x20. Странно, но его значение иногда портилось. Приходилось его обновлять. В схеме я не впаял фильтр ФАПЧ и тем, у кого подобная проблема, советую прозвонить эту цепь. Я думаю, что проблемы могут сидеть тут.
Где-то через 3-4 дня выложим на robot-develop.org статью с кодом для этого датчика и для акселлерометра MMA7455L. Также есть подозрение на функции чтения и записи регистров. Я унаследовал их из кода для акселерометра (предыдущий проект). Попробую с другим вариантом, работающим в прерывании. Еще есть большое подозрение на качество партии этого дерьма. Я для интереса портировал ардуино либу и результат - как в начале статьи. Читаются несколько значений и потом не обновляются. Но код работает на модулях от polulu. Я негативно отношусь к качеству поставленных модулей. Потрачу еще 1 день на проверку косяков при чтении и записи, но мне кажется, дело именно в модулях. Покупал их в Терралектронике.
Также было замечено, что при запрещении обновления значения регистра до конца чтения или записи ( output registers not updated until MSB and LSB
reading) все благополучно виснет. Модуль не отвечает.
Go to the top of the page
 
+Quote Post
delphi
сообщение Mar 16 2012, 14:02
Сообщение #18





Группа: Участник
Сообщений: 11
Регистрация: 11-03-11
Пользователь №: 63 544



Это проблема протокола. Он неправильно читает сразу несколько регистров. Внимательно изучайте диаграмму чтения нескольких регистров и правьте код, либо довольствуйтесь чтение регистров по одному.
Go to the top of the page
 
+Quote Post
Andrew-S
сообщение Mar 23 2012, 14:24
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 18-01-06
Пользователь №: 13 333



Как раз сейчас вожусь с этим датчиком. Настройки нужные (на мой взгляд) сделал, регистры читаю пачкой, начиная с температуры. Настроил 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 - Mar 23 2012, 14:25
Go to the top of the page
 
+Quote Post
Andrew-S
сообщение Apr 4 2012, 10:51
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 18-01-06
Пользователь №: 13 333



Продолжаю исследования, пока безрезультатно. Попробовал подключить HPF и LPF2, результат тот же. Появилась мысль включить режим self test, выставил два бита ST0 и ST1 в CTRL4, но при этом режим не включился. Как были значения близкие к нулю на лежачей плате, так и остались. Отсюда возникло сомнение, либо этот режим несовместим с какими-либо фильтрами и работает только при определенной конфигурации, либо устройство неадекватно воспринимает конфигурацию. Тогда может и контроль за целостностью, управляемый BDU не работает. Есть какие-нибудь мысли?
Go to the top of the page
 
+Quote Post
MrAlex
сообщение Apr 4 2012, 19:28
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 15-10-10
Из: г. Москва
Пользователь №: 60 179



Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут
Go to the top of the page
 
+Quote Post
Alex_1811
сообщение Apr 4 2012, 19:31
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 178
Регистрация: 31-10-06
Из: Яблунець
Пользователь №: 21 821



Обрати особое внимание на питание.
Go to the top of the page
 
+Quote Post
mataor
сообщение Apr 5 2012, 04:20
Сообщение #23





Группа: Новичок
Сообщений: 3
Регистрация: 5-04-12
Пользователь №: 71 191



Добавлюсь и я в ваш огород)))
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
        
    }
Go to the top of the page
 
+Quote Post
Andrew-S
сообщение Apr 5 2012, 06:16
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 18-01-06
Пользователь №: 13 333



Всем спасибо за советы. Буду дальше экспериментировать. Получается действительно на моей стороне проблемы если у всех работает.

Цитата(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) *
Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут

Это как бы намек что я конфигурацию не проверил после записи?

Сообщение отредактировал Andrew-S - Apr 5 2012, 06:29
Go to the top of the page
 
+Quote Post
mataor
сообщение Apr 5 2012, 14:06
Сообщение #25





Группа: Новичок
Сообщений: 3
Регистрация: 5-04-12
Пользователь №: 71 191



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

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

Сообщение отредактировал mataor - Apr 5 2012, 14:08
Go to the top of the page
 
+Quote Post
Andrew-S
сообщение Apr 5 2012, 18:03
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 18-01-06
Пользователь №: 13 333



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

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

mataor, понял, спасибо! То есть у Вас аномалий не наблюдается в показаниях датчика. С регистрами конфигурации у меня как раз в порядке. По поводу адреса (0x80|0x28) - это нужно делать если нужно читать несколько подряд регистров одной командой чтения. Это описано в документации. Кстати в ней много опечаток, отсюда тоже возникают сомнения. Я пока не разобрался в чем у меня дело.
Go to the top of the page
 
+Quote Post
mataor
сообщение Apr 6 2012, 15:05
Сообщение #27





Группа: Новичок
Сообщений: 3
Регистрация: 5-04-12
Пользователь №: 71 191



никаких аномалий нет... в спокойном положении при данных настройках макс отклонения сырых данных скачут +/-4, в среднем даже +/-2

Сообщение отредактировал mataor - Apr 6 2012, 15:07
Go to the top of the page
 
+Quote Post
Andrew-S
сообщение Apr 16 2012, 11:51
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 18-01-06
Пользователь №: 13 333



Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить?
Go to the top of the page
 
+Quote Post
ren5
сообщение Apr 16 2012, 14:28
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 137
Регистрация: 17-11-08
Из: Ростов
Пользователь №: 41 700



Цитата(Andrew-S @ Apr 16 2012, 15:51) *
Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить?

не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях


--------------------
Go to the top of the page
 
+Quote Post
Andrew-S
сообщение Apr 17 2012, 05:37
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 18-01-06
Пользователь №: 13 333



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

А есть предыдущая ревизия этого документа, там все то же самое, но вместо 0.47мкФ стоит 470пФ.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01539 секунд с 7
ELECTRONIX ©2004-2016