This shows you the differences between two versions of the page.
pm:prj2022:sgherman:analogmatrixmultiplier [2022/05/11 15:56] bogdan.circeanu created |
pm:prj2022:sgherman:analogmatrixmultiplier [2022/05/27 19:40] (current) bogdan.circeanu |
||
---|---|---|---|
Line 2: | Line 2: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | <note tip> | + | Proiectul are scopul de a construi un multiplicator analogic de vectori si matrici. |
- | Prezentarea pe scurt a proiectului vostru: | + | |
- | * ce face | + | Implementarea curenta realizeaza inmultirea dintre un vector 1x2 cu o matrice 2x2 in mod analogic, insa el poate fi extins. |
- | * care este scopul lui | + | |
- | * care a fost ideea de la care aţi pornit | + | Utilitatea proiectului se gaseste la o implementare pe scara mai larga, moment in care ar putea fi aplicat in diverse solutii de machine learning sau inteligenta artificiala, acest proiect fiind doar un demo care arata ca implementarea acestei idei este posibila. |
- | * de ce credeţi că este util pentru alţii şi pentru voi | + | |
- | </note> | + | |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | <note tip> | + | Pentru a realiza inmultirea analogica voi folosi urmatoarele componente: |
- | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | * 2 module DAC - care vor reprezenta valorile din vectorul 1x2 |
+ | * 4 digipots (potentiometre digitale): | ||
+ | * Vor reprezenta valorile din matrice | ||
+ | * Acestea vor fi legate intr-un grid | ||
+ | * Comunicarea cu ele se va realiza prin SPI | ||
+ | * 2 ADC-uri implementate prin rezistori si doua intrari analogice din Arduino | ||
+ | |||
+ | |||
+ | Functionalitate: | ||
+ | * Digipots-urile reprezinta valorile sub forma de conductanta (1/Rezistenta) | ||
+ | * Cand se aplica tensiune din DAC-uri, rezultatul inmultirii va fi intensitatea curentului din ramura respectiva | ||
+ | * Intensitatile apoi se aduna, natural (legea I Kirchhoff), din felul in care este legat grid-ul de digipots | ||
+ | * Astfel, in ADC-uri, ajung valorile corespunzatoare vectorului 1x2 rezultat | ||
+ | |||
+ | |||
+ | {{:pm:prj2022:sgherman:diagrama_proiect.drawio.png?800|}} | ||
- | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
- | </note> | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | <note tip> | + | Lista de piese: |
- | Aici puneţi tot ce ţine de hardware design: | + | * Arduino |
- | * listă de piese | + | * Rezistori |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | * Potentiometre digitale |
- | * diagrame de semnal | + | * Perfboard |
- | * rezultatele simulării | + | * Module DAC |
- | </note> | + | |
+ | ===== Schema Electrica ===== | ||
+ | |||
+ | {{:pm:prj2022:sgherman:SCH_BOGDAN_CIRCEANU_336CC.png?800|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
Line 31: | Line 48: | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | * Mediul de dezvoltare folosit a fost Arduino IDE. |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
- | ===== Rezultate Obţinute ===== | + | * Librarii 3rd-party folosite: DFRobot_MCP4725.h (pentru controlarea modulelor DAC). |
- | <note tip> | + | * Github: https://github.com/circeanubogdan/AnalogMatrixMultiplier |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
</note> | </note> | ||
- | ===== Concluzii ===== | + | Datele se introduc de la tastatura: valorile tensiunilor (elemente vector) si valorile pentru digipots (elemente matrice). |
- | ===== Download ===== | + | Pentru a transforma datele din numere din intervalul 1-100 in valori pentru digipots (0-255) folosesc urmatoarea functie: |
- | <note warning> | + | <code> |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | int val_to_step_digipot(int x) { |
+ | float y = 0.0002 + (float) (x - 1) * 0.0098 / 99; | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | float R = 1 / y; |
- | </note> | + | |
+ | int val = (int) (R - 100) * 51 / 950; | ||
+ | | ||
+ | return val; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Pentru a seta valorile in digipot folosesc functia care sa comunice prin I2C: | ||
+ | |||
+ | <code> | ||
+ | void setValue(int l, int value) | ||
+ | // sends value 'value' to SPI device on CS digital out pin 'l' | ||
+ | { | ||
+ | digitalWrite(l, LOW); | ||
+ | SPI.transfer(0); // send command byte | ||
+ | SPI.transfer(value); // send value (0~255) | ||
+ | digitalWrite(l, HIGH); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | La final, pentru a transforma rezultatul din curent in valoare numerica folosesc functia inversa celei de setare a valorii rezistentei: | ||
+ | |||
+ | <code> | ||
+ | int current_to_val(float y) { | ||
+ | return (int) ((y - 0.0002) * 99 / 0.0098 + 1); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Download ===== | ||
+ | {{:pm:prj2022:sgherman:proj_pm_bogdan_circeanu_336cc.zip}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||