Kazalo:

Naredite kateri koli senzor iz FPGA: 4 koraki
Naredite kateri koli senzor iz FPGA: 4 koraki

Video: Naredite kateri koli senzor iz FPGA: 4 koraki

Video: Naredite kateri koli senzor iz FPGA: 4 koraki
Video: Котел не набирает температуру: как будто зависло, плохо греет 2024, November
Anonim
Image
Image
FPGA
FPGA

Večina izdelovalcev je vsaj enkrat v življenju poskušala zgraditi termometer, morda tisti, ki ga imajo doma, ni dovolj pameten ali pa se jim zdi, da lahko zgradijo naslednji NEST. Kljub temu so v nekem trenutku imeli mikrokrmilnik s svojo najsodobnejšo programsko opremo, priključeno na temperaturni senzor (in morda druge senzorje: tlak, svetlobo). Do sedaj je bilo vse v redu, programska oprema deluje in senzor zaznava. Preizkusimo!

Hmmmm … morda bi moral senzor ogreti s sušilcem za lase in ga ohladiti z ledom, nekaj časa deluje. Vendar se ne zdi profesionalno, senzor prehitro spreminja vrednosti, če ga segrejete, se ne segreje več kot nekaj stopinj. Projekt je propad! Toda algoritem je nov, upošteva veliko dejavnikov, škoda, da se mu je zataknilo pri tej neumno manjši stvari.

Moja rešitev je naslednja: naj FPGA deluje kot senzor z vrednostmi, ki se pretakajo iz osebnega računalnika (ali shranjene v pomnilniku, ali ustvarijo ad-hoc znotraj FPGA). Tako je za vaš dragoceni MCU FPGA videti kot senzor, ne pa kakršen koli senzor: katerikoli senzor vam je všeč. Morda se odločite, da potrebujete več ločljivosti ali hitrejši odzivni čas, kot je bilo pričakovano, morate zamenjati senzor. Naročite ga na spletu, prišel bo čez par dni, v nekaj mesecih, kdo ve. Ponovno potisnite tiskano vezje ali naročite modul z novim senzorjem. Ali… nekaj klikov in FPGA je konfiguriran kot vaš popolnoma nov senzor in lahko posnema natančno notranjo konfiguracijo.

V tem času bi lahko FPGA deloval kot LM75 s temperaturnimi podatki, shranjenimi v BRAM (na FPGA).

1. korak: MCU

Moj izbran MCU je LPC4337 na LPCXpressu. Na vrhu imam ščit (LPC splošni ščit) z zaslonom in pravim senzorjem LM75. LPC4337 je ARM Cortex M4, ki deluje na 200 MHz, in manjši Cortex M0 (tukaj se ne uporablja). Pravi senzor je priključen na periferno enoto I2C1, naš virtualni pa na I2C0. Vir je na voljo na mojem GitHubu.

Kako ga zgraditi? Prenesite LPCXpresso IDE skupaj s knjižnico LPCOpen. Uvozite to knjižnico v IDE in odprite projekt tudi iz GitHub -a. Vse je treba konfigurirati in v spodnjem levem kotu kliknite »Odpravi napake«.

Celoten projekt temelji na enem od primerov NXP (ki dokazuje, da moj projekt simulira pravi senzor in ne potrebuje posebne kode na strani MCU). V glavni datoteki (imenovani iox_sensor.cpp) je ta koda:

#define SENSORS_ON_SHIELD

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

S spreminjanjem SENSOR_ON_SHIELD in SENSOR_OR_FPGA lahko uporabnik v času prevajanja preklopi na kateri senzor, pravi ali navidezni, saj so na različnih I2C zatičih.

2. korak: FPGA

Moja izbrana plošča FPGA je Artix 7, ki ga je izdelal Digilent in ima Xilinx Arty 7. Uporabljata se dva priključka PMod, eden za odpravljanje napak in eden za dejansko obremenitev, povezava s ploščo MCU.

Ponovno je izvorna koda za FPGA na voljo na mojem GitHubu (mapa fpgaSide).

Kako ga zgraditi? Prenesite, kupite ali odprite Xilinx Vivado IDE. Uvozite projektne datoteke iz GitHub -a. Ena od datotek (content.coe) so podatki o temperaturi v surovi obliki, ki se bodo pretakali na ponarejen senzor. Obstaja tudi Excelova datoteka z istim imenom, ki pomaga pri pretvorbi človeško berljivih temperaturnih podatkov v surove podatke LM75. Nameravam to spremeniti v avtomatiziran postopek z delom programske opreme, napisane v Javi, vendar do takrat ta rešitev deluje. Sinteza in implementacija bi morala trajati nekaj časa, upoštevajte to.

3. korak: Kako deluje?

Kako deluje?
Kako deluje?
Kako deluje?
Kako deluje?

Kot sem rekel, je za MCU FPGA videti kot senzor, natančneje kot I2C senzor. Izhod periferne enote I2C je priključen na vhod FPGA. Znotraj FPGA so tri glavne komponente:- krmilnik I2C- podatki naprave I2C- krmilnik I2C sprejema podatke I2C iz zatičev FPGA in jih pošlje preostalemu delu FPGA in isto naredi v obratnem vrstnem redu. Vzdržuje notranji državni stroj za protokol I2C (mimogrede, tukaj je dokumentacija zanj). Kaj ta komponenta pošilja v napravo I2C? Trenutno prejeti bajt, položaj tega bajta v trenutni komunikaciji in ali MCU piše ali bere iz FPGA. Naprava I2C sprejme poslane bajte in posodobi simulirano notranjo strukturo senzorja. Lahko samo posodobi kazalec registra ali zahteva nove podatke od vira podatkov. Komponenta Data pretaka nove podatkovne točke. Trenutno je to le pomnilnik ROM, katerega naslov se poveča (približno) dvakrat na sekundo.

Kaj je moj končni cilj? To je prikazano na drugi sliki. To pomeni: omogočite, da se znotraj FPGA hkrati simulira več naprav I2C (senzorjev in drugih). Podatki na zaledju senzorja se predpomnijo v FPGA in pretakajo iz računalnika prek USB -ja ali etherneta. Podpirajte naprednejše senzorje in druge naprave I2C (pomnilnik, gonilniki LED itd.).

4. korak: Združite vse skupaj

Vse skupaj
Vse skupaj
Vse skupaj
Vse skupaj

Zdaj je čas, da vse skupaj povežemo. Teoretično je preprosto: plošča mcu ima priključek PMod (I2C0 in SSP0 (lahko deluje kot SPI)). Plošča Artix ima 4 PMod priključke, ki jih lahko uporabljate, kot želite. Izberem priključek D za pogovor z MCU in priključek B za povezavo z mojim logičnim analizatorjem.

Opozorilo

Ne morete kar tako povezati dveh plošč skupaj. Zakaj? PMod je bil zgrajen za olajšanje povezave glavne/gostiteljske plošče (ki daje moč) s podrejeno/senzorsko ploščo (ki prejema napajanje). Toda v tem projektu obe plošči dajeta moč in če priključite 3.3V izhod z ene plošče na 3.3V izhod druge plošče, se lahko zgodijo slabe stvari. Morda pa ne, morda pa samo spremenite parametre vodil FPGA (zelo skrbno so zasnovani). Zato ne tvegajte in premaknite priključek za en zatič v levo (in obrnite tudi ploščo FPGA), kot je prikazano na zgornjih slikah. Tukaj je specifikacija PMod, ki ste jo preučili, kar sem naredil s kratkimi besedami, je, da ne povežem VCC -jev obeh plošč.

Priporočena: