|
|
 |
Ответов
(15 - 29)
|
Jan 2 2012, 19:49
|
Группа: Новичок
Сообщений: 1
Регистрация: 28-12-11
Пользователь №: 69 140

|
Привет всем! Пытаюсь запустить сей гироскоп по СПИ. МК - stm32f103. Проблемма заключается в том что по SPI я могу прочитать ТОЛЬКО регистр WHO_AM_I. Любой другой регистр я прочитать не могу. Но, судя по тому что из WHO_AM_I я читаю правильное (0xD3) значение, SPI работает. В чём может быть проблемма? Если надо выложу код.
P.S.: я тут на платку посмотрел и мне кажется что может быть непропай на Vdd-контакте (Vdd-IO скорее всего работает норм, ибо не было бы ответа по SPI тогда, верно?), может ли это быть причиной такой неработоспособности?
|
|
|
|
|
Mar 13 2012, 17:19
|
Группа: Участник
Сообщений: 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) все благополучно виснет. Модуль не отвечает.
|
|
|
|
|
Mar 16 2012, 14:02
|
Группа: Участник
Сообщений: 11
Регистрация: 11-03-11
Пользователь №: 63 544

|
Это проблема протокола. Он неправильно читает сразу несколько регистров. Внимательно изучайте диаграмму чтения нескольких регистров и правьте код, либо довольствуйтесь чтение регистров по одному.
|
|
|
|
|
Mar 23 2012, 14:24
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 4 2012, 10:51
|
Участник

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

|
Продолжаю исследования, пока безрезультатно. Попробовал подключить HPF и LPF2, результат тот же. Появилась мысль включить режим self test, выставил два бита ST0 и ST1 в CTRL4, но при этом режим не включился. Как были значения близкие к нулю на лежачей плате, так и остались. Отсюда возникло сомнение, либо этот режим несовместим с какими-либо фильтрами и работает только при определенной конфигурации, либо устройство неадекватно воспринимает конфигурацию. Тогда может и контроль за целостностью, управляемый BDU не работает. Есть какие-нибудь мысли?
|
|
|
|
|
Apr 5 2012, 04:20
|
Группа: Новичок
Сообщений: 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 }
|
|
|
|
|
Apr 5 2012, 06:16
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 5 2012, 14:06
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 5 2012, 18:03
|
Участник

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

|
Цитата(mataor @ Apr 5 2012, 17:06)  а так по конфигурации... кстати тож был косяк пока разбирался с i2c - тож фиг работало когда массивом пытался загнать... потом допер прочитать регистры - а у меня тама муть.... плюнул и сделал запись по каждому регистру отдельно))) в основном нам нужны 2 - 0x20 и 0x24 ну и иногда возможно 0x23...
да кстати.... сам не совсем понял... но данные нужно читать начиная не с 0x28 регистра... а (0x80|0x28) mataor, понял, спасибо! То есть у Вас аномалий не наблюдается в показаниях датчика. С регистрами конфигурации у меня как раз в порядке. По поводу адреса (0x80|0x28) - это нужно делать если нужно читать несколько подряд регистров одной командой чтения. Это описано в документации. Кстати в ней много опечаток, отсюда тоже возникают сомнения. Я пока не разобрался в чем у меня дело.
|
|
|
|
|
Apr 6 2012, 15:05
|
Группа: Новичок
Сообщений: 3
Регистрация: 5-04-12
Пользователь №: 71 191

|
никаких аномалий нет... в спокойном положении при данных настройках макс отклонения сырых данных скачут +/-4, в среднем даже +/-2
Сообщение отредактировал mataor - Apr 6 2012, 15:07
|
|
|
|
|
Apr 16 2012, 11:51
|
Участник

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

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

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

|
Цитата(Andrew-S @ Apr 16 2012, 15:51)  Посмотрите, пожалуйста, какие у вас конденсаторы стоят в цепочке внешнего НЧ-фильтра? По двум даташитам приведены разные номиналы 470 пФ и 470 нФ. Кому верить? не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях
--------------------
|
|
|
|
|
Apr 17 2012, 05:37
|
Участник

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

|
Цитата(ren5 @ Apr 16 2012, 17:28)  не знаю какие даташиты ты смотрел, но он дин, лежит на сайте ST, и там один кондер 10нф, другой в цепи с резистором на 10к имеет номинал 0,47мкф, если поставиш меньше, будут конкретные глюки в показаниях А есть предыдущая ревизия этого документа, там все то же самое, но вместо 0.47мкФ стоит 470пФ.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|