Uczyń dowolny czujnik poza FPGA: 4 kroki

Uczyń dowolny czujnik poza FPGA: 4 kroki

Spisu treści:

Anonim

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

Hmmmm … może powinien rozgrzać czujnik przy pomocy suszarki do włosów i ochłodzić go za pomocą lodu, działa przez jakiś czas. Ale to nie wydaje się profesjonalne, czujnik zmienia wartości zbyt szybko, jeśli je podgrzejesz, nie nagrzewa się więcej niż kilka stopni. Projekt to popiersie! Ale algorytm jest nowy, bierze pod uwagę wiele czynników, szkoda, że ​​utknął w tej głupio pomniejszej rzeczy.

Moje rozwiązanie jest takie: spraw, aby FPGA działał jako czujnik z wartościami przesyłanymi strumieniowo z komputera (lub przechowywanymi w pamięci, lub tworzonymi ad-hoc wewnątrz FPGA). Tak więc dla twojego cennego MCU FPGA wygląda jak czujnik, ale nie jakikolwiek czujnik: którykolwiek czujnik lubisz. Może zdecydujesz, że potrzebujesz większej rozdzielczości lub krótszego czasu odpowiedzi niż oczekiwano, musisz zmienić czujnik. Zamów go online, który dotrze w ciągu kilku dni, kilku miesięcy, kto wie. Odpowiedz na PCB lub zamów moduł z nowym czujnikiem. Lub … kilka kliknięć i układ FPGA jest skonfigurowany jako nowy czujnik i może emulować dokładną konfigurację wewnętrzną.

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

Kieszonkowe dzieci:

Krok 1: MCU

Moim MCU jest LPC4337 na LPCXpresso. Do tego mam tarczę (LPC General Purpose Shield) z wyświetlaczem i prawdziwym czujnikiem LM75. LPC4337 to ARM Cortex M4 pracujący z częstotliwością 200 MHz i mniejszym Cortexem M0 (nieużywany tutaj). Prawdziwy 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 go 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 opiera się na jednym z przykładów NXP (aby pokazać, że mój projekt symuluje prawdziwy czujnik i nie wymaga specjalnego kodu po stronie MCU). W głównym pliku (zwanym iox_sensor.cpp) znajduje się ten kod:

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

Zmieniając SENSOR_ON_SHIELD i SENSOR_OR_FPGA użytkownik może przełączać w czasie kompilacji, do którego czujnika ma mówić, rzeczywisty lub wirtualny, ponieważ są na różnych pinach I2C.

Krok 2: FPGA

Moją wybraną płytą FPGA jest Artix 7 firmy Digilent, posiadający Xilinx Arty 7. Używane są dwa złącza PMod, jedno do debugowania i jedno do rzeczywistego ładunku, połączenie z płytą MCU.

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

Jak go zbudować? Pobierz, kup lub otwórz Xilinx Vivado IDE. Zaimportuj pliki projektu z GitHub. Jeden z plików (content.coe) to dane temperatury w formacie surowym, 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 danych temperatury czytelnych dla człowieka na surowe dane LM75. Planuję zmienić to na zautomatyzowany proces za pomocą oprogramowania napisanego w Javie, ale do tego czasu to rozwiązanie działa. Synteza i implementacja powinny trochę potrwać, weź to pod uwagę.

Krok 3: Jak to działa?

Jak już 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 ze styków FPGA i wysyła je do pozostałej części układu FPGA i robi to samo w odwrotnej kolejności. Utrzymuje wewnętrzną maszynę stanu dla protokołu I2C (nawiasem mówiąc, tutaj jest dokumentacja tego). Co ten komponent wysyła do urządzenia I2C? Aktualnie odebrany bajt, pozycja tego bajtu w bieżącej komunikacji i to, 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. Składnik danych strumieniuje nowe punkty danych. Obecnie jest to tylko pamięć ROM, której adres jest zwiększany (w przybliżeniu) dwa razy na sekundę.

Jaki jest mój cel końcowy? Jest to pokazane na drugim zdjęciu. Oznacza to: umożliwienie symulacji większej liczby urządzeń I2C (czujników i innych) jednocześnie w 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: Łączenie wszystkiego

Nadszedł czas, aby połączyć wszystko. Teoretycznie jest to proste: płyta mcu ma złącze PMod (I2C0 i SSP0 (może działać jak SPI)). Płytka Artix ma 4 złącza PMod, które można wykorzystać w dowolny sposób. Wybieram złącze D, aby rozmawiać z MCU i złączem B, aby połączyć się z moim Logic Analyzerem.

Ostrzeżenie

Nie możesz połączyć dwóch tablic razem tak po prostu. Czemu? PMod został zbudowany, aby ułatwić podłączenie płyty głównej / hosta (która daje zasilanie) do płyty Slave / Sensor (która odbiera zasilanie). Ale w tym projekcie obie płyty dają moc i jeśli podłączysz wyjście 3,3 V z jednej płyty do wyjścia 3,3 V drugiej płyty złe rzeczy mógłby zdarzyć. Ale mogą nie i możesz zmienić parametry szyn zasilających FPGA (są bardzo starannie zaprojektowane). Więc nie podejmuj tego ryzyka i przesuń łącznik o jeden pin w lewo (a także odwróć płytkę FPGA), jak widać na powyższych zdjęciach. Oto specyfikacja PMod, badasz to, co w skrócie zrobiłem, to nie podłączać VCC dwóch płyt.