Analog Matrix Multiplier

Introducere

Proiectul are scopul de a construi un multiplicator analogic de vectori si matrici.

Implementarea curenta realizeaza inmultirea dintre un vector 1×2 cu o matrice 2×2 in mod analogic, insa el poate fi extins.

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.

Descriere generală

Pentru a realiza inmultirea analogica voi folosi urmatoarele componente:

  • 2 module DAC - care vor reprezenta valorile din vectorul 1×2
  • 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 1×2 rezultat

Hardware Design

Lista de piese:

  • Arduino
  • Rezistori
  • Potentiometre digitale
  • Perfboard
  • Module DAC

Schema Electrica

Software Design

  • Mediul de dezvoltare folosit a fost Arduino IDE.
  • Librarii 3rd-party folosite: DFRobot_MCP4725.h (pentru controlarea modulelor DAC).

Datele se introduc de la tastatura: valorile tensiunilor (elemente vector) si valorile pentru digipots (elemente matrice).

Pentru a transforma datele din numere din intervalul 1-100 in valori pentru digipots (0-255) folosesc urmatoarea functie:

int val_to_step_digipot(int x) {
  float y = 0.0002 + (float) (x - 1) * 0.0098 / 99;

  float R = 1 / y;

  int val = (int) (R - 100) * 51 / 950;
  
  return val;
}

Pentru a seta valorile in digipot folosesc functia care sa comunice prin I2C:

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);
}

La final, pentru a transforma rezultatul din curent in valoare numerica folosesc functia inversa celei de setare a valorii rezistentei:

int current_to_val(float y) {
  return (int) ((y - 0.0002) * 99 / 0.0098 + 1);
}

Download

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2022/sgherman/analogmatrixmultiplier.txt · Last modified: 2022/05/27 19:40 by bogdan.circeanu
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