Помогите разобраться с акселерометром LIS331DLH от амперки

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Николай19971997, 17 окт 2019.

  1. Здравствуйте. Нужно считывать данные с акселерометра LIS331DLH и записывать на sd карту все три оси. В роли средств использую контроллер atmega32,код пишу в atmel stuido. Собственно проблем с записью на sd карту нет,проблема с акселерометром. Точнее проблемы нету,я просто не знаю,есть ли она тут,вот я и хотел бы чтобы вы мне подсказали.
    С акселерометром я никогда не работал и понятия не имеют, что он измеряет и как эти данные интерпретировать. Я написал программу для акселерометра, которая считывает с него данные по аппаратному i2c и всё пишется на карту,но проблема с выходными данными.

    Ниже опишу вопрос.
    Собственно, настроил аппаратный i2c на 100 кгЦ. Для проверки считал с акселерометра значение регистра who_am_i.
    хуэмай.png
    Считал и получил 0x32 как и положено. То есть с интерфейсом всё нормально.
    Далее я решил настроить регистры акселерометра,согласно документации.
    В регистре CTRL_REG1 я установил биты PM0,DR1,DR0,Xen,Yen,Zen
    PM0 я устанавливаю,чтобы вывести его из режима power-down
    DR0,DR1 - выбираю частоту выборки 1 кГц
    В регистре CTRL_REG4 я установил биты DBU,FS0,FS1
    DBU - чтобы буфер был при чтении осей
    FS0,FS1 - выбираю 8g. Не знаю что такое 8g. Мне сказали что им нужно такое значение.

    Собственно дальше начинается проблема. Далее мне нужно считывать сами оси,каждая ось по два байта - старший и младший. Но в документации что то не подробно раскрыт момент того, сколько бит из этих двух байт реально несут какую то информацию. На первой странице документации написано, что выходные данные 16 - битные.
    bit16.png
    далее,уже через пару страниц,написано что данные 12 битные.
    ещ1.png
    Плюс к этому,ещё в описании регистров написано,что данные могут быть отрицательными.
    отриц.png

    И тут возникает несколько вопросов. А собственно сколько бит представление данных вообще?
    Если реально 12 бит,то что делать с остальными 4? я сначала думал, что они автоматически обнуляются, но по факту там тоже какой-то мусор лежит,мне на них просто не смотреть и обнулять?
    Знак числа мне смотреть по 12 биту или по какому?

    Сейчас конкретно,я делаю так:
    1)Я считываю 4 байта - x,y,z
    2)Соединяю пары в 16 разрядные целые числа
    3)обнуляю всё что больше 12 бит
    4)проверяю 12 бит
    3)Если он установлен,инвертирую число и прибавляю 1,чтобы перевести из дополнительного кода и потом в sd карте в файле к этому числу подставляю минус. Предварительно,после инвертирования ещё раз обнуляю всё что после 12 бита
    4)если бит не установлен, то тупо так пишу его на карту

    Собственно я всё это сделал и на выходе получил вот такой набор чисел.
    x: -1296 y:-336 z:-608
    x: -1248 y:-224 z:-624
    x: -1168 y:-320 z:-576
    x: -1200 y:-240 z:-560
    x: -1264 y:-208 z:-592
    x: -1072 y:-336 z:-496
    x: -1184 y:-288 z:-496
    x: -1072 y:-304 z:-592
    x: -1248 y:-240 z:-464
    x: -1168 y:-288 z:-448
    x: -1168 y:-208 z:-496
    x: -1232 y:-224 z:-496
    x: -1152 y:-288 z:-512
    x: -1200 y:-352 z:-704
    x: -1120 y:-176 z:-592
    x: -1200 y:-224 z:-512
    x: -1296 y:-336 z:-448
    x: -1232 y:-288 z:-496
    x: -1168 y:-256 z:-560
    x: -1232 y:-256 z:-640
    x: -1184 y:-192 z:-624
    x: -1200 y:-208 z:-624
    x: -1248 y:-192 z:-496
    x: -1216 y:-272 z:-480
    x: -1216 y:-288 z:-512
    x: -1184 y:-320 z:-480
    x: -1248 y:-320 z:-464
    x: -1184 y:-240 z:-480
    x: -1120 y:-288 z:-560
    x: -1168 y:-256 z:-512
    x: -1264 y:-272 z:-464
    x: -1248 y:-256 z:-448
    x: +16 y:+656 z:+320
    x: +368 y:-288 z:+336
    x: +352 y:-416 z:+400
    x: +608 y:-336 z:+0
    x: +704 y:-400 z:+128
    x: +784 y:-464 z:+64
    x: +880 y:-336 z:+80
    x: +816 y:-560 z:+144
    x: -960 y:+16 z:+448
    x: -912 y:+0 z:+32
    x: -848 y:-80 z:+64
    x: -896 y:-112 z:-32
    x: -928 y:-160 z:-176
    x: -960 y:-64 z:-144
    x: -880 y:-192 z:+0
    x: -880 y:-176 z:-80
    x: -864 y:-160 z:+0
    x: -912 y:-192 z:-160

    Это оно и есть или я что то не так понял? почему эти числа так колбасит? в первой половине ряда я акселерометр не трогал,только в конце повертел. Данные записываются пока с периодом 300 мл, то есть по 3 в секунду.
     
  2. Daniil

    Daniil Гуру

    Про отрицательные числа и картинку читайте тут.
    Обычно лишние разряды находятся в младших позициях.
    Данные 16битные, т.к. пакет данных кратен 8. Т.е. эта надпись скорее для программиста, чтобы он не переживал сколько данных принимать.
     
  3. parovoZZ

    parovoZZ Гуру

    Это значение полной шкалы.

    Всё верно. Дополнение до двух. Если число отрицательно, то первые четыре бита будут единицами.

    можешь выкинуть не готовые числа, а то, что считываешь из регистров?
     
  4. x: +64656 y:+3920 z:+544
    x: +64640 y:+3984 z:+480
    x: +64752 y:+3904 z:+528
    x: +64736 y:+3984 z:+576
    x: +64688 y:+4000 z:+608
    x: +64656 y:+4032 z:+592
    x: +64560 y:+3984 z:+640
    x: +64624 y:+4000 z:+384
    x: +64624 y:+4000 z:+592
    x: +64528 y:+4000 z:+640
    x: +64672 y:+3968 z:+400
    x: +64496 y:+3984 z:+528
    x: +64608 y:+3968 z:+576
    x: +64608 y:+3936 z:+592
    x: +64816 y:+3840 z:+1232
    x: +64896 y:+3568 z:+2768
    x: +64848 y:+3328 z:+2768
    x: +65008 y:+3008 z:+2880
    x: +65056 y:+3040 z:+2688
    x: +64480 y:+3248 z:+2928
    x: +65408 y:+2768 z:+4304
    x: +65152 y:+688 z:+4160
    x: +65120 y:+432 z:+4624
    x: +368 y:+65520 z:+3152
    x: +65312 y:+32 z:+4752
    x: +160 y:+65504 z:+4272
    x: +32 y:+65504 z:+4464
    x: +48 y:+32 z:+4304
    x: +65520 y:+208 z:+4368
    x: +48 y:+112 z:+4384
    x: +64 y:+176 z:+4416
    x: +65504 y:+32 z:+4272
    x: +144 y:+64 z:+4416
    x: +288 y:+96 z:+4352
    x: +672 y:+240 z:+4112
    x: +240 y:+160 z:+4352
    x: +496 y:+208 z:+4400
    x: +352 y:+96 z:+4320
    x: +320 y:+64 z:+4304
    x: +352 y:+80 z:+4272
    x: +336 y:+65520 z:+4384
    x: +528 y:+96 z:+4480
    x: +432 y:+16 z:+4400
    x: +352 y:+80 z:+4384
    x: +464 y:+144 z:+4352
    x: +384 y:+80 z:+4336
    x: +480 y:+32 z:+4368
    x: +432 y:+0 z:+4448
    x: +384 y:+65504 z:+4032
    x: +432 y:+65520 z:+4272
    x: +448 y:+96 z:+4368
    x: +576 y:+48 z:+4464
    x: +480 y:+48 z:+4288
    x: +448 y:+48 z:+4352
    x: +528 y:+65520 z:+4336
    x: +480 y:+48 z:+4432
    x: +544 y:+80 z:+4176
    x: +640 y:+48 z:+4320
    x: +592 y:+48 z:+4192
    x: +624 y:+64 z:+4368
    x: +640 y:+65472 z:+4256
    x: +608 y:+65456 z:+4304
    x: +432 y:+65472 z:+4304
    x: +480 y:+65520 z:+4272
    x: +464 y:+65520 z:+4288
    x: +608 y:+80 z:+4160
    x: +560 y:+65472 z:+4416
    x: +544 y:+65440 z:+4352
    x: +384 y:+65520 z:+4032
    x: +336 y:+96 z:+4256
    x: +64 y:+48 z:+4320
    x: +65072 y:+64 z:+4272
    x: +65184 y:+80 z:+4352
    x: +65088 y:+240 z:+4432
    x: +65008 y:+144 z:+4416
    x: +64816 y:+128 z:+4352
    x: +64592 y:+400 z:+4112
    x: +64240 y:+496 z:+3984
    x: +64048 y:+480 z:+3968
    x: +63760 y:+448 z:+4096
    x: +63328 y:+464 z:+3600
    x: +63296 y:+512 z:+3392
    x: +62848 y:+432 z:+3472
    x: +62416 y:+544 z:+2928
    x: +61968 y:+400 z:+3072
    x: +61360 y:+464 z:+2144
    x: +61712 y:+672 z:+1728
    x: +61728 y:+752 z:+1296
    x: +61312 y:+528 z:+832
    x: +61296 y:+304 z:+400
    x: +61424 y:+352 z:+192
    x: +61376 y:+256 z:+65424
    x: +61600 y:+240 z:+64928
    x: +61712 y:+368 z:+64656
    x: +61536 y:+304 z:+64464
    x: +61648 y:+368 z:+64064
    x: +61824 y:+176 z:+63616
    x: +62048 y:+224 z:+63440
    x: +62240 y:+128 z:+63312
    x: +62432 y:+112 z:+63184
    x: +62368 y:+32 z:+62800
    x: +62752 y:+64 z:+62768

    вот пожалуйста. Если честно, то когда я числа не трогаю в программе, то акселерометр себя ведёт лучше,его и не колбасит так сильно и плюс когда я его верчу вокруг по каждой оси,то возникает ощущение что в одной половине положения у него числа идут от 0 до примерно 4000,а в другой половине между 65535 и ниже. То есть наверное не нужно обнулять никакие числа а просто если 16 бит установлен,то инвертировать число и прибавлять единицу,а если 16 бит не установлен,то число прям так писать. Хотя я до сих пор не уверен
     
  5. parovoZZ

    parovoZZ Гуру

    Определи знаковую переменную и не парься)