Está en la página 1de 15

Caracterizacion de circuitos integrados

utilizando MATLAB y Arduino


26 de enero de 2015

1.

Introducci
on

La medicion de circuitos digitales es una tarea tediosa debido a la gran


cantidad de datos que deben ser tomados para caracterizar un chip. En este
trabajo, se describe el funcionamiento de un sistema de adquisicion e inter
pretacion de datos. Este
opera de forma automatica utilizando una interfaz
entre MATLAB y Arduino para caracterizar circuitos integrados digitales.
Ademas, almacena los datos en diferentes formatos para su posterior visualizacion y procesamiento. El documento esta dividido de la siguiente manera:
en la seccion 2 se presentan las caractersticas principales de la tarjeta de
pruebas (Arduino) y Script de MATLAB. En la seccion 3 se describe brevemente el la configuracion y el funcionamiento general del sistema. En la
seccion 4 se muestran algunos resultados del sitema en operacion. Finalmente, en la seccion 5 se presentan las conclusiones.

2.

Caracteristicas princiapales de tarjeta Arduino y Scrip de MATLAB

La velocidad y resolucion de las mediciones son limitadas por las caractersticas del ADC embebido en la tarjeta de adquisicion de datos, en este
caso la tarjeta Arduino UNO. Las principales caractersticas del convertidor
analogico-digital se muestran en la Tabla 1.
1

Caractersticas de operacion de ADC Arduino


6 Canales de lectura (input analog pins between 0-5).
10-bits de resolucion (integer values between 0 and 1023).
Resolucion maxima 4.9 mV por unidad.
Permite un maximo de 10,000 lecturas por segundo.

Tabla 1: Caractersticas principales de convertidor analogico-digital embebido


en tarjeta Arduino UNO.
Ademas de las caractersticas presentadas en la Tabla 1 la tarjeta Arduino
cuenta con 14 terminales digitales configurables I/O que permiten la implementacion de m
ultiples sistemas digitales. La distribucion de terminales en
la tarjeta Arduino se muestran en la Figura 1

Figura 1: Distribucion de pines en tarjeta Arduino UNO.

El Arduino UNO cuenta ademas con un emulador USB de puerto serial


(protocolo RS232) que permite una sencilla comunicacion con PCs.

3.

Configuraci
on del sistema

En este trabajo se presenta una configuracion muy sencilla y general


del sistema. La tarjeta arduino tiene la tarea principal de adquirir se
nales
analogicas del chip de prueba. Estas se
nales son digitalizadas gracias a un
ADC embebido en la tarjeta y posteriormente son enviados al PC para su
visualizacion y procesamiento en MatLab. El PC y la tarjeta Arduino son
comunicados mediante el protocolo RS232 que permite envo y recepcion de
datos entre ambos dispositivos. En la Figura 2 se muestra la configuracion
general del sistema implementado.

Figura 2: Configuracion del sistema utilizado para caracterizar circuitos de


prueba.

Los voltajes de operacion entre dispositivo no son compatibles, por lo


tanto, es necesario un circuito de acondicionamiento de se
nales entre la tarjeta

Arduino y el circuito de prueba. Este


acondicionamiento de se
nales se realiza
utilizando buffers que garantizan 1.8 V en las se
nales digitales de entrada del
circuito de prueba, as como, se
nales TTL hacia la tarjeta arduino. En este
trabajo se miden algunas de las caracteristicas de operacion del circuito de
calibracion de offset tomado de [1].
La comunicacion serial entre la tarjeta Arduino y el PC con MATLAB
opera con una tasa de 9600 bits/sec. Debido a la pobre velocidad de trasferencia de datos no es posible visualizar en tiempo real el comportamiento de
3

dispositivos a muy alta frecuencia (cientos de kHz). En la Tabla 2 se el funcionamiento general del Script de MATLAB. De manera similar en la Tabla
3 se presenta la descripcion del algoritmo implementado en el Arduino.

Script implementado en MATLAB


