Оглавление:

Сделать любой датчик из ПЛИС: 4 шага
Сделать любой датчик из ПЛИС: 4 шага

Видео: Сделать любой датчик из ПЛИС: 4 шага

Видео: Сделать любой датчик из ПЛИС: 4 шага
Видео: Как Настроить Стенд в PLS Donate. Как Создать Геймпассы Для Плиз Донат. Инструкция Геймпас Роблокс 2024, Июль
Anonim
Image
Image
ПЛИС
ПЛИС

Большинство производителей хотя бы раз в жизни пробовали построить термометр, возможно, тот, который у них дома, недостаточно умен, или, может быть, они думают, что смогут построить следующее NEST. Тем не менее, в какой-то момент у них был микроконтроллер с их современным программным обеспечением, подключенным к датчику температуры (и, возможно, другим датчикам: давления, света). До сих пор все идеально, софт запущен и сенсор чувствует. Давай проверим!

Хмммм… может, стоит нагреть датчик феном и охладить льдом, какое-то время работает. Но это непрофессионально, датчик слишком быстро меняет значения, если его нагреть, он не нагревается больше, чем на пару градусов. Проект перебор! Но алгоритм новый, учитывает множество факторов, как жаль, что он застрял на этой глупой мелочи.

Мое решение таково: заставить FPGA действовать как датчик со значениями, передаваемыми с ПК (или хранящимися в памяти, или создаваемыми ad-hoc внутри FPGA). Так что для вашего драгоценного микроконтроллера FPGA выглядит как сенсор, но не как сенсор: какой бы сенсор вы ни выбрали. Возможно, вы решите, что вам нужно большее разрешение или более быстрое время отклика, чем ожидалось, вам нужно заменить датчик. Закажите онлайн, он прибудет через пару дней, через пару месяцев, кто знает. Повторно закрепите печатную плату или закажите модуль с новым датчиком. Или… пара щелчков мышью, и FPGA будет настроена как ваш новый датчик и сможет имитировать точную внутреннюю конфигурацию.

На момент написания этого ПЛИС могла действовать как LM75 с данными о температуре, хранящимися в BRAM (на ПЛИС).

Шаг 1: MCU

Мой выбор MCU - LPC4337 на LPCXpresso. Сверху у меня есть щит (LPC General Purpose Shield) с дисплеем и настоящий датчик LM75. LPC4337 - это ARM Cortex M4, работающий на частоте 200 МГц, и меньший Cortex M0 (здесь не используется). Настоящий датчик подключен к периферийному устройству I2C1, а наш виртуальный - к I2C0. Исходный код доступен на моем GitHub.

Как его построить? Загрузите LPCXpresso IDE вместе с библиотекой LPCOpen. Импортируйте эту библиотеку в IDE, а также откройте проект из GitHub. Все должно быть настроено, и вы можете нажать на «Отладка» в нижнем левом углу.

Весь проект основан на одном из примеров NXP (чтобы показать, что мой проект имитирует реальный датчик и не требует специального кода на стороне MCU). В основном файле (называемом iox_sensor.cpp) находится этот код:

#define SENSORS_ON_SHIELD

#if defined (SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elif defined (SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

Изменяя SENSOR_ON_SHIELD и SENSOR_OR_FPGA, пользователь может переключаться во время компиляции, с каким датчиком разговаривать, реальным или виртуальным, поскольку они находятся на разных выводах I2C.

Шаг 2: ПЛИС

Моя любимая плата FPGA - это Artix 7 от Digilent с Xilinx Arty 7. Используются два разъема PMod, один для отладки, а другой для реальной полезной нагрузки, соединения с платой MCU.

Опять же, исходный код FPGA доступен на моем GitHub (папка fpgaSide).

Как его построить? Загрузите, купите или откройте Xilinx Vivado IDE. Импортируйте файлы проекта из GitHub. Один из файлов (content.coe) - это данные о температуре в необработанном формате, которые будут переданы на поддельный датчик. Существует также файл Excel с тем же именем, который помогает преобразовывать удобочитаемые данные о температуре в необработанные данные LM75. Я планирую преобразовать это в автоматизированный процесс с помощью программного обеспечения, написанного на Java, но до тех пор это решение работает. Примите это во внимание, поэтому на синтез и реализацию потребуется время.

Шаг 3: как это работает?

Как это работает?
Как это работает?
Как это работает?
Как это работает?

Как я уже сказал, для MCU FPGA выглядит как датчик, точнее, датчик I2C. Выход периферийного устройства I2C подключен к входу FPGA. Внутри FPGA есть 3 основных компонента: - Контроллер I2C - Устройство I2C - Данные Контроллер I2C получает данные I2C от контактов FPGA и отправляет их остальной части FPGA и делает то же самое в обратном порядке. Он поддерживает внутренний конечный автомат для протокола I2C (кстати, вот документация к нему). Что этот компонент отправляет на устройство I2C? Текущий принятый байт, позиция этого байта в текущем сообщении и то, выполняет ли MCU запись или чтение из FPGA. Устройство I2C получает отправленные байты и обновляет смоделированную внутреннюю структуру датчика. Он может просто обновить указатель регистра или запросить новые данные из источника данных. Компонент данных передает новые точки данных. В настоящее время это просто ПЗУ, адрес которого увеличивается (приблизительно) дважды в секунду.

Какова моя конечная цель? Это показано на второй картинке. То есть: сделать возможным одновременное моделирование большего количества устройств I2C (датчиков и прочего) внутри FPGA. Данные на бэкэнде датчика должны быть кэшированы в FPGA и переданы с ПК через USB или Ethernet. Поддержка более совершенных датчиков и других устройств I2C (память, драйверы светодиодов и т. Д.).

Шаг 4: Собираем все вместе

Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе

Пришло время соединить все вместе. Теоретически все просто: на плате mcu есть разъем PMod (I2C0 & SSP0 (может работать как SPI)). На плате Artix есть 4 разъема PMod, которые можно использовать как угодно. Я выбираю разъем D для связи с MCU и разъем B для подключения к моему логическому анализатору.

Предупреждение

Вы не можете просто так соединить две доски вместе. Почему? PMod был создан для облегчения подключения платы Master / Host (которая дает питание) к Slave / Sensor (которая получает питание). Но в этом проекте обе платы выдают питание, и если вы подключите выход 3,3 В одной платы к выходу 3,3 В другой платы, могут произойти неприятности. Но они не могут, и вы можете просто изменить параметры шин питания FPGA (они очень тщательно спроектированы). Так что не рискуйте и переместите разъем на один контакт влево (а также переверните плату FPGA), как показано на рисунках выше. Вот спецификация PMod, вы можете ее изучить, вкратце я сделал так, чтобы не соединять VCC двух плат.

Рекомендуемые: