Здравствуйте! Возникла необходимость изменения частоты акселерометра LIS331DLH, входящего в состав Troyka-модуля. Необходимо с заводских 50 герц поменять на 1000, что возможно, исходя из технической документации. В файле "LPS331.cpp" библиотеки "Troyka-IMU-master" в процедуре writeReg(LPS331_CTRL_REG1, 0b11100000); вношу соответствующие изменения, а именно writeReg(LPS331_CTRL_REG1, 0b11111100); но, к сожалению,никаких частотных изменений при работе датчика не происходит. Это известно потому, что в основной программе реализован обработчик прерываний с частотой 50 герц. при увеличении частоты таймера происходит дублирование значений ускорения по 6-7 раз. Подскажите пожалуйста, как решить данный вопрос? С задачей программирования и использования данных модулей и ардуино я столкнулась недавно,многого ещё не знаю.
Попробуйте 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.
writeReg(LPS331_CTRL_REG1, 0b11100000); - странная запись, ведь 0b11100000 соответствует PM2=PM1=PM0=1 => invalid value, DR1=DR0=0 => 50Hz, Zen=Yen=Zen=0 => X,Y,Z disabled. Даже если биты в обратном порядке идут, все равно ерунда какая-то...
я меняла биты в регистре на основе соображений что по умолчанию Zen=Yen=Zen=1 , следовательно младшие биты этого регистра в библиотечном коде идут первые. Заменила на предложенный Вами вариант, снова никаких изменений.
Вот в том то и странность, что если в библиотеке биты записаны в обратном порядке, тогда выходит что PMn=0 что суть Power down.
Спасибо! я разобралась вроде) получилось так, что не учла частоту serial порта, задавала её достаточно высокую(115200) , следовательно и измерения дублировались.
Изменение writeReg(LPS331_CTRL_REG1, 0b11111100); не дали результата, потому что эта библиотека не используется вовсе. Тем более что в ней ошибка инициализации.
изменение частоты опроса нужно записать напрямую в регистры конфигурации осторожно, читая документацию акселерометра LIS331DLH
Код (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();
Спасибо! а подскажите пожалуйста,данный код нужно выполнять в основной программе в цикле setup? библиотечные файлы получается лучше не менять...
Если хочется можно встроить функцию записи регистров конфигурации в библиотеку. Или вообще оформить в отдельную функцию. Код конфигурации регистров выполняйте там, где вам нужно, setup выполняется один раз во время старта микроконтроллера. Соответственно настройка LIS331DLH будет выполнена один раз. Далее основная программа все время крутиться в цикле loop(). Если нужно будет изменить конфигурацию LIS331DLH на лету, то просто вызвать написанную функцию записи конфигурации регистров LIS331DLH.
Оно там уже есть... Код (C++): // writes register void LPS331::writeReg(byte reg, byte value) { Wire.beginTransmission(address); Wire.write(reg); Wire.write(value); Wire.endTransmission(); }
да, вопрос решен) был неисправный датчик. теперь достаточно изменений в библиотеке и всё работает. Спасибо!