Spisu treści:

Zrób dowolny czujnik z FPGA: 4 kroki
Zrób dowolny czujnik z FPGA: 4 kroki

Wideo: Zrób dowolny czujnik z FPGA: 4 kroki

Wideo: Zrób dowolny czujnik z FPGA: 4 kroki
Wideo: Multisensor na ESP8266 #2, czyli pomiar światła dla Domoticza (i nie tylko) 2024, Lipiec
Anonim
Image
Image
FPGA
FPGA

Większość twórców przynajmniej raz w życiu próbowała zbudować termometr, może ten, który mają w domu, nie jest wystarczająco inteligentny, a może myślą, że mogą zbudować kolejny NEST. Niemniej jednak w pewnym momencie mieli mikrokontroler z najnowocześniejszym oprogramowaniem podpiętym do czujnika temperatury (i być może innych czujników: ciśnienia, światła). Do tej pory wszystko idealnie, oprogramowanie działa i czujnik wykrywa. Przetestujmy to!

Hmmmm… może powinien podgrzać czujnik suszarką do włosów i schłodzić lodem, przez jakiś czas działa. Ale nie wydaje się to profesjonalne, czujnik zmienia wartości zbyt szybko, jeśli go podgrzejesz, nie nagrzewa się więcej niż o kilka stopni. Projekt to popiersie! Ale algorytm jest nowy, bierze pod uwagę wiele czynników, szkoda, że utknął w tej głupio błahej rzeczy.

Moje rozwiązanie jest następujące: spraw, aby FPGA działał jako czujnik z wartościami przesyłanymi strumieniowo z komputera (lub przechowywanymi w pamięci lub utworzonymi ad-hoc wewnątrz FPGA). Tak więc dla twojego cennego MCU FPGA wygląda jak czujnik, ale nie jakikolwiek czujnik: dowolny czujnik. Być może uznasz, że potrzebujesz większej rozdzielczości lub szybszego czasu reakcji niż oczekiwałeś, musisz zmienić czujnik. Zamów online, dotrze za kilka dni, za kilka miesięcy, kto wie. Odkręć płytkę PCB lub zamów moduł z nowym czujnikiem. Lub… kilka kliknięć i FPGA jest skonfigurowany jako zupełnie nowy czujnik i może emulować dokładną konfigurację wewnętrzną.

W chwili pisania tego tekstu FPGA może działać jako LM75 z danymi temperatury przechowywanymi w pamięci BRAM (na FPGA).

Krok 1: MCU

Mój wybrany MCU to LPC4337 na LPCXpresso. Na wierzchu mam nakładkę (LPC General Purpose Shield) z wyświetlaczem i prawdziwą matrycą LM75. LPC4337 to ARM Cortex M4 działający z częstotliwością 200 MHz i mniejszy Cortex M0 (nie jest tutaj używany). Rzeczywisty czujnik jest podłączony do urządzenia peryferyjnego I2C1, a nasz wirtualny zostanie podłączony do I2C0. Źródło jest dostępne na moim GitHubie.

Jak to zbudować? Pobierz LPCXpresso IDE wraz z biblioteką LPCOpen. Zaimportuj tę bibliotekę do IDE, a także otwórz projekt z GitHub. Wszystko powinno być skonfigurowane i możesz kliknąć "Debuguj" w lewym dolnym rogu.

Cały projekt bazuje na jednym z przykładów NXP (by pokazać, że mój projekt symuluje prawdziwy czujnik i nie wymaga specjalnego kodu po stronie MCU). W głównym pliku (o nazwie iox_sensor.cpp) znajduje się następujący kod:

#define SENSORS_ON_SHIELD

#if define(SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elifdefined(SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

Zmieniając SENSOR_ON_SHIELD i SENSOR_OR_FPGA użytkownik jest w stanie przełączyć w czasie kompilacji, z którym czujnikiem ma rozmawiać, rzeczywistym lub wirtualnym, ponieważ są one na różnych pinach I2C.

Krok 2: FPGA

Moją płytą FPGA, którą wybrałem, jest Artix 7 firmy Digilent, mająca Xilinx Arty 7. Dwa złącza PMod są używane, jedno do debugowania, a drugie do rzeczywistego ładunku, połączenia z płytą MCU.

