Analizor logic

Introducere

Proiectul implementează un analizor logic, capabil să citească mai mulți pini de intrare și să transmită informații despre pulsurile înregistrate către un PC. Pe PC va rula un script care va afișa valorile măsurate de aparat. Pentru a testa funcționalitatea dispozitivului, se va simula o comunicație UART normală între microcontroller și PC, iar 2 pini de intrare vor măsura semnalul de pe pinii RX și TX ai microcontroler-ului.

Scopul acestui sistem este de a oferi sprijin pentru depanarea sistemelor embedded la un preț redus. Astfel, el se preteaza foarte bine pentru observarea semnalelor de frecvență redusă.

Descriere generala

Schema bloc

Sistemul va fi alcatuit din microcontroler-ul Arduino UNO R4 Wifi, care va comunica folosind UART cu laptop-ul / PC-ul. 4 pini ai acestui controler vor fi folositi pentru a detecta semnalul digital, iar rezultatele vor fi trimise pe laptop, unde vor fi afisate intr-un format grafic. Pentru testarea functionalitatii, alti 2 pini de intrare sunt folositi pentru a monitoriza un al doilea canal UART intre Arduino si Laptop, folosind un cablu USB to TTL.

Diagrama de control

Microcontroler-ul așteaptă 3 evenimente: 1. Timer-ul ce indică momentul transmisiei către PC termină de numărat - atunci se va realiza transmiterea informațiilor către PC 2. Un pin GPIO de input își schimbă starea - se va stoca această informație pe microcontroler (până la urmatoarea transmisie) 3. Microcontroler-ul primește un mesaj de pe canalul UART - va transmite un byte aleator (comunicația are unic rol de testare a analizorului)

Schema electrică

Această schemă minimală indică modul în care se realizează măsurarea pinilor responsabili de comunicația UART. Cei 4 pini de intrare care nu sunt folosiți în măsurarea semnalului apar ca nefolosiți, în realitate ei având legate cabluri cu clești. Atât placa Arduino, cât și conectorul TTL-USB se conectează la laptop / PC (acesta având și rolul de sursă de energie).

Descriere hardware

Componente folosite

  1. Arduino UNO R4 Wifi - am ales să folosesc varianta R4, deoarece aceasta are mult mai multă memorie RAM (32KB RAM vs 2KB RAM la Arduino UNO R3), ceea ce este important pentru stocarea datelor între transmisiile către PC
  2. Cabluri de lăgatură și cleme de contact
  3. Cablu USB-C - USB-C
  4. Cablu USB to TTL
  5. Laptop / PC
  6. Breadboard (conectare pini de testare)

Poze

Descriere software

Mediu de dezvoltare

  1. Visual Studio Code, cu extensia PlatformIO
  2. Proiectul propune 2 aplicații:
    1. O aplicație C++ încărcată pe microcontroller
    2. Un script Python ce rulează pe calculator și are rolul de a gestiona comunicația pe serială și de a afișa datele primite în format grafic.
  3. Biblioteci folosite (Arduino): nu am folosit nicio librărie externă. În schimb, folosesc locațiile regiștrilor microporcesorului RA4M1 definite în Arduino.h.
  4. Biblioteci folosite (Python): am folosit biblioteca matplotlib pentru afișarea graficelor dependenței nivelelor logice de timp.

Arhitectura programelor

Aplicație Arduino

Programul pentru sistemul încorporat este spart în următoarele fișiere:

- gpio.h - oferă declarația funcției void init_gpio(), responsabilă de setarea pinilor GPIO

- interrupts.h - oferă un mecanism facil de adăugare a unor rutine de tratare a întreruperii în vectorul de întreruperi. Astfel, sunt declarate:

  • tipul rutinelor de tratare a întreruperilor: typedef void (*irq_func_t)(void)
  • tipul evenimentelor acceptate - interrupt_event_t
  • macro-uri peste interrupt_event_t
  • funcția de adăugare a unei rutine în vectorul de întreruperi - void addInterrupt(interrupt_event_t event, irq_func_t isr)

- timer.h - oferă declarația funcției void init_timer()

- uart.h - oferă suport pentru lucrul cu seriala. Astfel, sunt declarate:

  • funcția de inițializare void init_uart()
  • funcția de trimitere a mesajelor înregistrate pe serială void sendDigitalData()
  • un obiect global, responsabil de gestionarea mesajelor ce trebuie trimise.

