Смена частоты сигнала акселерометра Troyka-модуля

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем siriniti, 22 фев 2016.

  1. siriniti

    siriniti Нуб

    Здравствуйте! Возникла необходимость изменения частоты акселерометра LIS331DLH, входящего в состав Troyka-модуля. Необходимо с заводских 50 герц поменять на 1000, что возможно, исходя из технической документации. В файле "LPS331.cpp" библиотеки "Troyka-IMU-master" в процедуре writeReg(LPS331_CTRL_REG1, 0b11100000); вношу соответствующие изменения, а именно writeReg(LPS331_CTRL_REG1, 0b11111100); но, к сожалению,никаких частотных изменений при работе датчика не происходит. Это известно потому, что в основной программе реализован обработчик прерываний с частотой 50 герц. при увеличении частоты таймера происходит дублирование значений ускорения по 6-7 раз. Подскажите пожалуйста, как решить данный вопрос? С задачей программирования и использования данных модулей и ардуино я столкнулась недавно,многого ещё не знаю.
     
  2. Unixon

    Unixon Оракул Модератор

    Попробуйте writeReg(LPS331_CTRL_REG1, 0b00111111);
    PM2=PM1=0, PM0=1 => Normal mode, DR1=DR0=1 => 1000Hz, Zen=Yen=Xen=1 => X,Y,Z axes enabled.
     

    Вложения:

  3. Unixon

    Unixon Оракул Модератор

    writeReg(LPS331_CTRL_REG1, 0b11100000); - странная запись, ведь 0b11100000 соответствует PM2=PM1=PM0=1 => invalid value, DR1=DR0=0 => 50Hz, Zen=Yen=Zen=0 => X,Y,Z disabled.
    Даже если биты в обратном порядке идут, все равно ерунда какая-то...
     
  4. siriniti

    siriniti Нуб

    я меняла биты в регистре на основе соображений что по умолчанию Zen=Yen=Zen=1 , следовательно младшие биты этого регистра в библиотечном коде идут первые. Заменила на предложенный Вами вариант, снова никаких изменений.
     
  5. Unixon

    Unixon Оракул Модератор

    Вот в том то и странность, что если в библиотеке биты записаны в обратном порядке, тогда выходит что PMn=0 что суть Power down.
     
  6. Unixon

    Unixon Оракул Модератор

    Ну, если биты перевернуть, то должно быть writeReg(LPS331_CTRL_REG1, 0b11111100);
     
  7. Limoney

    Limoney Гик

    а кому отвечать
     
  8. siriniti

    siriniti Нуб

    Спасибо! я разобралась вроде) получилось так, что не учла частоту serial порта, задавала её достаточно высокую(115200) , следовательно и измерения дублировались.
     
  9. Limoney

    Limoney Гик

    Изменение writeReg(LPS331_CTRL_REG1, 0b11111100);
    не дали результата, потому что эта библиотека не используется вовсе.
    Тем более что в ней ошибка инициализации.
     
  10. Limoney

    Limoney Гик

    изменение частоты опроса нужно записать напрямую в регистры конфигурации
    осторожно, читая документацию акселерометра LIS331DLH
     
  11. Limoney

    Limoney Гик

    Код (C++):
    #include <Wire.h>
    <...>
    Wire.beginTransmission(_addr);
    Wire.write(regadres);
    Wire.write(value);
    Wire.endTransmission();    
    где
    _addr – адрес акселерометра
    regadres – адрес регистра конфигурации
    value –значение регистра конфигурации
    Пример
    изменения частоты акселерометра LIS331DLH c 50 Hz на 1000 Hz
    оси Z, Y, X разрешены
    Код (C++):
    Wire.begin();
    Wire.beginTransmission(0b0011000);    // ADDRESS
    Wire.write(0x20);     // CTRL_REG1 (20h)
    Wire.write(0b00111111);
    Wire.endTransmission();    
    Image1.jpg
    Image2.jpg
     
  12. siriniti

    siriniti Нуб

    Спасибо! а подскажите пожалуйста,данный код нужно выполнять в основной программе в цикле setup? библиотечные файлы получается лучше не менять...
     
  13. Limoney

    Limoney Гик

    Если хочется можно встроить функцию записи регистров конфигурации в библиотеку.
    Или вообще оформить в отдельную функцию.
    Код конфигурации регистров выполняйте там, где вам нужно, setup выполняется один раз во время старта микроконтроллера. Соответственно настройка LIS331DLH будет выполнена один раз. Далее основная программа все время крутиться в цикле loop().
    Если нужно будет изменить конфигурацию LIS331DLH на лету, то просто вызвать написанную функцию записи конфигурации регистров LIS331DLH.
     
  14. siriniti

    siriniti Нуб

    Спасибо большое за ответы!
     
  15. Limoney

    Limoney Гик

    Пожалуйста!
     
  16. Unixon

    Unixon Оракул Модератор

    Оно там уже есть...
    Код (C++):
    // writes register
    void LPS331::writeReg(byte reg, byte value)
    {
      Wire.beginTransmission(address);
      Wire.write(reg);
      Wire.write(value);
      Wire.endTransmission();
    }
     
  17. siriniti

    siriniti Нуб

    да, вопрос решен) был неисправный датчик. теперь достаточно изменений в библиотеке и всё работает. Спасибо!