OpenDAC Seekat: 8-kanal, 16-bitars, billiga laboratorium DAC (8 / 8 steg)
Steg 8: programvara
Installera Arduino IDE på den dator som kommer att styra DAC och ladda upp Seekat Firmware till Arduino.
Seekat Firmware
Ardunio kod för kontrollerande Seekat DC spänning låda från openDACS.com. Utformad för Arduino UNO.
#include "SPI.h" / / nödvändiga bibliotek
int sync = 10; med digital stift 10 för SPI slave select
int ldac = 9; Ladda dac (inte genomfört). Du behöver ändra några tröjor på styrelser om du vill använda synkront uppdatera och ändra arduino koden.
int clr = 8. DAC tydliga (inte genomfört). Du behöver ändra några tröjor på AD58764 styrelser om du vill använda detta.
void setup()
{
Serial.BEGIN(9600);
pinMode (7, OUTPUT); Vi använder detta för SS pin
pinMode (synkronisera, OUTPUT); Vi använder detta för SS pin
pinMode (ldac, produktionen); Vi använder detta för SS pin
digitalWrite (7, hög).
digitalWrite (sync, hög);
SPI.begin(); vakna upp SPI bussen.
SPI.setBitOrder(MSBFIRST); rätt ordning för AD5764.
SPI.setClockDivider(SPI_CLOCK_DIV32);
SPI.setDataMode(SPI_MODE1); 1 och 3 kommunicera med DAC. 1 är den enda som fungerar med ingen klocka avdelare.
}
void setValue(byte DB[10])
{
om (DB [0] == 255 & & DB [1] == 254 & & DB[2]==253) / / dessa byte tjäna som en kontroll att kommunikationen fungerar och är reserverat för framtida funktioner som synkron uppdatering, klara, och infödda arduino autoramp.
{
digitalWrite (sync, låg); hävda sync-bar
int o1 = SPI.transfer(DB[3]); Skicka kommandobyte till DAC2 i daisy chain.
Serial.flush();
int o2 = SPI.transfer(DB[4]); MS databitar, DAC2
Serial.flush();
int o3 = SPI.transfer (DB [5]), //LS 8 databitar, DAC2
Serial.flush();
int o4 = SPI.transfer(DB[6]); / / skicka kommandobyte till DAC1 i daisy chain.
Serial.flush();
int o5 = SPI.transfer(DB[7]); / / MS databitar, DAC1
Serial.flush();
int o6 = SPI.transfer (DB [8]), //LS 8 databitar, DAC1
Serial.flush();
digitalWrite (sync, hög); //raise sync-bar att ändra dac spänningen. Ha måste LDAC-bar kopplad låg.
Serial.println(O1);
Serial.println(O2);
Serial.println(O3);
Serial.println(O4);
Serial.println(o5);
Serial.println(O6);
}
annan //This kan du kontrollera om omfattningen vad har mottagits av Arduino för felsökning. Använda pin 7 att utlösa, sedan titta på produktionen av stift 13 (sclk) och 11 på arduino att avläsning byte arduino är få.
{
digitalWrite (7, låg).
SPI.transfer(DB[0]); Serial.flush();
SPI.transfer(DB[1]); Serial.flush();
SPI.transfer(DB[2]); Serial.flush();
SPI.transfer(DB[3]); Serial.flush();
SPI.transfer(DB[4]); Serial.flush();
SPI.transfer(DB[5]); Serial.flush();
SPI.transfer(DB[6]); Serial.flush();
SPI.transfer(DB[7]); Serial.flush();
SPI.transfer(DB[8]); Serial.flush();
digitalWrite (7, hög).
}
}
void loop()
{
om (Serial.available()) / / vänta tills alla data-byte är avaialable
{
byte byte [9].
för (int jag = 0; jag < 9; i ++) {
byte [i] = Serial.read();
Delay(2); 2mS paus för att se till att byte inte köra in i varandra.
}
setValue(bytes);
}
}
Kommunikation med Seekat kan göras med något program som klarar av seriell kommunikation. Vi tillhandahåller Matlab drivrutiner att skriva och läsa spänningar, och även att kalibrera offset och vinst på varje kanal med hjälp av en DMM.
Dessa funktioner ingår även nedan:
Skriv spänning
% Ta reda på vilken port använder Arduino. Ett sätt är att använda Arduino IDE.
% Detta är kommandona du måste utföra i matlab att initiera för en virtuell serieport COM5 på en PC.
% global a; en = serial('COM5′,'baudrate',115200);fopen(a)
% Mac, till exempel: global a; en = serial('/dev/tty.usbmodem1431′,'BaudRate',115200); fopen(a)
fungerar [] = setvoltageDC(channel,voltage)
Global en
om spänning > 10
spänning = 10,0;
ElseIf spänning < -10
spänning =-10.0;
slutet
byta kanal
fall 1
N1 = 19.
N2 = 0;
M1 = 1;
m2 = 0;
fall 2
N1 = 18;
N2 = 0;
M1 = 1;
m2 = 0;
fall 3
N1 = 17;
N2 = 0;
M1 = 1;
m2 = 0;
fall 4
N1 = 16.
N2 = 0;
M1 = 1;
m2 = 0;
fall 5
N1 = 0;
N2 = 19.
M1 = 0;
m2 = 1;
fall 6
N1 = 0;
N2 = 18;
M1 = 0;
m2 = 1;
Ärende 7
N1 = 0;
N2 = 17;
M1 = 0;
m2 = 1;
ärende 8
N1 = 0;
N2 = 16.
M1 = 0;
m2 = 1;
annars
Disp ('Ogiltig kanal")
slutet
om spänning > = 0
dec16 = round((2^15-1)*voltage/10); % Decimal motsvarar 16-bitars data
annat
dec16 = round (2 ^ 16 – abs (spänning) / 10 * 2 ^ 15); % Decimal motsvarar 16-bitars data
slutet
bin16 = de2bi(dec16,16,2,'left-msb'); % 16-bitars binär
D1=bi2de(fliplr(bin16(1:8))); % första 8 bitarna
D2=bi2de(fliplr(bin16(9:16))); % andra 8 bitar
% disp([255,254,253,n1,d1*m1,d2*m1,n2,d1*m2,d2*m2]); % avkommentera för att kontrollera vad skickas till Arduino
PAUSE(.005);
fwrite(a,[255,254,253,N1,D1*M1,D2*M1,N2,D1*m2,D2*m2]);
medan a.BytesAvailable
fscanf(a,'%e');
slutet
slutet
Läs spänning
% Ta reda på vilken port använder Arduino. Ett sätt är att använda Arduino IDE.
% Detta är kommandona du måste utföra i matlab att initiera för en virtuell serieport COM5 på en PC.
% global a; en = serial('COM5′,'baudrate',115200);fopen(a)
% Mac, till exempel: global a; en = serial('/dev/tty.usbmodem1431′,'BaudRate',115200); fopen(a)
funktionen v = getvoltageDC(channel)
Global en
byta kanal
fall 1
N1 = 19 + 128;
N2 = 0;
M1 = 1;
m2 = 0;
fall 2
N1 = 18 + 128;
N2 = 0;
M1 = 1;
m2 = 0;
fall 3
N1 = 17 + 128;
N2 = 0;
M1 = 1;
m2 = 0;
fall 4
N1 = 16 + 128;
N2 = 0;
M1 = 1;
m2 = 0;
fall 5
N1 = 0;
N2 = 19 + 128;
M1 = 0;
m2 = 1;
fall 6
N1 = 0;
N2 = 18 + 128;
M1 = 0;
m2 = 1;
Ärende 7
N1 = 0;
N2 = 17 + 128;
M1 = 0;
m2 = 1;
ärende 8
N1 = 0;
N2 = 16 + 128;
M1 = 0;
m2 = 1;
annars
Disp ('Ogiltig kanal")
slutet
PAUSE(.02);
fwrite(a,[255,254,253,N1,0,0,N2,0,0]);
PAUSE(.02);
fwrite(a,[255,254,253,N1,0,0,N2,0,0]);
PAUSE(.02);
medan a.BytesAvailable
fscanf(a,'%e'); % rensa bufferten
slutet
fwrite(a,[255,254,253,0,0,0,0,0,0]);
PAUSE(.01);
bdata=Zeros([1,6]);
för i = 0:5.
jag = i + 1.
r=fscanf(a,'%e');
bdata (i) = r;
slutet
bdata2=Max(bdata(2)*2^8+bdata(3),bdata(5)*2^8+bdata(6));
om bdata2 < 2 ^ 15
%Disp(10*bdata2/(2^15-1))
% bdata3=sprintf('%20f',10.0*bdata2/(2^15-1));
bdata3=10.0*bdata2/(2^15-1);
annat
% bdata3=sprintf('%20f',-10.0*(2^16-bdata2)/2^15);
bdata3 =-10.0*(2^16-bdata2)/2 ^ 15;
%Disp(-10*(2^16-bdata2)/2^15)
slutet
v = bdata3;
slutet
Kalibrera förstärkning och offset
% Anslut kanal kalibreras i en DMM. Du kommer att behöva ha någon funktion på egen hand läsa DMM spänningen.
fungerar [] = calibrateSeekat(channel)
Global en
byta kanal
fall 1
N1 = 19.
N2 = 0;
M1 = 1;
m2 = 0;
fall 2
N1 = 18;
N2 = 0;
M1 = 1;
m2 = 0;
fall 3
N1 = 17;
N2 = 0;
M1 = 1;
m2 = 0;
fall 4
N1 = 16.
N2 = 0;
M1 = 1;
m2 = 0;
fall 5
N1 = 0;
N2 = 19.
M1 = 0;
m2 = 1;
fall 6
N1 = 0;
N2 = 18;
M1 = 0;
m2 = 1;
Ärende 7
N1 = 0;
N2 = 17;
M1 = 0;
m2 = 1;
ärende 8
N1 = 0;
N2 = 16.
M1 = 0;
m2 = 1;
annars
Disp ('Ogiltig kanal")
slutet
fwrite(a,[255,254,253,N1+24,0,0,N2+24,0,0]); % noll offset registret
fwrite(a,[255,254,253,N1+16,0,0,N2+16,0,0]); % noll vinst registret
measuredValues = zeros(2,1);
spänning = 0;
om spänning > = 0
dec16 = round((2^15-1)*voltage/10); % Decimal motsvarar 16-bitars data
annat
dec16 = round (2 ^ 16 – abs (spänning) / 10 * 2 ^ 15); % Decimal motsvarar 16-bitars data
slutet
bin16 = de2bi(dec16,16,2,'left-msb'); % 16-bitars binär
D1=bi2de(fliplr(bin16(1:8))); % första 8 bitarna
D2=bi2de(fliplr(bin16(9:16))); % andra 8 bitar
% disp([255,254,253,n1,d1*m1,d2*m1,n2,d1*m2,d2*m2]);
PAUSE(.005);
fwrite(a,[255,254,253,N1,D1*M1,D2*M1,N2,D1*m2,D2*m2]);
medan a.BytesAvailable
fscanf(a,'%e');
slutet
PAUSE(2)
bla = smget('V'); % din kod här att läsa spänning
offset = - bla {1}.
offsetsteps = round(offset/(38.14e-6));
offset8 = de2bi(mod((offsetsteps),2^8),8,'left-msb');
D1=0;%bi2de(fliplr(bin16(1:8))); % första 8 bitarna
D2=bi2de(fliplr(offset8));%bi2de(fliplr(bin16(9:16))); % andra 8 bitar
%Disp([255,254,253,N1,D1*M1,D2*M1,N2,D1*m2,D2*m2])
PAUSE(.005);
fwrite(a,[255,254,253,N1+24,D1*M1,D2*M1,N2+24,D1*m2,D2*m2]); % + 24 tillgång offset registrera
medan a.BytesAvailable
fscanf(a,'%e');
slutet
PAUSE(1)
spänning = -10;
om spänning > = 0
dec16 = round((2^15-1)*voltage/10); % Decimal motsvarar 16-bitars data
annat
dec16 = round (2 ^ 16 – abs (spänning) / 10 * 2 ^ 15); % Decimal motsvarar 16-bitars data
slutet
bin16 = de2bi(dec16,16,2,'left-msb'); % 16-bitars binär
D1=bi2de(fliplr(bin16(1:8))); % första 8 bitarna
D2=bi2de(fliplr(bin16(9:16))); % andra 8 bitar
% disp([255,254,253,n1,d1*m1,d2*m1,n2,d1*m2,d2*m2]);
PAUSE(.005);
fwrite(a,[255,254,253,N1,D1*M1,D2*M1,N2,D1*m2,D2*m2]);
medan a.BytesAvailable
fscanf(a,'%e');
slutet
PAUSE(2)
bla = smget('V'); % din kod här att läsa spänning
gainerror = bla {1} + 10.
gainsteps = round(gainerror/(152.59e-6));
gain8 = de2bi(mod((gainsteps),2^8),8,'left-msb');
% bin16 = de2bi(gain16,16,2,'left-msb'); % 16-bitars binär
D1 = 0; %bi2de(fliplr(gain16(1:8))) % första 8 bitarna
D2=bi2de(fliplr(gain8)), %bi2de(fliplr(gain8(1:8))) % andra 8 bitar
PAUSE(.005);
fwrite(a,[255,254,253,N1+16,D1*M1,D2*M1,N2+16,D1*m2,D2*m2]); + 16% tillgång vinst registret i stället för dataregister
medan a.BytesAvailable
fscanf(a,'%e');
slutet
PAUSE(1)
spänning = 0;
om spänning > = 0
dec16 = round((2^15-1)*voltage/10); % Decimal motsvarar 16-bitars data
annat
dec16 = round (2 ^ 16 – abs (spänning) / 10 * 2 ^ 15); % Decimal motsvarar 16-bitars data
slutet
bin16 = de2bi(dec16,16,2,'left-msb'); % 16-bitars binär
D1=bi2de(fliplr(bin16(1:8))); % första 8 bitarna
D2=bi2de(fliplr(bin16(9:16))); % andra 8 bitar
% disp([255,254,253,n1,d1*m1,d2*m1,n2,d1*m2,d2*m2]);
PAUSE(.005);
fwrite(a,[255,254,253,N1,D1*M1,D2*M1,N2,D1*m2,D2*m2]);
medan a.BytesAvailable
fscanf(a,'%e');
slutet
slutet