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

Работа акселерометра LIS3DH с STM32

Написал прогу для инициализации и считывания данных с LIS3DH. Со значениями творится полная ерунда. На одно истинное значение приходится 1-5 ложных (лежащих в пределах -200 до 300). Если данные визуализировать, получается дёрганная кривая. Прерывания не использовал. В чём может быть проблема?

 

Код main.rar

post-86181-1438696832_thumb.jpg

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

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


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

stas00n, Поменял, стало ещё хуже.

Текущие значения близки к правде, но я совсем не понимаю почему кривая скачет.

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


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

вы неправильно про работу SPI прочитали

 

    /// \fn uint8_t RW(const uint8_t pData)
    /// Запись-чтение данных.
    /// Данная функция записывает значение в буфер отправки SPI. По окончанию
    /// отправки возвращает значение принятое по SPI.
    /// \param pData - значение отправляемое по SPI.
    /// \return значение принятое по SPI.
    uint8_t RW(const uint8_t pData)
    {
        SPI_I2S_SendData(mSPI, pData);
        while(SPI_I2S_GetFlagStatus(mSPI, SPI_I2S_FLAG_RXNE) == RESET);

        return SPI_I2S_ReceiveData(mSPI);
    }

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


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

smalcom Обоснуйте почему я неправильно с SPI работаю.

На всякий случай попробовал вариант с флагом SPI_I2S_FLAG_RXNE, но это не поменяло абсолютно ничего.

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


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

Наверное косяк с L и H, я помню что они там хитро расчитываются, и вроде бы даже косяк в даташите был... Такая тема уже была на форуме

Upd: там не должно быть нолей в плоскости паралелльной к земле должно быть 1g

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

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


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

veteq Не нашёл я тему где бы обсуждалась моя проблема, буду признателен если дадите ссылку.

По поводу оси Z понятно, но не понятно это post-86181-1438719912_thumb.jpg Притяжение земли явно просматривается, но по непонятным причинам появляются левые значение которые лежат около нуля как в большую так и в меньшую сторону.

 

По поводу L и H вроде всё понятно и самое главное что оно работает кое как, значит косяк, как мне кажется, не в этом.

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

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


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

Обоснуйте почему я неправильно с SPI работаю.

Эммм. У меня хорошее настроение, подсказка 50 на 50 ))

 

Как вы записываете

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
return SPI_I2S_ReceiveData(SPI1);

 

Как надо

SPI_I2S_SendData(mSPI, pData);
while(SPI_I2S_GetFlagStatus(mSPI, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(mSPI);

 

Ещё осталась "звонок другу"(цитата из даташита) )) и "помошь зала"(разжовка цитаты из даташита)

 

зы. ванга подсказывает, что у вас нет логического анализатора

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


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

Пока нет. Сейчас буду пробовать настраивать работу по прерыванию и включу фильтр.

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


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

Для начала попробовать проверить работу SPI, постоянно вычитывая WHO_AM_I - 0x0F

 

У меня на пинах 5,6,7 подтяжка на землю стоит, и SPI SPI_CPHA_1Edge и SPI_CPOL_Low

 

signed short value;
unsigned char *valueL = (unsigned char *) (&value);
unsigned char *valueH = ((unsigned char *) (&value) + 1);

*valueL = SPI.CommandReceived[5];
*valueH = SPI.CommandReceived[6];

if ((value & (1 << 15)) != 0) {
MEMS.Z = (value >> 4) | 0xF000;
}
else {
MEMS.Z = value >> 4;
}

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


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

LIS3DH сами паяли или готовый модуль использовали? Если паяли сами, как получится, то могли термо перекос обеспечить. Было уменя такое при первых экспериментах. Графики похожие, как у вас тогда получились.

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


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

veteq SPI работает корректно. WHO_AM_I возвращает значение 3F. B И данные из акселерометра приходят правильные, явно видно когда я перемещаю микросхему, только вот непонятно откуда берутся бредовые данные. Думал может в регистрах данные не успевают обновится, но когда увеличивал скорость обновления данных в акселерометре ситуацию это не меняло.

 

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

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

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


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

Как вариант попробовать еще в отладчике пошагать по кольцу функциям передачи по SPI , а то ощущение создается что SPI как-то не так работает

 

вот по этим функциям пройтись отладчиком, каждый шаг и постоянно,(т.е. на каждую функцию будет уходить около секунды) будут ли всплывать нули?

 

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

SPI_I2S_SendData(SPI1, data);

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

return SPI_I2S_ReceiveData(SPI1);

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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