*Inicializa vectores de datos y comunicaci
on serial.
*Enva se
nal para comenzar comunicaci
on.
*Selecciona el n
umero de datos y se
nales por recibir.
*Espera por un dato.
*Mapea en el grafico el dato recibido y se guarda en vector.
*Detiene comunicaci
on una vez que el n
umero de datos de interes es alcanzado..
*Cierra el puerto serial.
*Escribe archivo de texto en el cual almacena mediciones.

Tabla 2: Descripcion del Script implementado en MATLAB.


4

Algoritmo de control implementado tarjeta Arduino


Inicializaci
on de variables y puerto serial
if(comunicaci
on establecida)
{
if(se
nal de inicio recibida)
{
contador=000 signo=se
nal de signo;
while(signo==signo and contador<=111)
{
leer se
nales anal
ogicas;
enviar se
nales anal
ogicas;
leer se
nal de signo;
contador+1;
}
contador=contador;
}
}
Tabla 3: Descripcion del algoritmo implementado en tarjeta Arduino UNO.
Como se observa en la Tabla 2 el Script de MATLAB solo se encarga
de colectar los datos adquiridos por la tarjeta Arduino y desplegarlos en un
grafico. Ademas este se encarga de almacenar los datos en un vector, para
ser analizados con MATLAB, as como de escribirlos en un archivo de texto
para su analisis visual en caso de requerirse. La Tabla 3 nos muestra como la
tarjeta Arduino es utilizada para controlar el circuito de prueba. Este circuito
requiere de monitoreo constante del bit de signo de la ganancia y un contador
binario en sus entradas digitales para el incremento de ganancia [1].

4.

Resultados de sistema en operaci


on

En esta seccion se muestran resultados de prueba del sistema descrito en


las secciones anteriores. Los resultados fueron obtenidos de forma automatica
visualizados en tiempo real y posteriormente almacenados. Para este trabajo
se muestran datos de un circuito con compensacion de offset para el cual se
grafican 2 se
nales. En la Figura 3 se muestra la grafica de N
umero de datos
5

vs Voltaje. El script de Matlab puede almacenar datos en formato .txt o


.dat para su analisis en diferente software. Los datos son almacenados en un
archivo de texto como se muestra en la Figura 4.

Figura 3: Configuracion del sistema utilizado para caracterizar circuitos de


prueba.

Figura 4: Datos de salida almacenados en archivo de texto.

Para el ejemplo que se muestra en la Figura 3 se utilizo una Rref = 3k lo


cual equivale a un incremento de aproximadamente 57.1 mV por escalon [1].
En esta figura se observa que el proceso se detiene cuando la se
nal de salida
es menor que la se
nal de referencia, es decir, el sigo de la diferencia pasa de
6

ser positivo a negativo. Esta condicion de cambio de signo es contemplada


en el algoritmo de control mostrado en la Tabla 3.

5.

Conclusiones

En este trabajo se presenta las caractersticas principales de un sistema


desarrollado para automatizar la caracterizacion de circuitos bajo prueba.
Las limitaciones del protocolo RS232 restringen el sistema para ser usado
en caracterizacion de circuitos de prueba que operan en baja frecuencia. Sin
embargo, este cuenta con otras caractersticas que pueden ser explotadas.
Los 6 canales analogicos y el ADC de 10 bits de resolucion embebidos en
el Arduino nos permiten caracterizar el dispositivo con un bajo margen de
error. Ademas, la comunicacion con MATLAB permite la visualizacion, almacenamiento y procesamiento de datos para una mejor interpretacion.

Apendice A
Script de MatLab

