Sadržaj:

Napravite bilo koji senzor od FPGA: 4 koraka
Napravite bilo koji senzor od FPGA: 4 koraka

Video: Napravite bilo koji senzor od FPGA: 4 koraka

Video: Napravite bilo koji senzor od FPGA: 4 koraka
Video: Raptoreum AMA for November 26, 2023 (Chapters in Description) 2024, Juli
Anonim
Image
Image
FPGA
FPGA

Većina proizvođača pokušala je barem jednom u životu izgraditi termometar, možda onaj koji imaju kod kuće nije dovoljno pametan, ili možda misle da mogu izgraditi sljedeći NEST. Ipak, u nekom trenutku imali su mikrokontroler sa svojim najsavremenijim softverom spojenim na senzor temperature (a možda i druge senzore: pritisak, svjetlost). Do sada je sve savršeno, softver radi i senzor senzorira. Hajde da ga testiramo!

Hmmmm … možda bi trebao zagrijati senzor sušilom za kosu i ohladiti ga pomoću leda, radi neko vrijeme. Ali ne izgleda profesionalno, senzor prebrzo mijenja vrijednosti ako ga zagrijete, ne zagrijava se više od nekoliko stupnjeva. Projekat je propast! Ali algoritam je nov, uzima u obzir mnogo faktora, šteta što se zaglavio u ovoj glupo sporednoj stvari.

Moje rješenje je sljedeće: učinite da FPGA djeluje kao senzor sa vrijednostima koje se prenose s računala (ili pohranjene u memoriji, ili kreirane ad-hoc unutar FPGA-e). Dakle, za vaš dragocjeni MCU FPGA izgleda kao senzor, ali ne i bilo koji senzor: koji god senzor želite. Možda odlučite da vam je potrebna veća rezolucija ili brže vrijeme odziva od očekivanog, morate promijeniti senzor. Naručite preko interneta, stići će za par dana, za par mjeseci, ko zna. Respinirajte svoju PCB ili naručite modul s novim senzorom. Ili … nekoliko klikova i FPGA je konfigurirana kao vaš potpuno novi senzor i može oponašati točnu unutrašnju konfiguraciju.

U trenutku pisanja ovoga, FPGA bi mogla djelovati kao LM75 s podacima o temperaturi pohranjenim u BRAM -u (na FPGA -i).

Korak 1: MCU

Moj MCU po izboru je LPC4337 na LPCXpressu. Na vrhu imam štit (LPC štit opšte namjene) sa ekranom i pravim LM75 senzorom. LPC4337 je ARM Cortex M4 koji radi na 200MHz i manji Cortex M0 (ovdje se ne koristi). Pravi senzor spojen je na periferiju I2C1, a naš virtualni senzor bit će spojen na I2C0. Izvor je dostupan na mom GitHubu.

Kako ga izgraditi? Preuzmite LPCXpresso IDE zajedno sa LPCOpen bibliotekom. Uvezite tu biblioteku u IDE i otvorite projekat sa GitHub -a. Sve bi trebalo biti konfigurirano i možete kliknuti na "Otklanjanje grešaka" u donjem lijevom kutu.

Cijeli projekt se temelji na jednom od primjera NXP -a (kako bi pokazao da moj projekt simulira pravi senzor i da mu nije potreban poseban kod sa MCU -a). U glavnoj datoteci (koja se naziva iox_sensor.cpp) nalazi se ovaj kod:

#define SENSORS_ON_SHIELD

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

Promjenom SENSOR_ON_SHIELD i SENSOR_OR_FPGA korisnik može prebaciti u vrijeme kompajliranja na koji senzor razgovarati, pravi ili virtualni, jer se nalaze na različitim I2C pinovima.

Korak 2: FPGA

Moja FPGA ploča po izboru je Artix 7 proizvođača Digilent sa Xilinx Arty 7. Koriste se dva PMod konektora, jedan za otklanjanje grešaka, a drugi za stvarnu nosivost, vezu sa MCU pločom.

Ponovo, izvorni kod za FPGA dostupan je na mom GitHub -u (fascikla fpgaSide).

Kako ga izgraditi? Preuzmite, kupite ili otvorite Xilinx Vivado IDE. Uvezite datoteke projekta s GitHub -a. Jedna od datoteka (content.coe) su podaci o temperaturi u sirovom formatu koji će se prenositi na lažni senzor. Postoji i Excel datoteka s istim imenom koja pomaže pri pretvaranju podataka o temperaturi čitljivih za ljude u sirove podatke LM75. Planiram ovo promijeniti u automatizirani proces s nekim softverom napisanim na Javi, ali do tada ovo rješenje funkcionira. Sinteza i implementacija bi trebali potrajati, uzmite ovo u obzir.

Korak 3: Kako to funkcionira?

Kako to radi?
Kako to radi?
Kako to radi?
Kako to radi?

Kao što sam rekao, za MCU, FPGA izgleda kao senzor, točnije I2C senzor. Izlaz periferije I2C spojen je na ulaz FPGA. Unutar FPGA-e postoje 3 glavne komponente:- I2C kontroler- I2C uređaj- podaci I2C kontroler prima I2C podatke sa pinova FPGA-e i šalje ih ostatku FPGA-e i čini isto obrnutim redoslijedom. Održava internu mašinu stanja za I2C protokol (usput, evo dokumentacije za nju). Šta ova komponenta šalje na I2C uređaj? Trenutno primljeni bajt, položaj tog bajta u trenutnoj komunikaciji i da li MCU piše ili čita sa FPGA -e. I2C uređaj prima poslane bajtove i ažurira simuliranu unutrašnju strukturu senzora. Može samo ažurirati pokazivač registra ili zatražiti nove podatke od izvora podataka. Komponenta Data prenosi nove podatkovne točke. Trenutno je to samo ROM memorija čija se adresa povećava (približno) dva puta u sekundi.

Šta je moj krajnji cilj? To je prikazano na drugoj slici. Odnosno: omogućiti više I2C uređaja (senzora i drugih) da se istovremeno simuliraju unutar FPGA -e. Podaci na pozadini senzora će se keširati u FPGA i prenositi sa računara putem USB -a ili Etherneta. Podržavajte naprednije senzore i druge I2C uređaje (memorija, LED upravljački programi itd.).

Korak 4: Sastavite sve zajedno

Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno

Sada je trenutak da sve povežete zajedno. Teoretski je jednostavno: mcu ploča ima PMod konektor (I2C0 i SSP0 (može raditi kao SPI)). Artix ploča ima 4 PMod konektora koji se mogu koristiti kako god želite. Odabirem konektor D za razgovor s MCU -om i konektor B za povezivanje s mojim Logic Analyzerom.

Upozorenje

Ne možete jednostavno spojiti dvije ploče zajedno. Zašto? PMod je napravljen za olakšavanje povezivanja glavne/host ploče (koja daje napajanje) na slave/senzorsku ploču (koja prima napajanje). Ali u ovom projektu obje ploče daju snagu i ako spojite 3.3V izlaz s jedne ploče na 3.3V izlaz druge ploče, mogle bi se dogoditi loše stvari. Ali oni možda neće, a vi samo promijenite parametre vodova FPGA -e (vrlo su pažljivo dizajnirani). Zato nemojte riskirati i pomaknite konektor jednim pinom ulijevo (i okrenite FPGA ploču) kao što se vidi na gornjim slikama. Evo PMod specifikacije, proučite je, a ja sam ukratko rekao da ne povezujem VCC -ove dvije ploče.

Preporučuje se: