OpenDAC Seekat: 8 canales, 16 bits de bajo costo laboratorio CAD (8 / 8 paso)

Paso 8: Software

Instalar el Arduino IDE en el equipo que se controla el DAC y subir el Seekat Firmware para el Arduino.

Seekat Firmware

 //Ardunio code for controlling Seekat DC voltage box from openDACS.com. Designed for Arduino UNO. #include “SPI.h” // necessary library int sync=10; // using digital pin 10 for SPI slave select int ldac=9; // Load dac (not implemented). You need to change some jumpers on the boards if you want to use synchronous updating and modify arduino code. int clr=8; // DAC Clear (not implemented). You need to change some jumpers on the AD58764 boards if you want to use this. void setup() { Serial.begin(9600); pinMode(7, OUTPUT); // we use this for SS pin pinMode(sync, OUTPUT); // we use this for SS pin pinMode(ldac, OUTPUT); // we use this for SS pin digitalWrite(7, HIGH); digitalWrite(sync, HIGH); SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); //correct order for AD5764. SPI.setClockDivider(SPI_CLOCK_DIV32); SPI.setDataMode(SPI_MODE1); //1 and 3 communicate with DAC. 1 is the only one that works with no clock divider. } void setValue(byte DB[10]) { if (DB[0] == 255&&DB[1]==254&&DB[2]==253) // These bytes serve as a control that communication is working, and are reserved for future functionality such as synchronous updating, clear, and native arduino autoramp. { digitalWrite(sync, LOW); //assert sync-bar int o1 = SPI.transfer(DB[3]); // send command byte to DAC2 in the daisy chain. Serial.flush(); int o2 = SPI.transfer(DB[4]); // MS data bits, DAC2 Serial.flush(); int o3 = SPI.transfer(DB[5]);//LS 8 data bits, DAC2 Serial.flush(); int o4 = SPI.transfer(DB[6]);// send command byte to DAC1 in the daisy chain. Serial.flush(); int o5 = SPI.transfer(DB[7]);// MS data bits, DAC1 Serial.flush(); int o6 = SPI.transfer(DB[8]);//LS 8 data bits, DAC1 Serial.flush(); digitalWrite(sync, HIGH);//raise sync-bar to change the dac voltage. Must have LDAC-bar tied low. Serial.println(o1); Serial.println(o2); Serial.println(o3); Serial.println(o4); Serial.println(o5); Serial.println(o6); } else //This allows you to check on the scope what has been received by the Arduino for trouble shooting. Use pin 7 to trigger, then look at output of pins 13 (sclk) and 11 on the arduino to readout the bytes the arduino is getting. { digitalWrite(7, LOW); 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, HIGH); } } void loop() { if ( Serial.available()) // wait until all data bytes are avaialable { byte bytes[9]; for (int i=0; i<9; i++) { bytes[i] = Serial.read(); delay(2); //2mS pause to make sure bytes don’t run into each other. } setValue(bytes); } } 

Comunicación con el Seekat se puede hacer con cualquier programa capaz de comunicación serial. Proporcionar a los conductores de Matlab a voltajes de leer y escribir y también para calibrar el offset y ganancia de cada canal con un DMM.

Estas funciones también se incluyen a continuación:

