Перейти к содержанию
    

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

Если надо выложу код.

 

P.S.: я тут на платку посмотрел и мне кажется что может быть непропай на Vdd-контакте (Vdd-IO скорее всего работает норм, ибо не было бы ответа по SPI тогда, верно?), может ли это быть причиной такой неработоспособности?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет всем. Описанная в первом посте проблема на 100% совпала с моей. Я очень долго поднимал этот датчик, до этого все давалось легче и быстрее. Например акселерометр поднялся за 2 дня. А с этим, извините, дерьмом, провозился. Значит, проблема постоянных значений на выходе решилась в моем случае постоянным вызовом инициализации регистра 0x20. Странно, но его значение иногда портилось. Приходилось его обновлять. В схеме я не впаял фильтр ФАПЧ и тем, у кого подобная проблема, советую прозвонить эту цепь. Я думаю, что проблемы могут сидеть тут.

Где-то через 3-4 дня выложим на robot-develop.org статью с кодом для этого датчика и для акселлерометра MMA7455L. Также есть подозрение на функции чтения и записи регистров. Я унаследовал их из кода для акселерометра (предыдущий проект). Попробую с другим вариантом, работающим в прерывании. Еще есть большое подозрение на качество партии этого дерьма. Я для интереса портировал ардуино либу и результат - как в начале статьи. Читаются несколько значений и потом не обновляются. Но код работает на модулях от polulu. Я негативно отношусь к качеству поставленных модулей. Потрачу еще 1 день на проверку косяков при чтении и записи, но мне кажется, дело именно в модулях. Покупал их в Терралектронике.

Также было замечено, что при запрещении обновления значения регистра до конца чтения или записи ( output registers not updated until MSB and LSB

reading) все благополучно виснет. Модуль не отвечает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это проблема протокола. Он неправильно читает сразу несколько регистров. Внимательно изучайте диаграмму чтения нескольких регистров и правьте код, либо довольствуйтесь чтение регистров по одному.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как раз сейчас вожусь с этим датчиком. Настройки нужные (на мой взгляд) сделал, регистры читаю пачкой, начиная с температуры. Настроил 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 не работает. Есть какие-нибудь мысли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавлюсь и я в ваш огород)))

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
        
    }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Добавлюсь и я в ваш огород)))

C этим гироскопом ковырялся полдня, ито в основном из-за того что сейчас начался ковыряццо с xmega128a3 и его TWI.

 

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

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

 

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

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

 

 

Обрати особое внимание на питание.

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

 

Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут

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

Изменено пользователем Andrew-S

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TWIM_STATUS_READY - не обращайте внимания.... это просто бит отвечающий за окончание передачи/приема по i2c))) просто тут у меня оно так организовано чрез прерывания)))

деление на 20 - я кстати сам ток заметил))) сам кусок брал с MultiWii... кстати начинал опираясь на вот эту статейку https://sites.google.com/site/donutscience/...c-communication

а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23...

 

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

Изменено пользователем mataor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23...

 

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

mataor, понял, спасибо! То есть у Вас аномалий не наблюдается в показаниях датчика. С регистрами конфигурации у меня как раз в порядке. По поводу адреса (0x80|0x28) - это нужно делать если нужно читать несколько подряд регистров одной командой чтения. Это описано в документации. Кстати в ней много опечаток, отсюда тоже возникают сомнения. Я пока не разобрался в чем у меня дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем mataor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А есть предыдущая ревизия этого документа, там все то же самое, но вместо 0.47мкФ стоит 470пФ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...