Ponownie, kod źródłowy FPGA jest dostępny na moim GitHub (folder fpgaSide).

Jak to zbudować? Pobierz, kup lub otwórz Xilinx Vivado IDE. Zaimportuj pliki projektu z GitHub. Jednym z plików (content.coe) są dane o temperaturze w surowym formacie, które będą przesyłane strumieniowo do fałszywego czujnika. Istnieje również plik Excel o tej samej nazwie, który pomaga w konwersji czytelnych dla człowieka danych temperatury na surowe dane LM75. Planuję zmienić to na zautomatyzowany proces z oprogramowaniem napisanym w Javie, ale do tego czasu to rozwiązanie działa. Synteza i implementacja powinny zająć trochę czasu, weź to pod uwagę.

Krok 3: Jak to działa?

Jak to działa?
Jak to działa?
Jak to działa?
Jak to działa?

Jak powiedziałem, dla MCU FPGA wygląda jak czujnik, a dokładniej czujnik I2C. Wyjście urządzenia peryferyjnego I2C jest podłączone do wejścia FPGA. Wewnątrz FPGA znajdują się 3 główne elementy: - Kontroler I2C - Urządzenie I2C - Dane Kontroler I2C odbiera dane I2C z pinów FPGA i wysyła je do reszty FPGA i robi to samo w odwrotnej kolejności. Utrzymuje wewnętrzną maszynę stanów dla protokołu I2C (nawiasem mówiąc, tutaj jest jego dokumentacja). Co ten komponent wysyła do urządzenia I2C? Aktualnie odebrany bajt, pozycja tego bajtu w bieżącej komunikacji i czy MCU zapisuje lub odczytuje z FPGA. Urządzenie I2C odbiera wysłane bajty i aktualizuje symulowaną wewnętrzną strukturę czujnika. Może po prostu zaktualizować wskaźnik rejestru lub zażądać nowych danych ze źródła danych. Komponent Dane przesyła strumieniowo nowe punkty danych. Obecnie jest to po prostu pamięć ROM, której adres jest zwiększany (w przybliżeniu) dwa razy na sekundę.

Jaki jest mój cel końcowy? Pokazuje to drugi obrazek. Oznacza to: umożliwienie jednoczesnej symulacji większej liczby urządzeń I2C (czujników i innych) wewnątrz FPGA. Dane na zapleczu czujnika mają być buforowane w FPGA i przesyłane strumieniowo z komputera przez USB lub Ethernet. Obsługa bardziej zaawansowanych czujników i innych urządzeń I2C (pamięć, sterowniki LED itp.).

Krok 4: Złożenie wszystkiego razem

Kładąc wszystko razem
Kładąc wszystko razem
Kładąc wszystko razem
Kładąc wszystko razem

Teraz nadszedł czas, aby wszystko połączyć. Teoretycznie jest to proste: płytka mcu ma złącze PMod (I2C0 i SSP0 (może działać jak SPI)). Płyta Artix posiada 4 złącza PMod, których można używać w dowolny sposób. Wybieram złącze D, aby komunikować się z MCU i złącze B, aby połączyć się z moim analizatorem stanów logicznych.

Ostrzeżenie

Nie da się tak po prostu połączyć ze sobą dwóch płyt. Czemu? PMod został zbudowany w celu ułatwienia połączenia płyty Master/Host (która daje zasilanie) z płytą Slave/Sensor (która otrzymuje zasilanie). Ale w tym projekcie obie płyty dają moc i jeśli połączysz wyjście 3.3V z jednej płyty z wyjściem 3.3V drugiej płyty, mogą się zdarzyć złe rzeczy. Ale mogą nie i możesz po prostu zmienić parametry szyn zasilających FPGA (są bardzo starannie zaprojektowane). Więc nie ryzykuj i przesuń złącze o jeden pin w lewo (a także odwróć płytkę FPGA), jak widać na powyższych zdjęciach. Tutaj jest specyfikacja PMod, możesz ją przestudiować, to co zrobiłem w krótkich słowach to nie łączenie VCC dwóch płyt.

Zalecana: