Jump to content

    
AlanSbor

I3C датчики как с ними работать ?

Recommended Posts

1 минуту назад, Сергей Борщ сказал:

А 5633 вы уже попробовали? У меня они почему-то выдают очень маленькое значение. Магнит, который вводит в насыщение LIS3MDL с полной шкалой в +-16 Гауссов изменяет показания 5633 чуть меньше чем на 1000 единиц в старших 16 битах. 

Еще не пробовал. 5633 у меня тоже заказаны и отдельно и в комплекте разработчика.  Как придут, сразу начну проверку.

По ману 5633, у него полная шкала +-30 Гаус и управление чувствительностью в зависимости от выбранного разрешения АЦП.
image.thumb.png.c89a4d2215b55f2fb40eee4d5546cb76.png
 


Раз мы в одной теме было бы интересно перевести переписку в приватный вариант общения. alansbor@yandex.ru 

Share this post


Link to post
Share on other sites
10 минут назад, AlanSbor сказал:

По ману 5633, у него полная шкала +-30 Гаус и управление чувствительностью в зависимости от выбранного разрешения АЦП.

Я раз пять перечитал документацию от корки до корки, но так и не нашел - где там выбирается разрешение АЦП. Решил, что оно определяется тем, сколько битов разработчик захочет использовать, ибо в таблице параметров есть всего одна строка о разрешении АЦП:

image.thumb.png.ad4567547c7fc9594af9020ae34f4996.png

12 минут назад, AlanSbor сказал:

было бы интересно перевести переписку в приватный вариант общения

Можно, конечно, но предпочтительнее продолжать здесь - вдруг кому-то еще есть что сказать. Или у кого-то потом появятся точно такие же вопросы и человек через поиск сможет найти ответы в этой теме. Можно попросить модераторов изменить название темы, чтобы оно более точно отражало обсуждаемые вопросы.

Share this post


Link to post
Share on other sites
2 hours ago, Сергей Борщ said:

А 5633 вы уже попробовали? У меня они почему-то выдают очень маленькое значение. Магнит, который вводит в насыщение LIS3MDL с полной шкалой в +-16 Гауссов изменяет показания 5633 чуть меньше чем на 1000 единиц в старших 16 битах. 

Нет, не доводилось. Я тут попытался по-быстрому сравнить оба с точки зрения настроек. Похоже, но не могу посоветовать, как именно настроить 5633 по аналогии с 5983. Могу предположить две вещи:

- неправильная интерпретация 20-ти битного значения из 5633 (может, сильно загрубили результат).

- скорость опроса датчика выше скорости внутреннего преобразования.

Тем не менее, по моей проблеме: у меня же не "замылены" глаза, что проекции ненулевого вектора на систему ортогональных координат не могут быть все нулевыми вне зависимости от ориентации этой системы координат? Максимум две координаты могут быть нулевыми, если вектор соосен с третьей. Есть 6D датчики, которые вычисляют heading на основе магнитных данных и акселерометра, но 5983 такого не имеет!

2 hours ago, AlanSbor said:

Добрый день, перешлите мне письмо которое отправили в саппорт, у меня вроде как получше отвечают.

P.S.  вы работаете по I2C  или I3C ?   У меня на выбор несколько датчиков, 5983 один из возможных, который буду использовать, единственное нашел только у NXP  проц который поддерживает I3C  в полный рост.

5983MA поддерживает только I2C, по нему и работаю.

Письмо:

Quote

Dear Sirs,

We are evaluating your sensor MMC5983MA that is to be used in our application as a compass for the earth magnet field.

Depending on its orientation the axes X, Y, Z have various values as expected, but as you can see on the picture (the left axis is in µTesla), we were able to find an orientation, where ALL three axes were around zero! As far as we unterstand, the 3D axes being mutual orthogonal  to each other can NEVER show values about zero at the same time when measuring the omnipresent earth magnet field! At the moment -4.2 seconds we started changing the orientation of the sensor, and the X, Y and Z values went apart.

We cannot explain this behavour. Can you help us?

The chip is marked like:

5983
00fF

The last line can also be 001F: it's hard to recognize.

 

UPDATE.

 

Подключил другую плату с MMC5983MA и не смог добиться нулевых результатов! Печатные платы идентичные, Firmware в платах идентичное. Похоже, что на первой попался такой экземпляр сенсора, но тоже неприятно, и вопросы остаются, хотя не такие и острые.

 

Картинки:

_157_3 показывает три почти одинаковые [X,Y,Z] в районе 31µT, что в векторной сумме дает 53µT по модулю.

_157_2 показывает [X,Y,Z] с двумя осями [Y, Z] в районе нуля и X примерно 49µT.

 

