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

Se Steg
Relaterade Ämnen

LCS - 1M - en fullfjädrad, billig Hobby oscilloskop

detta instructable kommer att visa dig hur jag utvecklat en enkel men fullt utrustad digital provtagning oscilloskop som jag hoppas ger dig möjlighet att få en lyckad start i den här domänen. De viktigaste målen i denna utveckling var:Skapa något som...

Billig variabel strömförsörjning

inledning.Enkel strömförsörjning från LM2596 ihop modul.Kan ge utdata till 35V.Rad 1.25V - 35VStrömmen upp till säkra 2.5AUtformad med1. 2 banan uttagen för utdata2. 1 amperemeter anslutning + sin produktion3. 1 extern Voltmeter anslutning (kan använ...

DIY Quadcopter från Scratch

Att flyga är något som har varit del av mannens önskan för evigt. Vi har velat ta till himlen ända sedan vi först såg en fågel flyga och med tillkomsten av teknik vi kan resa med flyg över hela världen. Men en personlig flygning erfarenhet är något u...

Kompatibla proteshand med sensomotoriska kontroll och sensoriska Feedback för nacke amputerade

Det huvudsakliga målet med detta projekt tillhandahåller en mycket funktionella och billiga proteshand till personer med nedanför armbågen amputationerÄven om massor av state-of-the-art protetiska enheter har utvecklats, fortfarande blir det trycket...

En 15-LED RGB klocka med Arduino kärna

RGB klockan använder RGB sammansättning-färgmodellen används i alla färgskärmar. Denna modell använder tre "grundläggande" färger, nämligen röda, gröna och blå, för att bygga någon annan "sammansatta" färg av spektrumet. Med RGB klocka...

Parallellporten baserade VU-Meter

volym enheter (VU)-mätare har alltid varit de mest roliga och enkla projekt för elektronisk älskare och hobbyister. VU-mätare är de lite prylar på din stereo eller annan elektronik som visar hur stark eller högt ljudsignalen är. Det finns bokstavlige...

Temperatur kontrollsystem med Labview (Atmega32)

ABSTRACTDetta arbete beskriver en ram av ON/OFF, proportionella och linjära temperatur styrsystem. Utformningen och genomförandet av denna process görs med LABVIEW, virtuella workbench programvara. Projektet omfattar datainsamling, databearbetning oc...

Med din Singstar mikrofoner på en PC (och post i Audacity)

Hej alla, och välkomna till detta Instructable!Med lanseringen av öppen källkod alternativ till Singstar Ultrastar, liksom tendensen hos vissa bibliotekarie (yours verkligen) för att komma med projekt för sin skola som kräver billig hårdvaru- och mju...

Omfattningen klocka: Analog klocka och temperaturgivare på oscilloskop

Scopeclock är en enkel att använda hårdvara till göra din X-Y kan analogt oscilloskop mer användbara. Med denna enkla för att använda maskinvara kan du konvertera dina analoga oscilloskop till en omfattning klocka. Detta projekt var jag och min vän M...

3D tryckt "Transformers" Robot - Spiderbot

Spiderbot är en imitation av de "Transformers". Det är en RC fyrfotadjur robot och har två driftslägen: spider och fordon, precis som robotarna i "Transformers". Det är Arduino-baserad och kontrollerad av Android-telefon med Bluetooth....

Scrappy vetenskap Caddy

Detta är en instructable för en data förvärv box använder en Raspberry Pi och beroende på MCP3008 8-kanal 10-bitars ADC med SPI gränssnitt (https://www.adafruit.com/product/856). Dess syfte är att hjälpa till med insamling av uppgifter och rita data...

Intel® Edison Hands-on dag 2: FlameFire larm

Installera ett brandlarm i köket kommer att vara till nytta för oss. En liten låga kan utlösa den och spänna av det kan nå 20CM. Denna mini brandlarm kan undvika vissa olyckor så varför inte?Komponenter som krävs1 × digital Summer modul1 × lågan sens...

Intel® Edison Hands-on dag 5: Röst aktiverat lampa

Röst aktiverat lampaHade du någonsin varit nyfiken på den röststyrda glödlampan i din barndom? Hade du någonsin stämplade och om igen och bara slå på ljuset? Så länge du klappa händerna, kommer ljuset att vända på. I detta avsnitt kommer vi göra såda...

Sticksåg spegel Surround

Detta är ett enkelt projekt särskilt användbart för att använda upp hörnen och Avklipp. Varje avsnitt kan göras individuellt sedan kombineras till en dekorativ surround för en spegel, klocka, runda foto eller etc.De dekorativa mönster är graverade då...

Motvikt dörren närmare

Hi, alla! Välkommen till min första instructable! Jag hoppas det kommer att vara till hjälp för alla som vill göra en automatisk dörr närmare med denna design, med hjälp av knippen och inre motvikt. Jag vill be om ursäkt för grammatik eller engelska...

Transparent TEN enhet

projektets mål var att producera en fullt kontrollerbar TENS enhet och en testplattform för nya begrepp och mönster. TENS står för transkutan elektrisk nervstimulering. TENS enheter som används för att lindra nerv med smärta frågor och slappna av mus...

Hur man programmerar ATtiny85 med Arduino uno styrelsen

I denna tutorial använder vi en Arduino ombord som en ATtiny programmerare.För att göra detta kommer att vi använda en Arduino UNO styrelse som en ISP (programmerare) och en ATtiny85 mikro-controller.Vi kommer att använda Codebender - online Arduino...

Simon Says med lysdioder och ljud

Hej och Välkommen tillbaka till Instructables!Många av oss har alla spelat Simon Says där oundvikligen befinner du dig hopping runt på ett ben medan du gör elefanten ljud och du undrar för sig själv varför det någonsin var en bra idé att säga "Ja, ja...

Robo-Mobile - en hemmagjord Bluetooth Robot

BakgrundDenna robot är en jag byggde för att lära. Före detta projekt jag fick mina fötter våt med några småskaliga Arduino projekt som en Ultraljuds robot, (det skulle flytta bakåt tills det var ett visst avstånd från väggen,) och jag fick spela med...