Escribir voltaje

 %Find out which port the Arduino is using. One way is to use the Arduino IDE. % These are the commands you must execute in matlab to initialize for a virtual serial port COM5 on a PC. % global a; a = serial(‘COM5′,’baudrate’,115200);fopen(a) %Mac, for example: global a; a = serial(‘/dev/tty.usbmodem1431′,’BaudRate’,115200); fopen(a) function[] = setvoltageDC(channel,voltage) global a if voltage > 10 voltage = 10.0; elseif voltage < -10 voltage = -10.0; end switch channel case 1 n1 = 19; n2=0; m1=1; m2=0; case 2 n1 = 18; n2=0; m1=1; m2=0; case 3 n1 = 17; n2=0; m1=1; m2=0; case 4 n1 = 16; n2=0; m1=1; m2=0; case 5 n1 = 0; n2=19; m1=0; m2=1; case 6 n1 = 0; n2=18; m1=0; m2=1; case 7 n1 = 0; n2=17; m1=0; m2=1; case 8 n1 = 0; n2=16; m1=0; m2=1; otherwise disp(‘INVALID CHANNEL’) end if voltage >= 0 dec16 = round((2^15-1)*voltage/10); %Decimal equivalent of 16 bit data else dec16 = round(2^16 – abs(voltage)/10 * 2^15); %Decimal equivalent of 16 bit data end bin16 = de2bi(dec16,16,2,‘left-msb’); %16 bit binary d1=bi2de(fliplr(bin16(1:8))); %first 8 bits d2=bi2de(fliplr(bin16(9:16))); %second 8 bits %disp([255,254,253,n1,d1*m1,d2*m1,n2,d1*m2,d2*m2]); %uncomment to check what’s being sent to the Arduino pause(.005); fwrite(a,[255,254,253,n1,d1*m1,d2*m1,n2,d1*m2,d2*m2]); while a.BytesAvailable fscanf(a,‘%e’); end end 

Leer voltaje

 %Find out which port the Arduino is using. One way is to use the Arduino IDE. % These are the commands you must execute in matlab to initialize for a virtual serial port COM5 on a PC. % global a; a = serial(‘COM5′,’baudrate’,115200);fopen(a) %Mac, for example: global a; a = serial(‘/dev/tty.usbmodem1431′,’BaudRate’,115200); fopen(a) function v = getvoltageDC(channel) global a switch channel case 1 n1 = 19+128; n2=0; m1=1; m2=0; case 2 n1 = 18+128; n2=0; m1=1; m2=0; case 3 n1 = 17+128; n2=0; m1=1; m2=0; case 4 n1 = 16+128; n2=0; m1=1; m2=0; case 5 n1 = 0; n2=19+128; m1=0; m2=1; case 6 n1 = 0; n2=18+128; m1=0; m2=1; case 7 n1 = 0; n2=17+128; m1=0; m2=1; case 8 n1 = 0; n2=16+128; m1=0; m2=1; otherwise disp(‘INVALID CHANNEL’) end 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); while a.BytesAvailable fscanf(a,‘%e’); % clear the buffer end fwrite(a,[255,254,253,0,0,0,0,0,0]); pause(.01); bdata=zeros([1,6]); for i=0:5; i=i+1; r=fscanf(a,‘%e’); bdata(i)=r; end bdata2=max(bdata(2)*2^8+bdata(3),bdata(5)*2^8+bdata(6)); if 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); else %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) end v = bdata3; end 

