KKM: 12-BIT MCP4725 DAC BREAKOUT

DAC (Digitalno Analogni Konverter) MCP4725-Actuators

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

Mikrokontroleri kao i ostala računala rade sa digitalnim signalima zbog jednostavnog računanja i spremanja podataka, a kako je većina signala zapravo analognog oblika, potreban nam je sklop koji će digitalni signal pretvoriti u analogni. Željeni efekt dobit ćemo korištenjem ovog modula koji sadrži 12-bitni MCP4725 digitalno-analogni pretvornik (eng. DAC, digital-analog converter). Za početak ćemo navesti neke karakteristike ovog modula, a zatim ćemo objasniti na koji način radi te kako ga spojiti i koristiti uz Dasduino.

Karakteristike:
Napon: 2.7V – 5.5V
Rezolucija: 12 bita
Komunikacijsko sučelje: I2C
Dimenzije: 15 mm x 12 mm

KAKO RADI?

Modul je projektiran na način koji osigurava jednostavno korištenje i kompatibilnost sa eksperimentalnim pločicama te drugim modulima i kontrolerima u našoj ponudi. Na ovaj pretvornik šaljemo broj iz intervala od 0 – 4095, a na izlazu iz pretvornika dobivamo napon između 0V i VCC (napon napajanja). Zbog visoke rezolucije pretvornika, na izlazu možemo dobiti vrlo lijepe signale jer je razlika između dvije susjedne vrijednosti svega 1.22mV. Svi digitalno-analogni pretvarači rade na sljedećem principu. DAC-u šaljemo skup podataka koje on postupno pretvara u naponski signal na taj način da jedan podatak pretvori u ekivalentni napon na svome izlazu kojega drži konstantnim dok ne naiđe drugi podatak.
Primjerice, ako bismo na DAC slali podatke 0->2048->0->2048->… , na izlazu bismo dobili pravokutni signal između nula volti i VCC/2. Ako želimo ostvariti složeniji analogni signal, poput sinusnog, na DAC moramo slati mnoštvo podataka (brojeva iz intervala 0-4095) koji se mijenjaju po sinusnoj funkciji. Na slici ispod vidimo vidimo sinusni valni oblik dobiven pomoću ovog modula. Ako smanjimo vremensku skalu tj. zumiramo signal, vidjet ćemo kako je on sačinjen od niza različitih vrijednosti.

Screen Capture

KAKO POVEZATI?

Priključnice:
gnd: ground
VCC: napajanje 2.7V – 5.5V
SDA: serial data I2C
SCL: serial clock
Vout: izlazni napon

Kako bismo modul mogli koristiti s Dasduinom potrebno je spojiti ga na način prikazan slikom. Napajanje modula zbog jednostavnosti možemo ostvariti povezivanjem +5V pina na Dasduinu i VCC pina na modulu. Gnd priključnica modula spaja se na jedan od dva gnd pina na Dasduinu. Komunikacija se ostvaruje povezivanjem SDA pina na modulu sa A4 pinom na kontroleru, a SCL sa A5. Izlazne priključnice modula spojili smo na sondu osciloskopa kako bismo vam prikazali valni oblik napona.

ARDUINO KOD

Kako bismo si olakšali korištenje modula koristit ćemo adafruit mcp4725 biblioteku koju možete pronaći na linku. Upute za instalaciju arduino biblioteka možete pronaći u ovome tutorijalu. Programski kod prikazuje kako pomoću Dasduina i ovog DAC-a možemo ostvariti analogni sinusni signal kojemu možemo mijenjati frekvenciju i amplitudu.

#include "Adafruit_MCP4725.h"                      //Library za I2C komunikaciju
#include "Wire.h"       
 
Adafruit_MCP4725 dac;
 
 
#define DAC_RESOLUTION    (12)        //Odabir rezolucije pretvornika
 
 
void setup(void) {
  Serial.begin(9600);
  Serial.println("Hello!");
 
  dac.begin(0x60);             //adresu treba podesiti na 0x64 jer je tako sklopovski podešena
 
  Serial.println("Generating a sine wave");
}
 
void loop(void) {
  float t = 0.0f;
  float f = 240;    //odaberi frekvenciju
  float A = 1;    //odaberi amplitudu u voltima ( od nula do VCC/2 ), za napajanje od 5V biramo A između 0 i 2.5 V
  int wait;
  int out = 0;
  t = micros()/1000000.0;
  out = 2048 + 2048*A/2.5*sin(2*PI*f*t);
  if(out > 4095){
    out = 4095;   
  }
 
  dac.setVoltage(out, false);
  wait = racunajdelay(f);
  delayMicroseconds(wait);
}
 
int racunajdelay (int frekvencija){
  float T;
  T = 1000000/(frekvencija*4096);
  return T;
  }