Это все правдоподобно, хотя мне не нравится разница модулей в 4µT, но это может быть и дрожащая рука :biggrin:

Sensor_157_3.jpg

Sensor_157_2.jpg

Edited by KnightIgor

Share this post


Link to post
Share on other sites
1 час назад, KnightIgor сказал:

неправильная интерпретация 20-ти битного значения из 5633 (может, сильно загрубили результат)

Я вывожу на экран весь обмен и могу глазами смотреть именно отдаваемые данные. Результат с ними сходится.

1 час назад, KnightIgor сказал:

скорость опроса датчика выше скорости внутреннего преобразования.

Тоже маловероятно - я считываю данные через 5 секунд после запуска преобразования, а у него самое медленное преобразование - 6.6 мс, причем все три оси оцифровываются последовательно, то есть если бы оно не успевало - результаты оси Z сильно отличались бы. Но нет - они одного порядка.

1 час назад, KnightIgor сказал:

Тем не менее, по моей проблеме: у меня же не "замылены" глаза, что проекции ненулевого вектора на систему ортогональных координат не могут быть все нулевыми вне зависимости от ориентации этой системы координат?

У меня 5633 выдает все нули даже с поднесенным магнитом пока не сделаешь selftest. После selftest начинает отдавать отличные от нуля значения, но только со сброшенным Auto_SR_en. Если его выставить в 1 - при поднесении магнита наблюдается небольшой кратковременный всплеск в данных и буквально через 2-3 изменения с выхода снова идут нули. Хотя в документации сказано "This bit is recommended to set to “1” in the application".

Share this post


Link to post
Share on other sites
1 hour ago, Сергей Борщ said:

У меня 5633 выдает все нули даже с поднесенным магнитом пока не сделаешь selftest. После selftest начинает отдавать отличные от нуля значения, но только со сброшенным Auto_SR_en. Если его выставить в 1 - при поднесении магнита наблюдается небольшой кратковременный всплеск в данных и буквально через 2-3 изменения с выхода снова идут нули. Хотя в документации сказано "This bit is recommended to set to “1” in the application".

"Мой" 5983MA работает штатно с Auto_SR_en = 1. Без него он тоже показывает типа правильные значения, а максимальная частота опроса (готовность через сигнал INT) возрастает почти вдвое, однако мне казалось, что наблюдается сильный временной дрифт значений. То есть, как я понимаю, Auto_SR_en = 1 делает периодически циклы SET/RESET, на что нужно время, но и устраняет "уплыв" измерений.

Кстати, зацепился я за мой "дефектный" датчик и понял, что по оси X он просто имеет значительное смещение: если другие оси по нулям, то он показывает -79µT, хотя поле должно быть в районе 45..49µT по модулю. Перевернув его, я получаю максимум около +9µT. То есть, все смещено на где-то -35µT. Попробовал сделать принудительный SET/RESET (типа DeGauss), что также есть и в 5633 (в регистре Internal Control 0), но это ничего не изменило: сдвиг остался. Поэтому он в определенном положении и показывает все оси по нулям. Может я наушники как-то слишком близко к нему оставил...

Edited by KnightIgor

Share this post


Link to post
Share on other sites
13 часов назад, KnightIgor сказал:

Позвольте, пользуясь совпадением с производителем чипа, вклиниться по немного иной проблеме.

Вожусь с MEMSIC MMC5983MA. Это тоже магнетометр от производителя с аналогичными параметрами. Запустился, работает, данные считываются, при векторном суммировании получаю в общем реалистичное значение силы магнитного поля Земли. НО: путем изменения ориентации я могу добится ситуации, когда по ВСЕМ ТРЕМ осям величины близки к нулю (смотрите график)! Очевидно, что проекция вектора магнитного поля Земли физически не может быть нулем по всем трем осям одновременно. На графике, с момента -4.2 секунды, я начал выворачивать датчик из этого "мертвого" положения, и ВСЕ три оси начали меняться (на верхнюю неспокойную линию внимания не обращайте). То есть, вряд ли одна из осей выбыла из строя.

Ситуация воспроизводимая, то есть, близко-нулевые значения появляются всегда при определенной ориентации сенсора.

В MEMSIC я вопрос написал, но это же китайцы: с них ответа дождаться...

А можно поинтересоваться, что за положение такое ? Где север, юг, углы ?

7 часов назад, Сергей Борщ сказал:

Я вывожу на экран весь обмен и могу глазами смотреть именно отдаваемые данные. Результат с ними сходится.

Тоже маловероятно - я считываю данные через 5 секунд после запуска преобразования, а у него самое медленное преобразование - 6.6 мс, причем все три оси оцифровываются последовательно, то есть если бы оно не успевало - результаты оси Z сильно отличались бы. Но нет - они одного порядка.