Calibrar la ganancia y offset

 %plug the channel to be calibrated into a DMM. You will need to have some function of your own to read the DMM voltage. function[] = calibrateSeekat(channel) global a switch channel case 1 n1 = 19; n2=0; m1=1; m2=0; case 2 n1 = 18; n2=0; m1=1; m2=0; case 3 n1 = 17; n2=0; m1=1; m2=0; case 4 n1 = 16; n2=0; m1=1; m2=0; case 5 n1 = 0; n2=19; m1=0; m2=1; case 6 n1 = 0; n2=18; m1=0; m2=1; case 7 n1 = 0; n2=17; m1=0; m2=1; case 8 n1 = 0; n2=16; m1=0; m2=1; otherwise disp(‘INVALID CHANNEL’) end fwrite(a,[255,254,253,n1+24,0,0,n2+24,0,0]); %zero the offset register fwrite(a,[255,254,253,n1+16,0,0,n2+16,0,0]); %zero the gain register measuredValues = zeros(2,1); voltage = 0; if voltage >= 0 dec16 = round((2^15-1)*voltage/10); %Decimal equivalent of 16 bit data else dec16 = round(2^16 – abs(voltage)/10 * 2^15); %Decimal equivalent of 16 bit data end bin16 = de2bi(dec16,16,2,‘left-msb’); %16 bit binary d1=bi2de(fliplr(bin16(1:8))); %first 8 bits d2=bi2de(fliplr(bin16(9:16))); %second 8 bits %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]); while a.BytesAvailable fscanf(a,‘%e’); end pause(2) blah = smget(‘V’); %your code here to read voltage offset = -blah{1}; offsetsteps = round(offset/(38.14e-6)); offset8 = de2bi(mod((offsetsteps),2^8),8,‘left-msb’); d1=0;%bi2de(fliplr(bin16(1:8))); %first 8 bits d2=bi2de(fliplr(offset8));%bi2de(fliplr(bin16(9:16))); %second 8 bits %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 to access offset register while a.BytesAvailable fscanf(a,‘%e’); end pause(1) voltage = -10; if voltage >= 0 dec16 = round((2^15-1)*voltage/10); %Decimal equivalent of 16 bit data else dec16 = round(2^16 – abs(voltage)/10 * 2^15); %Decimal equivalent of 16 bit data end bin16 = de2bi(dec16,16,2,‘left-msb’); %16 bit binary d1=bi2de(fliplr(bin16(1:8))); %first 8 bits d2=bi2de(fliplr(bin16(9:16))); %second 8 bits %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]); while a.BytesAvailable fscanf(a,‘%e’); end pause(2) blah = smget(‘V’); %your code here to read voltage gainerror = blah{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 bit binary d1=0;%bi2de(fliplr(gain16(1:8))) %first 8 bits d2=bi2de(fliplr(gain8));%bi2de(fliplr(gain8(1:8))) %second 8 bits pause(.005); fwrite(a,[255,254,253,n1+16,d1*m1,d2*m1,n2+16,d1*m2,d2*m2]); % +16 to access gain register instead of data register while a.BytesAvailable fscanf(a,‘%e’); end pause(1) voltage = 0; if voltage >= 0 dec16 = round((2^15-1)*voltage/10); %Decimal equivalent of 16 bit data else dec16 = round(2^16 – abs(voltage)/10 * 2^15); %Decimal equivalent of 16 bit data end bin16 = de2bi(dec16,16,2,‘left-msb’); %16 bit binary d1=bi2de(fliplr(bin16(1:8))); %first 8 bits d2=bi2de(fliplr(bin16(9:16))); %second 8 bits %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]); while a.BytesAvailable fscanf(a,‘%e’); end end 

Artículos Relacionados

LCS - 1M - completo, de bajo costo Hobby osciloscopio

LCS - 1M - completo, de bajo costo Hobby osciloscopio

este instructable le mostrará cómo desarrollé una sencilla pero osciloscopio de muestreo digital completa que espero le permitirá obtener un comienzo exitoso en este campo. Los objetivos principales en este desarrollo fueron:Crear algo que es realmen
Construir y volar un Paramotor - segura y a bajo costo

Construir y volar un Paramotor - segura y a bajo costo

vivir el sueño:Desde que era un niño pequeño, yo soñaba con volar. Mi primer intento en la edad 8, se asemejó a una cometa de gran tamaño hecha de ramas de los árboles y plástico negro. Ni que decir era una tentativa fracasada en vuelo, y afortunadam
Bicicletas luces direccionales - Simple, bajo costo, como el Solar

Bicicletas luces direccionales - Simple, bajo costo, como el Solar

Yo uso mi bicicleta para conmutar para trabajar, y conforme avanza la temporada de otoño me encuentro casa de montar a caballo en la oscuridad. Mientras que mi moto está equipada con luces (y yo con un chaleco reflectante) no estoy particularmente pr
Manejable Segway clon - bajo costo y fácil construcción

Manejable Segway clon - bajo costo y fácil construcción