numero muestras=input ( n
u mero de muestras : ) ;
ales : )
s i g n a l s=input ( n
u mero de s e n
p o r t=input ( PORT: )
close a l l ;
clc ;
y1=zeros ( 1 , 1 0 0 0 0 ) ; %Vector donde s e guardar
an l o s dato s
y2=zeros ( 1 , 1 0 0 0 0 ) ; %Vector donde s e guardar
an l o s dato s
y3=zeros ( 1 , 1 0 0 0 0 ) ; %Vector donde s e guardar
an l o s dato s
c o n t a d o r=zeros ( 1 , 1 0 0 0 0 ) ;
%I n i c i a l i z o e l p u e r t o s e r i a l
delete ( i n s t r f i n d ( { Port } ,{ COM7 }) ) ;
p u e r t o s e r i a l=s e r i a l ( COM7 ) ;
p u e r t o s e r i a l . BaudRate =9600 ;
warning ( o f f , MATLAB: s e r i a l : f s c a n f : u n s u c c e s s f u l R e a d ) ;
%A b r i r p u e r t o s e r i a l
7

fopen ( p u e r t o s e r i a l ) ;
%c o n t a d o r d e m u e s t r a s
c o n t a d o r m u e s t r a s =1;
%ventana para l a g r
afica
f i g u r e ( Name , S e r i a l t e s t )
t i t l e ( MATLAB+ARDUINO ) ;
xlabel ( N
umero de muestras ) ;
ylabel ( V o l t a j e (V) ) ;
grid on ;
hold on ;
// Bucle while para que tome y d i b u j e l a s muestras qu e
queremos
while c o n t a d o r m u e s t r a s <=numero muestras
ylim ( [ 0 2 . 1 ] ) ;
xlim ( [ c o n t a d o r m u e s t r a s 2 c o n t a d o r m u e s t r a s +1]) ;
s i g n a l 1=f s c a n f ( p u e r t o s e r i a l , %d ) ;
y1 ( c o n t a d o r m u e s t r a s )= ( s i g n a l 1 ( 1 ) ) 5 / 1 0 2 4 ;
s i g n a l 2=f s c a n f ( p u e r t o s e r i a l , %d ) ;
y2 ( c o n t a d o r m u e s t r a s ) =( s i g n a l 2 ( 1 ) ) 5 / 1 0 2 4 ;
s i g n a l 3=f s c a n f ( p u e r t o s e r i a l , %d ) ;
y3 ( c o n t a d o r m u e s t r a s ) =( s i g n a l 3 ( 1 ) ) 1 . 8 / 1 0 2 4 ;
c o n t a d o r ( c o n t a d o r m u e s t r a s )=c o n t a d o r m u e s t r a s ;
c o n t=f s c a n f ( p u e r t o s e r i a l , %d ) ;
switch s i g n a l s
case 1
plot ( c o n t a d o r m u e s t r a s , y1 ( c o n t a d o r m u e s t r a s ) , b
, LineWidth , 4 ) ;
legend ( V r e f )
case 2
plot ( c o n t a d o r m u e s t r a s , y1 ( c o n t a d o r m u e s t r a s ) ,
b , LineWidth , 4 ) ;
plot ( c o n t a d o r m u e s t r a s , y2 ( c o n t a d o r m u e s t r a s ) , x
r , LineWidth , 4 ) ;
legend ( V r e f , Vout )
case 3
8

plot ( c o n t a d o r m u e s t r a s
b , LineWidth , 4 ) ;
plot ( c o n t a d o r m u e s t r a s
r , LineWidth , 4 ) ;
plot ( c o n t a d o r m u e s t r a s
g , LineWidth , 4 ) ;
legend ( V r e f , Vout ,
otherwise
plot ( c o n t a d o r m u e s t r a s
b , LineWidth , 4 ) ;
legend ( V r e f )

, y1 ( c o n t a d o r m u e s t r a s ) ,

, y2 ( c o n t a d o r m u e s t r a s ) , x
, y3 ( c o n t a d o r m u e s t r a s ) , o
Signo )
, y1 ( c o n t a d o r m u e s t r a s ) ,

end
f p r i n t f ( c o n t a d o r= %d\n , c o n t )
drawnow ;
c o n t a d o r m u e s t r a s=c o n t a d o r m u e s t r a s +1;
end
%C i e r r o l a c o n e x i
o n con e l p u e r t o s e r i a l y e l i m i n o l a s
variables
fclose ( p u e r t o s e r i a l ) ;
delete ( p u e r t o s e r i a l ) ;

figure ;
switch s i g n a l s
case 1
plot ( c o n t a d o r ( 1 : c o n t a d o r
c o n t a d o r m u e s t r a s 1) ,
hold on ;
legend ( V r e f )
case 2
plot ( c o n t a d o r ( 1 : c o n t a d o r
c o n t a d o r m u e s t r a s 1) ,
hold on ;
plot ( c o n t a d o r ( 1 : c o n t a d o r
c o n t a d o r m u e s t r a s 1) ,
hold on ;
legend ( V r e f , Vout )
9

m u e s t r a s 1) , y1 ( 1 :
b , LineWidth , 4 ) ;

m u e s t r a s 1) , y1 ( 1 :
b , LineWidth , 4 ) ;
m u e s t r a s 1) , y2 ( 1 :
xr , LineWidth , 4 ) ;

case 3
plot ( c o n t a d o r ( 1 : c o n t a d o r m u e s t r a s 1) , y1 ( 1 :
c o n t a d o r m u e s t r a s 1) , b , LineWidth , 4 )
hold on ;
plot ( c o n t a d o r ( 1 : c o n t a d o r m u e s t r a s 1) , y2 ( 1 :
c o n t a d o r m u e s t r a s 1) , xr , LineWidth , 4 )
hold on ;
plot ( c o n t a d o r ( 1 : c o n t a d o r m u e s t r a s 1) , y3 ( 1 :
c o n t a d o r m u e s t r a s 1) , og , LineWidth , 4 )
hold on ;
legend ( V r e f , Vout , Signo )
otherwise
plot ( c o n t a d o r ( 1 : c o n t a d o r m u e s t r a s 1) , y1 ( 1 :
c o n t a d o r m u e s t r a s 1) , b , LineWidth , 4 )
hold on ;
legend ( V r e f )

end
%
guarda d a t o s en t x t
f i d=fopen ( data . t x t , w ) ;
signal1
signal2
f p r i n t f ( f i d , n . dat a
signal3 ) ;
f p r i n t f ( f i d , \n ) ;
for k = 1 : 1 : numer o muestras
c c o n t a d o r=mat2str ( c o n t a d o r ( k ) ) ;
c s i g n a l 1=mat2str ( f l o o r ( y1 ( k ) 1 0 0 0 0 0 ) /100000 )
;
c s i g n a l 2=mat2str ( f l o o r ( y2 ( k ) 1 0 0 0 0 0 ) /100000 )
;
c s i g n a l 3=mat2str ( f l o o r ( y3 ( k ) 1 0 0 0 0 0 ) /100000 )
;
c s i g n a l s=s t r c a t ( c c o n t a d o r , \ t , \ t ,
c signal1 , \t , \t , c signal2 , \t , \t ,
c signal3 ) ;
fprintf ( fid , c s i g n a l s ) ;
f p r i n t f ( f i d , \n ) ;
end
fclose ( f i d ) ;
10

save ( data . mat ) ;


clear a l l ;

Apendice B
Algoritmo en Arduino
int
int
int
int
int
int
int

s i g n a l p i n 1=A0 ; // Analog 0
s i g n a l p i n 2=A1 ; // Analog 1
s i g n a l p i n 3=A2 ; // Analog 2
outPin1= 7 ;
outPin2= 6 ;
outPin3= 5 ;
outPin4= 4 ;

int i n P i n 1= 3 ;

int s i g n a l 1 =0;
int s i g n a l 2 =0;
int s i g n a l 3 =0;
int s i g n o 1 ;
int s i g n o 2 ;
int co n t =0;
int i ;
void s e t u p ( )
{
S e r i a l . begin (9600) ;
pinMode ( outPin1 , OUTPUT) ;
pinMode ( outPin2 , OUTPUT) ;
pinMode ( outPin3 , OUTPUT) ;
pinMode ( outPin4 , OUTPUT) ;
pinMode ( inPin1 , INPUT) ;
}
11

void l o o p ( ) {
d i g i t a l W r i t e ( outPin1 , LOW) ; // c o n t a d o r en c e r o s
d i g i t a l W r i t e ( outPin2 , LOW) ;
d i g i t a l W r i t e ( outPin3 , LOW) ;
delay (500) ;
s i g n o 1=d i g i t a l R e a d ( i n P i n 1 ) ;
s i g n o 2=s i g n o 1 ;
d i g i t a l W r i t e ( outPin4 , s i g n o 1 ) ;
//e n v i o de d a t o s
s i g n a l 1=analogRead ( s i g n a l p i n 1 ) ;
Serial . println ( signal1 ) ;
delay (50) ;
s i g n a l 2=analogRead ( s i g n a l p i n 2 ) ;
Serial . println ( signal2 ) ;
delay (50) ;
s i g n a l 3=analogRead ( s i g n a l p i n 3 ) ;
Serial . println ( signal3 ) ;
delay (50) ;
S e r i a l . p r i n t l n ( cont ) ;
delay (50) ;
//c o n t a d o r f r e c a p r o x= 1 Hz
while ( s i g n o 1==s i g n o 2 )
{
s i g n o 2=d i g i t a l R e a d ( i n P i n 1 ) ;
s i g n a l 1=analogRead ( s i g n a l p i n 1 ) ;
Serial . println ( signal1 ) ;
delay (50) ;
s i g n a l 2=analogRead ( s i g n a l p i n 2 ) ;
Serial . println ( signal2 ) ;
delay (50) ;
s i g n a l 3=analogRead ( s i g n a l p i n 3 ) ;
Serial . println ( signal3 ) ;
delay (50) ;
S e r i a l . p r i n t l n ( cont ) ;
12

delay (50) ;

i f ( i ==10)
{
co n t=c o n t +1;
i =0;
}
i=i +1;

i f ( cont >=7)
{
co n t =7;
}
//c o n t b i n a r i o
switch ( c o n t ) {
case 1 :
d i g i t a l W r i t e ( outPin1 , HIGH) ;
d i g i t a l W r i t e ( outPin2 , LOW) ;
d i g i t a l W r i t e ( outPin3 , LOW) ;
break ;
case 2 :
d i g i t a l W r i t e ( outPin1 , LOW) ;
d i g i t a l W r i t e ( outPin2 , HIGH) ;
d i g i t a l W r i t e ( outPin3 , LOW) ;
break ;
case 3 :
d i g i t a l W r i t e ( outPin1 , HIGH) ;
d i g i t a l W r i t e ( outPin2 , HIGH) ;
d i g i t a l W r i t e ( outPin3 , LOW) ;
break ;
case 4 :
d i g i t a l W r i t e ( outPin1 , LOW) ;
d i g i t a l W r i t e ( outPin2 , LOW) ;
d i g i t a l W r i t e ( outPin3 , HIGH) ;
break ;
13

case 5 :
d i g i t a l W r i t e ( outPin1
d i g i t a l W r i t e ( outPin2
d i g i t a l W r i t e ( outPin3
break ;
case 6 :
d i g i t a l W r i t e ( outPin1
d i g i t a l W r i t e ( outPin2
d i g i t a l W r i t e ( outPin3
break ;
case 7 :
d i g i t a l W r i t e ( outPin1
d i g i t a l W r i t e ( outPin2
d i g i t a l W r i t e ( outPin3
break ;
}

, HIGH) ;
, LOW) ;
, HIGH) ;

, LOW) ;
, HIGH) ;
, HIGH) ;

, HIGH) ;
, HIGH) ;
, HIGH) ;

while ( 1 )
{
s i g n a l 1=analogRead ( s i g n a l p i n 1 ) ;
Serial . println ( signal1 ) ;
delay (50) ;
s i g n a l 2=analogRead ( s i g n a l p i n 2 ) ;
Serial . println ( signal2 ) ;
delay (50) ;
s i g n a l 3=analogRead ( s i g n a l p i n 3 ) ;
Serial . println ( signal3 ) ;
delay (50) ;
S e r i a l . p r i n t l n ( cont ) ;
delay (50) ;
}
}

14

Referencias

[1] E. Guerrero, L. Carrillo-MartAnez,


M. Sanz-Pascual, J. Molina, N. Medrano, and B. Calvo, Offset and gain calibration circuit for mim-isfet
devices, Analog Integrated Circuits and Signal Processing, vol. 76, no. 3,
pp. 321333, 2013.

15