У меня 5633 выдает все нули даже с поднесенным магнитом пока не сделаешь selftest. После selftest начинает отдавать отличные от нуля значения, но только со сброшенным Auto_SR_en. Если его выставить в 1 - при поднесении магнита наблюдается небольшой кратковременный всплеск в данных и буквально через 2-3 изменения с выхода снова идут нули. Хотя в документации сказано "This bit is recommended to set to “1” in the application".

Вот исходники кода для тестирования, полученный мной еще в июне прошлого года от MEMSIC , должно помочь.
Только заметил что копирайт стоит. 

Edited by AlanSbor
copyright

Share this post


Link to post
Share on other sites
12 часов назад, AlanSbor сказал:

Только заметил что копирайт стоит.

Так вы же их за свои не выдаете. Вот если бы их вам дали после подписания соглашения о неразглашении (NDA) - тогда другое дело.

Share this post


Link to post
Share on other sites
9 часов назад, Сергей Борщ сказал:

Так вы же их за свои не выдаете. Вот если бы их вам дали после подписания соглашения о неразглашении (NDA) - тогда другое дело.

Понял. Ничего не подписывал. Вечером выложу.

 

sample_code_for_5603-universal_v1.5.zip

Edited by AlanSbor

Share this post


Link to post
Share on other sites
On 9/27/2021 at 2:26 PM, Сергей Борщ said:

У меня 5633 выдает все нули даже с поднесенным магнитом пока не сделаешь selftest. После selftest начинает отдавать отличные от нуля значения, но только со сброшенным Auto_SR_en. Если его выставить в 1 - при поднесении магнита наблюдается небольшой кратковременный всплеск в данных и буквально через 2-3 изменения с выхода снова идут нули. Хотя в документации сказано "This bit is recommended to set to “1” in the application".

Дальнейшие эксперименты.

1. Несмотря на инфу из дока, что как бы:

 

Quote

However, the influence of a strong magnetic field (more than 10 G) in any direction could upset, or flip, the polarity of the film, thus changing the sensor characteristics. A strong restoring magnetic field must be applied momentarily to restore, or set, the sensor characteristics. The MEMSIC magnetic sensor has an on-chip magnetically coupled strap: a SET/RESET strap pulsed with a high current, to provide the restoring magnetic field

убедить "дефектный" датчик убрать смещение (думаю, это понимается под "upset") по "дефектной" оси не удается. Хочу попробовать по методу магнитной катушки с переменным током: такой классический метод из 70-80 годов размагнитить ленту или кинескоп (кто-то вообще из нынешнего поколения понял, о чем я? ;)

 

2. SET/RESET меняет предмагнетизацию AMR пластин: если сделать SET, то выходные значение осей меняют знак на противоположный, а RESET "восстанавливает" знаки, НО ТОЛЬКО, если Auto_SR_en = 0.

Edited by KnightIgor

Share this post


Link to post
Share on other sites
5 минут назад, KnightIgor сказал:

Скажи, что это оригинальный J-Link от SEGGER :spiteful:

Да, это оригинал ультра плюс.

20 часов назад, KnightIgor сказал:

Дальнейшие эксперименты.

1. Несмотря на инфу из дока, что как бы:

 

убедить "дефектный" датчик убрать смещение (думаю, это понимается под "upset") по "дефектной" оси не удается. Хочу попробовать по методу магнитной катушки с переменным током: такой классический метод из 70-80 годов размагнитить ленту или кинескоп (кто-то вообще из нынешнего поколения понял, о чем я? ;)

Получится но на глазок. Вспомни что при размагничивании кинескопа убираешь до приемлемого уровня, но кляксы хоть и малые останутся. И поле там ниразу не 30гаус, можно и пластины в датчике прилипать к стенкам чипа. Может лучше в однородном поле - длинная катушка?

20 часов назад, KnightIgor сказал:

 

Share this post


Link to post
Share on other sites
28 minutes ago, AlanSbor said:

Да, это оригинал ультра плюс.

Респект.

 

Quote

 

 

Quote

Получится но на глазок. Вспомни что при размагничивании кинескопа убираешь до приемлемого уровня, но кляксы хоть и малые останутся. И поле там ниразу не 30гаус, можно и пластины в датчике прилипать к стенкам чипа. Может лучше в однородном поле - длинная катушка?

Конечно, это не метод оживлять калиброванные датчики и потом надеяться на точность. Речь о простом тесте, "что будет, если...". Тут у меня и пара неодимовых постоянных магнитов завалялось: ломать, так ломать...

Edited by KnightIgor

Share this post


Link to post
Share on other sites
28.09.2021 в 09:25, AlanSbor сказал:

