Съдържание:

Направете всеки сензор от FPGA: 4 стъпки
Направете всеки сензор от FPGA: 4 стъпки

Видео: Направете всеки сензор от FPGA: 4 стъпки

Видео: Направете всеки сензор от FPGA: 4 стъпки
Видео: 4х канальное Zigbee реле ZG-003-RF с сухими контактами - способы подключения, режимы работы 2024, Ноември
Anonim
Image
Image
FPGA
FPGA

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

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

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

В момента на писане на това, FPGA може да действа като LM75 с данни за температурата, съхранявани в BRAM (на FPGA).

Стъпка 1: MCU

Моят MCU по избор е LPC4337 на LPCXpresso. Върху него имам щит (LPC General Purpose Shield) с дисплей и истински LM75 сензор. LPC4337 е ARM Cortex M4, работещ на 200MHz и по -малък Cortex M0 (не се използва тук). Истинският сензор е свързан към периферния I2C1, а нашият виртуален ще бъде свързан към I2C0. Източникът е достъпен на моя GitHub.

Как да го изградим? Изтеглете LPCXpresso IDE заедно с библиотеката LPCOpen. Импортирайте тази библиотека в IDE и също отворете проекта от GitHub. Всичко трябва да бъде конфигурирано и можете да кликнете върху „Отстраняване на грешки“в долния ляв ъгъл.

Целият проект се основава на един от примерите на NXP (за да покаже, че моят проект симулира истински сензор и не се нуждае от специален код от страна на MCU). В основния файл (наречен iox_sensor.cpp) се намира този код:

#дефинирайте SENSORS_ON_SHIELD

#ако е дефиниран (SENSORS_ON_SHIELD) #дефинирайте SHIELD_I2C I2C1 #дефиниран елиф (SENSORS_ON_FPGA) #дефинирайте SHIELD_I2C I2C0 #endif

Чрез промяна на SENSOR_ON_SHIELD и SENSOR_OR_FPGA потребителят може да превключи по време на компилиране към кой сензор да говори, реалния или виртуалния, тъй като те са на различни I2C пинове.

Стъпка 2: FPGA

Моята 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 получава изпратените байтове и актуализира симулираната вътрешна структура на сензора. Може просто да актуализира указателя на регистъра или да поиска нови данни от източника на данни. Компонентът данни предава нови точки от данни. В момента това е просто ROM памет, чийто адрес се увеличава (приблизително) два пъти в секунда.

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

Стъпка 4: Съберете всичко заедно

Събирайки всичко заедно
Събирайки всичко заедно
Събирайки всичко заедно
Събирайки всичко заедно

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

Внимание

Не можете да свържете двете платки заедно просто така. Защо? PMod е създаден, за да улесни свързването на главна/хост платка (която дава захранване) към подчинена/сензорна платка (която получава захранване). Но в този проект и двете платки дават мощност и ако свържете 3.3V изхода от една платка към 3.3V изхода на другата платка, може да се случат лоши неща. Но те може и да не го направят, а вие просто да промените параметрите на захранващите релси на FPGA (те са много внимателно проектирани). Така че не поемайте този риск и преместете конектора с един щифт наляво (и също обърнете FPGA платката), както се вижда на горните снимки. Ето спецификацията на PMod, вие я изучавате, това, което направих с кратки думи, е да не свързвам VCC на двете платки.

Препоръчано: