Учебник и обзор 3D-магнитного комплекта Infineon 2Go Kit
3D-датчик Hall-effect от Infineon обеспечивает трехмерное бесконтактное обнаружение положения с использованием сверхмалой интегральной схемы. В этом учебнике будет использоваться стандартный набор для создания джойстика для использования в ваших проектах.
Начиная
TLV493D - это 6-контактное магнитное поле и температурный датчик с напряжением 3, 3 В I²C. Комплект разработчика 3D Magnetic Sensor 2GO содержит TLV493D (датчик магнитного поля), микроконтроллер XMC1100 (техническое описание), микроконтроллер XMC4200 (техническое описание) и порт micro USB.
Чтобы следовать этому руководству, вам необходимо приобрести комплект разработчика 3D Magnetic Sensor 2GO Development Kit и магнитный джойстик. Если вы хотите взаимодействовать с Arduino, вам нужно приобрести TLV493D, но я рекомендую использовать этот подход, потому что работать с чрезвычайно маленькой упаковкой датчика очень сложно.
Пункт | покупка | Рекомендации |
---|---|---|
3D магнитный датчик TLV493D | $ 2 | Технический паспорт | Руководство | краткое |
Комплект разработчика TLV493D | $ 28 | Технический паспорт | Руководство |
Магнитный джойстик | $ 22 | никто |
Arduino Uno R3 (или совместимый) | $ 15 | Справка |
4 позиция Заголовок (0.100 ") | $ 1 | Техническая спецификация |
Проводные перемычки для макета | $ 3 | Техническая спецификация |
Bi-Directional Преобразователь уровня логики |
$ 3 | Техническая спецификация |
Начало работы с демонстрационным программным обеспечением
Infineon предоставляет графический пользовательский интерфейс для своих датчиков. Перейдите на страницу загрузки и установите графический интерфейс для 3D-магнитного датчика. Он устанавливает программы в папках «3D Magnetic 2 GO» и «Segger».
- Используйте кабель micro-USB для подключения оценочной платы к ПК
- Откройте «3D Magnetic 2 GO»
- Под полем Programmer выберите XMC2Go на COM5 (при необходимости отрегулируйте COM-порт)
- Нажмите значок внизу и слева от поля Programmer для подключения - появится выпадающее меню
- Нажмите, чтобы выбрать «TLV493D» - появится раскрывающееся меню конфигурации
- Нажмите, чтобы выбрать «Быстрый режим»
- Нажмите «Пуск»
- Выберите «Просмотр графика» или «Вид джойстика»,

В представлении джойстика отображается виртуальный красный джойстик, который перемещается при перемещении джойстика

Graph View показывает потоковый график каждого значения декартовой оси вместе с загружаемыми данными
Эффекты эффекта Холла и эффекта Холла
Эффект Холла описывает разность потенциалов, создаваемую зарядами, которые отделяются от противоположных сторон проводника при наличии магнитного поля.
Визуализация эффекта Холла. Видео предоставлено FraunhoferIIS через Викимедиа
Датчик TLV493D способен обнаруживать напряженность магнитного поля в трех ортогональных направлениях. В оценочном комплекте используется эффект Холла в TLV493D и данные калибровки магнита, входящего в джойстик, для определения ориентации джойстика.

Изображение интенсивностей магнитного поля в направлениях х, у и z
Вы можете создавать симуляции магнитного поля, используя три магнита по умолчанию в программном обеспечении для моделирования джойстика или на основе параметров магнита, которые вы указываете на Design. Infineon.com/3dsim.
Infineon 3D Магнитный датчик 2GO Kit
В оценочной плате Infineon 3D Magnetic Sensor также есть микроконтроллер Infineon XMC4200 и микроконтроллер Infineon XMC1100. Несмотря на отсутствие библиотек Arduino для 3D-магнитного датчика, техническая поддержка Infineon привела меня к следующим инструментам:
GUI для 3D Magnetic Sensor v 2.0.1 (используется в приведенном выше примере)
Графический пользовательский интерфейс (GUI) может подключаться к оценочной плате через USB и обеспечивает следующее:
- Показания данных от каждой оси, а также данные о температуре
- 3D-представление джойстика
- Двумерное представление поворотной ручки (с помощью ручки вспомогательного устройства, не входящей в комплект eval)
DAVE - платформа разработки для микроконтроллеров XMC
DAVE - это бесплатная среда разработки на основе Eclipse. Вот некоторые релевантные ссылки:
- Руководство пользователя быстрого запуска DAVE SDK
- Пример кода заявки (ERU)
- Capture Compare Unit 8 (CCU8) Пример кода
- Пример кода последовательного интерфейса последовательного интерфейса
- Capture Compare Unit 4 (CCU4) Пример кода
- Позиционный интерфейс AppNote 32289
Использование TLV493D с Arduino
TLV493D - это 6-контактное магнитное поле и температурный датчик с напряжением 3, 3 В I²C. Плата оценки позволяет TLV493D и четыре отверстия диаметром 0, 100 дюймов (3, 3 В, GND, SDA, SCL) механически отделяться от другого идентичного ряда 0, 100 "сквозных отверстий и двух микроконтроллеров.
Я решил не разорвать свой TLV493D с оценочной платы. Независимо от того, используете ли вы отдельный TLV493D, отделите его от оценочной панели или решите оставить его нетронутым, поскольку я не должен влиять на остальную часть этого проекта.
Настройка цепи
Плата Arduino, которую я использую для этого руководства, работает с логикой 5 В. TLV493D на плате 3D 2GO Eval Kit использует 3.3V логику. Таким образом, между Arduino и TLV493D должен быть вставлен двунаправленный преобразователь логического уровня.
Подключите схему, как показано ниже, используя встроенные регуляторы напряжения Arduino для питания обеих сторон двунаправленного преобразователя логического уровня (BDLLC). На BDLLC сторона высокого напряжения (HV) подключена к источнику 5V на выводах Arduino и Arduino, а сторона низкого напряжения (LV) подключена к источнику 3, 3 В на контактах данных Arduino и TLV493D.

Подготовка к программе
Infineon не предлагает библиотеки Arduino через свой веб-сайт или поддержку клиентов. На момент написания статьи, онлайн-поиск эскизов Arduino, которые используют TLV493D, не дает результатов. Это означает, что я получаю работу по созданию программы на основе информации в таблице данных.
Руководство «Малый магнитный датчик низкой мощности с интерфейсом I²C» предоставляет большую часть необходимой информации.
Во-первых, нам нужно знать адрес датчика. Страница 20 руководства содержит 8-битный адрес. Если TLV493D имеет логическую высоту на своем SDA-выводе при запуске, 8-разрядный адрес датчика будет 0xBC. Wire.h поддерживает только 7-разрядные адреса до 0x7F (127 или 111 1111 2). Чтобы конвертировать из 8-бит в 7-бит, просто сдвиньте адрес на один бит вправо. В шестнадцатеричной нотации для работы программы адрес записи должен быть 0x5E.
н-битный | рабыня | Читать | Написать | |||||
---|---|---|---|---|---|---|---|---|
декабрь | мусорное ведро | наговор | декабрь | мусорное ведро | наговор | |||
8 | 0 | Высокий (1) | 189 | 1011 1101 | 0xBD | 188 | 1011 1100 | 0xBC |
1 | Низкий (0) | 63 | 00111111 | 0x3F | 62 | 0011 1110 | 0x3e | |
7 | 0 | Высокий (1) | 95 | 101 1111 | 0x5F | 94 | 101 1110 | 0x5e |
Первоначально я не знал о ограничении Wire.h, поскольку я никогда не сталкивался с этим раньше, поэтому, когда TLV493D не ответил на мою первоначальную программу, мне пришлось выполнить некоторые проблемы с поиском. Я использовал немного кода для отправки команд записи на каждый адрес и искал сигналы ACK с помощью Tektronix MDO3104. (Дополнительную информацию см. В разделе «Чтение шины I²C на осциллографе»).

TVL493D по адресу 0x5E на шине I²C из-за высокого уровня SDA при запуске

TVL493D по адресу 3E на шине I²C из-за низкого уровня SDA при запуске
Чтение и запись регистров TLV493D I²C
При включении питания TLV493D по умолчанию работает в режиме низкого энергопотребления (техническое описание на стр. 14), где измерения не производятся. Техническое описание указывает, что пользователи должны считывать регистры 7 H, 8 H, 9 H (FactSet1, FactSet2, FactSet3) для записи информации о конфигурации обратно в чип позже.
Я прочитаю их в установочной части кода и перепишу их в соответствующие регистры, когда я вывешу TLV493D из режима отключения питания и начню считывать данные измерений.

Растровое изображение из таблицы TLV493D
Запись в TLV493D
Стандартные режимы питания управляются с помощью первых трех бит регистра записи MOD1 (1 H) и двух последних бит MOD 2 (3 H). Регистр записи 0 H зарезервирован и не конфигурируется, поэтому я отправлю 0x00 байт. Остальные биты будут записаны битами из регистров считывания 7 H, 8 H и 9 H.
Биты 1: 0 в MOD1 и бит 7 в MOD2 контролируют скорость, с которой TLV493D собирает данные и делает их доступными для чтения. Бит 3 в MOD1 определяет, должен ли TLV493 использовать линию прерывания, чтобы уведомить микроконтроллер о том, что данные готовы к чтению. Бит 8 в Mod2 включает измерения температуры. Это увеличивает потребление энергии на 33%, но позволяет компенсировать температурную компенсацию для измерений данных.
Чтение магнитных данных TLV493D
B x, B y, B z и данные температуры хранятся в семи отдельных 8-битных регистрах. Разрешение датчиков составляет 12 бит (1, 5 байта), размер каждого регистра - 8 бит (1 байт), и я храню информацию в Arduino в 16-битных (2 байтах) переменных. Это достигается путем считывания регистров 0 H, 1 H, 2 H, 3 H, 4 H, 5 H и 6 H в Arduino и использования как битдвига, так и логических операций для перемещения правильных значений в биты 11: 0 каждого из 16 -битная переменная.

Пример чтения данных из TLV493D

Чтение данных образца и запись данных для установки режима TLV493D
/* Infinenon 3D Magnetic I2C * TLV493D * by Mark J. Hughes * for AllAboutCircuits.com * 20160817 */ //--- Begin Includes ---// #include// I²C Libraries // Variable Declaration const byte addr = 0x5E; // default address of magnetic sensor 0x5E or 0x3E byte rbuffer(10); // store data from sensor read registers byte wbuffer(4); // store data for sensor write registers. byte debugcounter; // variable for debug counter byte delaytime = 1; // time to wait before next read. Delay will increase with errors. //--- Begin Write Registers ---// /* * Mode 1 is the second write register * Mode1_Int Bxxxxx1xx Interrupt Enable "1" / Disable "0" * Mode1_Fast Bxxxxxx1x Fast Mode Enable "1" / Disable "0" must be 0 for power down * Mode1_Low Bxxxxxxx1 Low Power Mode Enable "1" / Disable "0" * * Mode 2 is the fourth write register * Mode2_T B1xxxxxxx Temperature Measurement Enable "1" / Disable "0" * Mode2_LP Bx1xxxxxx LP Period "1" = 12ms / "0"=100ms * Mode2_PT Bxx1xxxxx Parity test Enable "1" / Disable "0" * */ Example settings for Ultra-Low Power, Low Power, Fast Mode, and Power Down. Reg 1 Reg 2 Reg 3 Reg 4 const byte ulpm() = { B00000000, B00000101, B00000000, B00000000 }; // ultra low power mode const byte lpm() = { B00000000, B00000101, B00000000, B01000000 }; // low power mode const byte fm() = { B00000000, B00000110, B00000000, B00000000 }; // fast mode (unsupported) const byte pd() = { B00000000, B00000001, B00000000, B00000000 }; // power down mode. //--- Begin Setup ---// void setup() { Serial.begin(115200); // Begin serial connection for debug. Wire.begin(); // Begin I²C wire communication /* Read all registers, although only interested in configuration data * stored in rbuffers 7, 8, 9, as 0-6 might be empty or invalid at the moment. */ Wire.requestFrom(addr, sizeof(rbuffer)); for(int i=0; iWrite Register 1H 6:3 wbuffer(1) = rbuffer(7) &B01111000; // Read Register 8H 7:0 -> Write Register 2H 7:0 wbuffer(2) = rbuffer(8); // Read Register 9H 4:0 -> Write Register 3H 4:0 (Mod2) wbuffer(3) = rbuffer(9) &B00001111; // Set Power Mode (ulpm, lpm, fm, pd) for(int i=0; i < sizeof(wbuffer); i+)= lpm(i) Wire.beginTransmission(addr); for(int i=0; i < sizeof(wbuffer); i+){ Wire.write(wbuffer(i)); } Wire.endTransmission(); } //--- End of Setup --// //--- Begin Main Program Loop --// void loop() { delay(delaytime); // wait time between reads. // Read sensor registers and store in rbuffer Wire.requestFrom(addr, sizeof(rbuffer)); for(int i=0; i < 6; i+){ rbuffer(i) = Wire.read(); } // Goto decode functions below int x = decodeX(rbuffer(0), rbuffer(4)); int y = decodeY(rbuffer(1), rbuffer(4)); int z = decodeZ(rbuffer(2), rbuffer(5)); int t = decodeT(rbuffer(3), rbuffer(6)); if(debugcounter % 15 == 0){ // reprint x, y, z, t header every 15 lines. Serial.print("x"); Serial.print("\t");Serial.print("y");Serial.print("\t");Serial.print("z");Serial.print("\t");Serial.println("t"); } debugcounter+; // increment debug counter. if(rbuffer(3) & B00000011 != 0){ // If bits are not 0, TLV is still reading Bx, By, Bz, or T Serial.println("Data read error!"); //delaytime += 10; } else { Serial.print(x); Serial.print("\t");Serial.print(y);Serial.print("\t");Serial.print(z);Serial.print("\t");Serial.println(t);} } //-- End of Main Program Loop --// //-- Begin Buffer Decode Routines --// int decodeX(int a, int b){ /* Shift all bits of register 0 to the left 4 positions. Bit 8 becomes bit 12. Bits 0:3 shift in as zero. * Determine which of bits 4:7 of register 4 are high, shift them to the right four places -- remask in case * they shift in as something other than 0. bitRead and bitWrite would be a bit more elegant in next version * of code. */ int ans = (a <> 4) &B00001111); if(ans > 1023){ ans -= 2048; } // Interpret bit 12 as +/- return ans; } int decodeY(int a, int b){ /* Shift all bits of register 1 to the left 4 positions. Bit 8 becomes bit 12. Bits 0-3 shift in as zero. * Determine which of the first four bits of register 4 are true. Add to previous answer. */ int ans = (a < 1024){ ans -= 2048;} // Interpret bit 12 as +/- return ans; } int decodeZ(int a, int b){ /* Shift all bits of register 2 to the left 4 positions. Bit 8 becomes bit 12. Bits 0-3 are zero. * Determine which of the first four bits of register 5 are true. Add to previous answer. */ int ans = (a < 1024){ ans -= 2048;} return ans; } int decodeT(int a, int b){ /* Determine which of the last 4 bits of register 3 are true. Shift all bits of register 3 to the left * 4 positions. Bit 8 becomes bit 12. Bits 0-3 are zero. * Determine which of the first four bits of register 6 are true. Add to previous answer. */ int ans; a &= B11110000; ans = (a < 1024){ ans -= 2048;} return ans; } //-- End Buffer Decode Routines --// //-- Begin Trig Conversion Routines --// /* r=sqrt(x^2+y^2+z^2) * Θ=acos(z/r) * if x > 0 -> Φ=atan(y/x) * if x = 0 & y > 0 -> Φ=pi/2 * if x = 0 & yΦ=-pi/2 * if x = 0 -> Φ=atan(y/x)+pi * if x < 0 & yΦ=atan(y/x)-pi */ //-- End Trig Conversion Routines
3D I²C Начало работы
Что делать с данными
Когда вы двигаете магнит вокруг датчика, сила магнитного поля увеличивается с 0 в положительном и отрицательном направлении, а затем резко меняет знак при максимальных показаниях (-2047 становится +2047). Как вы справляетесь с этим, это зависит от вас.
Один из вариантов - использовать тригонометрию для интерпретации данных, другой - использовать функцию map (), а еще одна опция - таблица поиска. Это действительно зависит от того, для чего вы планируете использовать этот датчик.
Чтобы преобразовать из x, y, z в сферические координаты $$ {r, \ theta, \ phi} $$, используйте преобразования, приведенные в таблице данных:
$$ г = \ SQRT {х ^ 2 + у ^ 2 + Z ^ 2} $$
$$ \ тета = соз ^ {- 1} влево ( гидроразрыва {г} {г} справа) $$
$$ \ Phi = загар ^ {- 1} влево ( гидроразрыва {у} {х} справа) $$ | x> 0 |
$$ \ гидроразрыва {р} {2} $$ | x = 0 &y> 0 |
$$ - \ гидроразрыва {р} {2} $$ | x = 0 & y <0 |
$$ \ Phi = загар ^ {- 1} влево ( гидроразрыва {у} {х} справа) + \ пи $$ | x <0 & y ≥ 0 |
$$ \ Phi = загар ^ {- 1} влево ( гидроразрыва {у} {х} справа) - \ пи $$ | x <0 и y <0 |
Случай для TLV493D
Случай, который я сделал для набора 3D2GO eval, изготовлен из 3-слойного 3-слойного лат.
На монтажной плате имеется одно винтовое отверстие, которое используется для крепления держателя джойстика. Держатель джойстика обертывается вокруг и под печатной платой таким образом, что плоскость печатной платы утоплена от самого нижнего выступа держателя джойстика примерно на 1/8 дюйма.

Изображение предоставлено Mouser
Это позиционирование затрудняет использование отверстия в монтажной плате для крепления печатной платы к корпусу. Поэтому я выбрал дизайн корпуса, который использует помехозащищенность между стенами корпуса и держателем джойстика, а это означает, что вы не найдете лишней комнаты внутри корпуса.
Руководство по сборке
- Используйте лазерный гравер / резак, чтобы вырезать дизайн из фанеры 1/8 дюйма. Если вы собираетесь окрашивать древесину, окрашивайте только одну сторону. Масляные пятна могут мешать деревянному клею, и никто не увидит внутри вашего дела в любом случае.
- Приклейте пять из шести сторон корпуса деревянным клеем и дайте ему высохнуть. Оставьте нижнюю часть корпуса ненагруженной (часть с маркировкой 3.3V, GND, SCL, SCA и USB). Вытрите любой неиспользуемый клей, прежде чем он сможет высохнуть.

- Пока клей сушит, накройте верхнюю и нижнюю части доски лентой Kapton или электрической лентой.
- В большинстве случаев достаточные допуски на конструкцию должны быть достаточными для крепления печатной платы. Если есть какое-либо движение, попробуйте использовать защищенный от ESD пенообразующий или УФ-отверждаемый клей для крепления печатной платы по бокам и верхней части корпуса. Одного или двух капель будет достаточно, чтобы удерживать плату на месте и ее можно легко вытащить с ленты Kapton, если вам когда-нибудь понадобится ее удалить.
- Закрепите нижнюю часть корпуса. Если вы никогда не захотите открыть его снова, закрепите его деревянным клеем. Если вы, возможно, захотите восстановить или удалить комплект для разработки в какой-то момент в будущем, используйте одну или две капли клея УФ-отверждения на внешней стороне корпуса. До тех пор, пока вы не получите клей между пальцами суставов, вы сможете снова открыть его с минимальным повреждением корпуса.
Я приложил файлы, необходимые, чтобы сделать это ниже.

Файлы дизайна корпуса джойстика
Что дальше?
Есть еще несколько часов работы, чтобы полностью реализовать датчик в производственном проекте и проверить целостность данных. Вот еще несколько задач, которые могут быть выполнены:
- Убедитесь, что данные действительны и из одного чтения. Вы можете определить, являются ли данные одним прочтением с использованием счетчика частоты кадров; эта функциональность в настоящее время не реализована в коде.
- Внедрите проверку на четность в микроконтроллере и включите проверку четности на TLV493D.
- Реализуйте схему прерывания и энергосбережения.
- Если он используется в критическом для безопасности приложении, используйте несколько датчиков рядом с одним магнитом для проверки целостности данных.
- Реализуйте режим Master-Controlled Mode и Master-Controlled Low Power.
Вывод
Pros
- Сверхнизкое энергопотребление (при 3, 3 В, 10 мкА во время работы, 10 нА во время сна)
- Маленький 6-контактный размер пакета TSOP подойдет практически в любом месте
- Связь I²C
- 12-битный АЦП на плате
- Прочная конструкция с тремя различными проверками ошибок данных
Cons
- Размер чипа затрудняет, если не невозможно, для всех, кроме самых опытных пользователей, припаивание дома.
- Любители в данный момент не используют этот чип, а это означает, что единственными онлайновыми ресурсами являются опубликованные таблицы данных. Пока нет каких-либо проектов или кода для копирования.
- Техническая поддержка, доступная через веб-сайт производителя, может сделать не более, чем перенаправление пользователей на опубликованные таблицы данных.
Если вы хотите включить TLV493D в свои проекты, я настоятельно рекомендую вам начать с комплекта разработки 3D2GO. Вы можете физически отделить TLV493D от остальной части печатной платы и все еще использовать оценочный комплект.
Если вы хотите использовать джойстик I²C Hall-effect в своем дизайне без хлопот по созданию корпуса и его отладке, подумайте о покупке полного пакета.