Понял. Ничего не подписывал. Вечером выложу.

Спасибо. "Дело было не в бобине".

Во-первых, был прав @KnightIgor и у меня была ошибка в коэффициенте перевода пупок АЦП в Гауссы.

Во-вторых, у меня датчик вместе с конденсатором располагается на маленькой платке и довольно толстым метровым кабелем соединяется с основной платой, где запитан от ноги контроллера. Датчики отдавали запаивать на производство, чтобы они оценили - смогут ли ставить их потом серийно. Ну они только датчик и запаяли. А потом монтажник, не сильно задумываясь, припаял кабель, который конструктивно закрывает собой и датчик и конденсатор. В общем без конденсатора с таким длинным кабелем и вялым питанием от ноги контроллера Set/Reset работают ну очень неохотно (почти не работают совсем).

В-третьих, нельзя одновременно выставлять DoSet/DoReset и AutoSR_en, если это сделать - в последующих измерениях будут получаться нули. После DoSet/DoReset выставлять AutoSR_en можно.

В-четвертых, бит Sat_sensor несмотря на свое название выставляется только во время автокалибровки. Если же поднести очень мощный магнит во время работы - показания будут какие угодно, но только не максимальное/минимальное значение шкалы. То есть лежащий на датчике магнит, который невозможно одной рукой оторвать от листа железа, вполне может показывать 1.5 Гс, 0 Гс и сброшенный Sat_sensor. После убирания магнита показания могут быть совершенно любыми и реакция на слабое поле тоже непредсказуема. Узнать о насыщенни, судя по всему, можно только пропуская ток через встроенную катушку битами St_enp, St_enm или делая периодический self-test, но тогда ни о каком микропотреблении речи уже быть не может. А мне нужно заменить им LIS3MDL в считывателе водяного счетчика со сроком службы 10 лет от одной батарейки. У LIS3MDL таких проблем не было - он при насыщении честно уходил в край шкалы, но сейчас этих LIS3MDL не купить.

В-пятых, отличается от документации вычисление порога в процедуре auto-self-test. И я даже не знаю, кому верить - в документации просто сказано "вычислите 80% от значений ST_(x,y,z), в коде эти значения сначала преобразуются в знаковые с умножением на 32, потом берется их модуль, вычисляется 80% и делится на 8. Может потому, что код от 5603, а документацию я смотрю на 5633 (посмотрел документацию на 5603 - там все то же самое).

23 часа назад, KnightIgor сказал:

убедить "дефектный" датчик убрать смещение (думаю, это понимается под "upset") по "дефектной" оси не удается.

В документации 5633 описана процедура программного вычисления и учета смещения:

Цитата
  1. The most accurate magnetic field measurements can be obtained by using the protocol described as follows: Perform SET. This sets the internal magnetization of the sensing resistors in the direction of the SET field.
  2. Perform MEASUREMENT. This measurement will contain not only the sensors response to the external magnetic field, H, but also the Offset; in other words, Output1 = +H + Offset.
  3. Perform RESET. This resets the internal magnetization of the sensing resistors in the direction of the RESET field, which is opposite to the SET field (180o opposed).
  4. Perform MEASUREMENT. This measurement will contain both the sensors response to the external field and also the Offset. In other words, Output2 = -H + Offset.
  5. Finally, calculate H by subtracting the two measurements and dividing by 2. This procedure effectively eliminates the Offset from the measurement and therefore any changes in the Offset over temperature. H = (Output1-Ouput2)/2.

Note:

  •  To calculate and store the offset; add the two measurements and divide by 2. This calculated offset value can be subtracted from subsequent measurements to obtain H directly from each measurement.

Я реализовал описанное в note, оно работает. Причем смещения для трех датчиков у меня получились примерно такие (X/Y/Z):

на столе - 17/-418/-8, -163/24/-365, -203/-68/-926

в магнитном поле 5-8 Гс смещение отличается: 3/-416/51, -241/31/-102, -276/-85/-548

Похоже, надо вычислять его заново как минимум при сильном изменении поля, как максимум - при каждом измерении.

Share this post


Link to post
Share on other sites
17 minutes ago, Сергей Борщ said:

Спасибо. "Дело было не в бобине".

Во-первых, был прав @KnightIgor и у меня была ошибка в коэффициенте перевода пупок АЦП в Гауссы.

Стесняюсь спросить, но всё же: а что такое "пупок АЦП"?

Quote

В документации 5633 описана процедура программного вычисления и учета смещения:

Для 5983MA эта процедура тоже описана. Я ее понимал как исключение незначительного дрифта небольшого смещения при изменении температуры, но что смещение может быть сравнимо с самим измерением - этого я не ожидал.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.