USANDO EL PUERTO SERIAL CON MATLAB 7: Caso Real

 

El siguiente código está escrito para esta situación: 

Un dispositivo (para el caso en que se usó este programa fue un pic) está conectado a través de un circuito a tres sensores: voltaje, corriente y frecuencia. Mediante un conversor A/D envía al puerto serial de la PC (a 9600 bauds) los datos en código Ascii como siguen:

1. El dispositivo envía primero una "A" (cod. Ascii 65) así el programa en Matlab sabe que llegarán los dotos de una muestra de corriente que se guardará en el vector A.

2. Para la muestra de corriente siempre llegarán cuatro caracteres, por ejemplo, para 0.134 amperios, el dispositivo enviará al puerto serial los códigos Ascii de los caracteres "0", ".", "1", "3" y "4". 

3. El dispositivo envía a continuación una "B" (cod. Ascii 66) así el programa en Matlab sabe que llegarán los dotos de una muestra de voltaje que se guardará en el vector V.

4. Para la muestra de voltaje siempre llegarán cuatro caracteres, por ejemplo, para 5.250 voltios, el dispositivo enviará al puerto serial los códigos Ascii de los caracteres "5", ".", "2", "5" y "0". 

3. El dispositivo envía a continuación una "F" (cod. Ascii 70) así el programa en Matlab sabe que llegarán los dotos de una muestra de frecuencia que se guardará en el vector F.

4. Para la muestra de frecuencia no se sabe cuántos caracteres llegarán. Si se miden 50 Hz llegarán dos caracteres: "5" y "0". Si se miden 1550 Hz llegarán cuatro caracteres: "1", "5", "5" y "0". Nadie sabe cuantos caracteres llegarán, sólo se sabe que éstos se terminan cuando se recibe nuevamente una "A" y todo el ciclo (desde el paso 1) se vuelve a repetir. 

El programa almacenará cien muestras por cada parámetro leído (voltaje, corriente y frecuencia), las almacenará en sus respectivos vectores y mostrará estos en una gráfica en pantalla. Todo esto se repetirá ochenta veces. Entonces el programa cierra el puerto y finaliza.

El código completo del programa es el siguiente:

% programado por Yelinna Pulliti
clear all;
close all;
clc;

PS=serial('COM1');
set(PS,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(PS,'StopBits',1); % se configura bit de parada a uno
set(PS,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
set(PS,'Parity','none'); % se configura sin paridad
set(PS,'Terminator','CR/LF');% “c” caracter con que finaliza el envío 
set(PS,'OutputBufferSize',1); % ”n” es el número de bytes a enviar
set(PS,'InputBufferSize' ,1); % ”n” es el número de bytes a recibir
set(PS,'Timeout',5); % 5 segundos de tiempo de espera

fopen(PS);

A=[]; %corriente
V=[]; %voltaje
F=[]; %frecuencia

A1=[]; %temp corriente
V1=[]; %temp voltaje
F1=[]; %temp frecuencia
Ch=0;

disp('presione enter para iniciar captura (solo se puede parar la ejecucion mediante control-C)');
pause;

inn=1;
frec=0;

while inn<80

for j=1:100

if frec==65
     Ch=frec;
else
     Ch=fread(PS,1,'uchar'); % Ch: variable donde se almacena el dato leido del puerto
end;
switch Ch
     case 65
         for k=1:4
           A1 = [A1 fread(PS,1,'uchar')];
         end;
frec=0;
     case 66
         for k=1:4
           V1 = [V1 fread(PS,1,'uchar')];
         end;
frec=0;
      case 70
         F1 = [F1 fread(PS,1,'uchar')];
         while frec ~=65
               frec= fread(PS,1,'uchar');
                 if frec ~=65
                   F1 = [F1 frec];
                end;
              end;
      otherwise
         continue;
end; 

A1=char(A1); V1=char(V1); F1=char(F1); % conv ascii a caract
A=[A str2num(A1)]; % convierte de caract a numero
V=[V str2num(V1)]; 
F=[F str2num(F1)];

A1=[]; 
V1=[]; 
F1=[]; 
end;

A=A*200/5; V=V*24/5; 

figure(1)
colordef(1,'black');
subplot(4,1,1)
plot(A,'r');
xlabel('tiempo')
ylabel('Amperios');
% axis([0 length(A) 0 225]);
subplot(4,1,2)
plot(F,'m');
xlabel('tiempo')
ylabel('Hz');
% axis([0 length(F) 0 10000]);
subplot(4,1,3)
plot(V,'b');
xlabel('tiempo')
ylabel('Voltios');
% axis([0 length(V) 0 30]);
subplot(4,1,4)
% plot(F,'m');
plot(F,A)
xlabel('Frecuencia')
ylabel('Corriente')
% xlabel('tiempo')
% ylabel('Hz');
axis([0 length(F) 0 length(A)]);
% axis([0 length(F) 0 10000]);

pause(0.1);

A=[]; %corriente
V=[]; %voltaje
F=[]; %frecuencia

inn=inn+1;
end; 


fclose(PS);
delete(PS);
clear PS;
INSTRFIND

La línea donde se hace:

Es simplemente para establecer los datos en los vectores dentro de un rango definido.

Para saber un poco más de cómo manejar el puerto serial desde Matlab recomiendo leer este tutorial.