Este Instructable le mostrará cómo construir un clon de Segway capaz de paseo. Aquí están sus características:Fácil montaje sin soldaduras, no complicada dirección acoplamiento y soldadura mínima.Utiliza un fácilmente disponible $3 digital Junta IMU
Bajo costo Neuroprosthetic Modular

Bajo costo Neuroprosthetic Modular

Mi nombre es JD y soy estudiante de segundo año en la escuela secundaria. Han estado trabajando en este proyecto desde hace algún tiempo y todavía activamente estoy mejorando, pero quería empezar a documentar mi trabajo en línea para que otros pueden
Cómo construir un Reactor Arc de Iron-Man de Industrias Stark... Muy muy bajo costo...

Cómo construir un Reactor Arc de Iron-Man de Industrias Stark... Muy muy bajo costo...

Cómo construir un Reactor Arc de Iron-Man de Industrias Stark... Reactor de arco muy muy bajo costo quela mayoría puede hacer muy fácil.Ahora tengo un cortador del vinilo y tengo el uso de un router cnc de compañeros pero esto es todo sobre una estru
Egor V.1 Animatronic: básico, autónomo, bajo costo carácter artificial.

Egor V.1 Animatronic: básico, autónomo, bajo costo carácter artificial.

Poco acerca de míHola! soy Carl un animatronic profesional e investigación académica, que actualmente estoy terminando una beca de maestría en desarrollo de sistemas de animatronic en UoH. Esta es una altamente especializada y nicho campo de la anima
Libretita: una bajo costo, modular, compatible con Arduino plataforma educativa

Libretita: una bajo costo, modular, compatible con Arduino plataforma educativa

Para mis clases de soft-circuito, hemos estado utilizando un circuito de Attiny85 preprogramado (), o el más caro de compatible con Arduino Lilypad USB. Quería algo entre esos dos extremos que serían:Fácil de construir por los principiantesDe bajo co
Espirómetro de bajo costo

Espirómetro de bajo costo

Este es un proyecto que realicé para una clase de instrumentación biomédica en la Universidad de Vanderbilt. Este espirómetro utiliza un transductor de presión y un Arduino Uno para calcular el volumen de aire soplado por el tubo de plástico. El circ
Una impresora 3D de bajo costo con herramientas básicas

Una impresora 3D de bajo costo con herramientas básicas

Introducir el 'apto de Ad (str)'Bienvenidos a nuestro 1er intento hacer un instructable. Esto es barato, rápido y muy 'hackeable' impresora bootstrap basada libremente en la reprap 'Adapto' (http://reprap.org/wiki/Adapto) el volumen de impresión de e
Alameda... simple, bajo costo!

Alameda... simple, bajo costo!

Este fue mi primer intento de hacer una alameda. Estaba viendo videos al azar en youtube cuando me topé con una construcción de la Alameda. Después de investigar más, entendí que es una gran manera de cultivar plantas - más rápidas, eficiente y de me
Bajo costo IR decodificador

Bajo costo IR decodificador

Sólo un decodificador IR que puede decodificar el HEXADECIMAL IR señales de la TV remota para su uso posterior. como programación de cualquier control remoto de TV, etc..Su hizo con Freeduino (no Arduino). Freeduino es un regulador micro bajo costo c
Incubadora de bajo costo y precisa para la biología de DIY

Incubadora de bajo costo y precisa para la biología de DIY

DIYbio, Biología (Do It Yourself) es un movimiento creciente que pretende acercar la biología fuera de contextos profesionales. En los últimos años, plataformas como transiluminador OpenPCR y Perla Biotech han sido diseñadas para apoyar el trabajo de
Aislamiento de ventana cubierta (bajo costo)

Aislamiento de ventana cubierta (bajo costo)

En este Instructable mostrará cómo hice una cobertura para ventana muy bajo costo.Si usted ha leído mis otros Instructables la historia es una habitación fría y tratando de conseguir caliente en un presupuesto, por lo que wont aburrir con los detalle