Bearpaw 0 2 января, 2012 Опубликовано 2 января, 2012 · Жалоба Привет всем! Пытаюсь запустить сей гироскоп по СПИ. МК - stm32f103. Проблемма заключается в том что по SPI я могу прочитать ТОЛЬКО регистр WHO_AM_I. Любой другой регистр я прочитать не могу. Но, судя по тому что из WHO_AM_I я читаю правильное (0xD3) значение, SPI работает. В чём может быть проблемма? Если надо выложу код. P.S.: я тут на платку посмотрел и мне кажется что может быть непропай на Vdd-контакте (Vdd-IO скорее всего работает норм, ибо не было бы ответа по SPI тогда, верно?), может ли это быть причиной такой неработоспособности? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
delphi_night 0 13 марта, 2012 Опубликовано 13 марта, 2012 · Жалоба Привет всем. Описанная в первом посте проблема на 100% совпала с моей. Я очень долго поднимал этот датчик, до этого все давалось легче и быстрее. Например акселерометр поднялся за 2 дня. А с этим, извините, дерьмом, провозился. Значит, проблема постоянных значений на выходе решилась в моем случае постоянным вызовом инициализации регистра 0x20. Странно, но его значение иногда портилось. Приходилось его обновлять. В схеме я не впаял фильтр ФАПЧ и тем, у кого подобная проблема, советую прозвонить эту цепь. Я думаю, что проблемы могут сидеть тут. Где-то через 3-4 дня выложим на robot-develop.org статью с кодом для этого датчика и для акселлерометра MMA7455L. Также есть подозрение на функции чтения и записи регистров. Я унаследовал их из кода для акселерометра (предыдущий проект). Попробую с другим вариантом, работающим в прерывании. Еще есть большое подозрение на качество партии этого дерьма. Я для интереса портировал ардуино либу и результат - как в начале статьи. Читаются несколько значений и потом не обновляются. Но код работает на модулях от polulu. Я негативно отношусь к качеству поставленных модулей. Потрачу еще 1 день на проверку косяков при чтении и записи, но мне кажется, дело именно в модулях. Покупал их в Терралектронике. Также было замечено, что при запрещении обновления значения регистра до конца чтения или записи ( output registers not updated until MSB and LSB reading) все благополучно виснет. Модуль не отвечает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
delphi_night 0 16 марта, 2012 Опубликовано 16 марта, 2012 · Жалоба Это проблема протокола. Он неправильно читает сразу несколько регистров. Внимательно изучайте диаграмму чтения нескольких регистров и правьте код, либо довольствуйтесь чтение регистров по одному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew-S 0 23 марта, 2012 Опубликовано 23 марта, 2012 (изменено) · Жалоба Как раз сейчас вожусь с этим датчиком. Настройки нужные (на мой взгляд) сделал, регистры читаю пачкой, начиная с температуры. Настроил ODR на 200 Гц, читаю с него с частотой 100Гц. Диапазон скоростей 500 град/с. Бит BDU выставил в 1. Получил интересный эффект. Датчик лежит неподвижно на столе. Читаю значения скоростей с регистров в районе нуля +- шумы. Но раз в несколько секунд (3-5с) получаю с некоторых осей значения типа 0x00FA, 0xFF13, 0xFF05, 0x00F9. Эти значения примерно соответствуют +-4 град/сек и отличаются от правильных значений на 1 байт. Такое ощущение что если у 0xFF13 выкинуть FF и оставить 0x0013, то получится адекватное значение, соответствующее отклонению в 0.3 град/сек. А если к 0x00F9 добавить старший байт FF, то получится 0xFFF9, вполне себе разумное значение около нуля. Куда копать дальше пока не знаю. При этом нет ошибок чтения i2c. Изменено 23 марта, 2012 пользователем Andrew-S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew-S 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Продолжаю исследования, пока безрезультатно. Попробовал подключить HPF и LPF2, результат тот же. Появилась мысль включить режим self test, выставил два бита ST0 и ST1 в CTRL4, но при этом режим не включился. Как были значения близкие к нулю на лежачей плате, так и остались. Отсюда возникло сомнение, либо этот режим несовместим с какими-либо фильтрами и работает только при определенной конфигурации, либо устройство неадекватно воспринимает конфигурацию. Тогда может и контроль за целостностью, управляемый BDU не работает. Есть какие-нибудь мысли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alecsej 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey_1811 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Обрати особое внимание на питание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mataor 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Добавлюсь и я в ваш огород))) 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 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 (изменено) · Жалоба Всем спасибо за советы. Буду дальше экспериментировать. Получается действительно на моей стороне проблемы если у всех работает. Добавлюсь и я в ваш огород))) C этим гироскопом ковырялся полдня, ито в основном из-за того что сейчас начался ковыряццо с xmega128a3 и его TWI. while (twiMaster.status != TWIM_STATUS_READY); // ждем Я не знаком с этим контролером, поясните, пожалуйста, что это за статус? gyroscope[2]=((twiMaster.readData[5]<<8) | twiMaster.readData[4])/20; И вот здесь не понятно зачем делить на 20? Обрати особое внимание на питание. С питанием вроде ОК. Может поучиться записи регистров с последующим чтением и сравнением? Может и остальные вопросы отпадут Это как бы намек что я конфигурацию не проверил после записи? Изменено 5 апреля, 2012 пользователем Andrew-S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mataor 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 (изменено) · Жалоба TWIM_STATUS_READY - не обращайте внимания.... это просто бит отвечающий за окончание передачи/приема по i2c))) просто тут у меня оно так организовано чрез прерывания))) деление на 20 - я кстати сам ток заметил))) сам кусок брал с MultiWii... кстати начинал опираясь на вот эту статейку https://sites.google.com/site/donutscience/...c-communication а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23... да кстати.... сам не совсем понял... но данные нужно читать начиная не с 0x28 регистра... а (0x80|0x28) Изменено 5 апреля, 2012 пользователем mataor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew-S 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23... да кстати.... сам не совсем понял... но данные нужно читать начиная не с 0x28 регистра... а (0x80|0x28) mataor, понял, спасибо! То есть у Вас аномалий не наблюдается в показаниях датчика. С регистрами конфигурации у меня как раз в порядке. По поводу адреса (0x80|0x28) - это нужно делать если нужно читать несколько подряд регистров одной командой чтения. Это описано в документации. Кстати в ней много опечаток, отсюда тоже возникают сомнения. Я пока не разобрался в чем у меня дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mataor 0 6 апреля, 2012 Опубликовано 6 апреля, 2012 (изменено) · Жалоба никаких аномалий нет... в спокойном положении при данных настройках макс отклонения сырых данных скачут +/-4, в среднем даже +/-2 Изменено 6 апреля, 2012 пользователем mataor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew-S 0 16 апреля, 2012 Опубликовано 16 апреля, 2012 · Жалоба Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ren5 0 16 апреля, 2012 Опубликовано 16 апреля, 2012 · Жалоба Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить? не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrew-S 0 17 апреля, 2012 Опубликовано 17 апреля, 2012 · Жалоба не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях А есть предыдущая ревизия этого документа, там все то же самое, но вместо 0.47мкФ стоит 470пФ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться