KKM: 12-BIT MCP4725 DAC BREAKOUT

Početnik si s Croduinom. 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 e-radionice 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 Croduinom 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 Croduino.
 

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.
 

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 Croduinom potrebno je spojiti ga na način prikazan slikom. Napajanje modula zbog jednostavnosti možemo ostvariti povezivanjem +5V pina na Croduinu i VCC pina na modulu. Gnd priključnica modula spaja se na jedan od dva gnd pina na Croduinu. 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 Croduina 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;
}
Leave a Reply