- main.cpp - conține logica principală a aplicației

  • în funcția setup() inițializează modulul de UART, timer-ul și pini de GPIO și activează întreruperile.
  • în funcția loop() trimite date către calculator pe serială.

- timer.cpp - conține implementarea inițializării timer-ului, pentru care se folosește doar canalul 0, în mod saw-wave PWM, up-counting.

- interrupts.cpp - conține implementarea adăugării unei rutine în vectorul de întrerupere. Practic, funcția realizează legătura către tipul întreruperii prin setarea unui registru IELSRn și adaugă pointer-ul la funcție în vectorul de întrerupere manual.

- uart.cpp - acest fișier conține implementarea mai multor funcționalități

  • definirea inițializării modulelor UART - se inițializează 2 module (SPI2, baudarate 19200 și SPI9, baudrate 115200). Pe SPI2 microcontroller-ul așteaptă un caracter literă mare de la calculator și, în rutina întreruperii cauzate de primirea mesajului, încearcă să trimită înapoi caracterul mic aferent. Pe SPI9 se trimit datele culese de la GPIO.
  • definirea mecanismului de trimitere pe seriala SPI2. Practic, de fiecare dată când transmisia pe SPI9 este posibilă, programul verifică dacă mai are ceva de transmis din buffer-ul de transmisie, iar, în caz contrar, încarcă în buffer prima înregistrare de stare GPIO netrimisă.

- gpio.cpp - acest fișier conține definirea funcției de inițializare a pinilor de input, în care acești pini sunt trecuți pe modul de input cu rezistență de pull-up și generarează întrerupere pe ambele fronturi. Totodată, se introduce rutina de tratere a întreruperii pe porturile 1, 3 și 4. Această rutină preia starea curentă a pinilor și timpul curent (counter-ul numărătorului) și le introduce în coada (circulară) de stări ce este transmisă în uart.cpp.

Script rulat pe calculator

Programul executat pe laptop/PC se bazează pe un singur fișier Python. Aplicația este multithreaded, folosindu-se de 2 thread-uri pentru comunicația pe cele 2 canale seriale către Arduino (COM5 și COM6). Pe thread-ul răspunzător de COM6 (portul corespunzător SPI2 a Arduino), se așteaptă mesaj de la tastatură și se trimite șirul de caractere către microcontroller. Pe thread-ul ce gestionează COM5 (portul legat la SPI9 a Arduino) se așteaptă mesaj cu starea și, când acesta sosește, se adaugă într-o coadă. Pe thread-ul principal se afișează dinamic evoluția nivelului logic pe RX și TX folosind animații (odată la un interval de timp, dacă s-a detectat o stare nouă, se glisează tot conținutul original în stânga și se adaugă noua valoare în buffer-ele celor 2 legături). Graficele afișate au pe axa orizontală timpul exprimat în us.

Surse cod

Rezultate obținute

Link videoclip demonstrație: https://youtu.be/VTMEd0hsHNk

Concluzii

Sistemul a reușit cu succes să detecteze comunicația pe serială (atât bitul de start, cât și codificarea caracterelor). În urma unor rulări succesive cu litera A (în care 5 biți de 0 consecutivi), am observat că diferența maximă de timp pentru transmisie între 2 rezultate a fost de aproximativ 7 ciclii ai ceasului folosit de GPIO (iar transmsia celor 5 biți dura aproximativ 700 de ciclii de ceas).

În ceea ce privește beneficiile acestui proiect, consider că analizorul logic m-a ajutat să învăț să gestionez microprocesoare cu o documentație mai puțin clară (nu există exemple de cod în datasheet, iar în general utilizatorii acestui procesor folosesc librăriile oferite de firma Renesas pentru a abstractiza lucrul cu regiștrii).

Planificare - Diagrama Gantt

Documentație

Datasheet microprocesor RA4M1 - https://cdn.sparkfun.com/assets/b/1/d/3/6/RA4M1_Datasheet.pdf

Schema electronică a microcontroller-ului - https://docs.arduino.cc/resources/schematics/ABX00087-schematics.pdf

Documentație matplotlib (Pyhton) - https://matplotlib.org/

pm/prj2025/ccristi/rares_andrei.ticus.txt · Last modified: 2025/05/27 04:20 by rares_andrei.ticus
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0