Práctica 6a
Práctica 6a
Práctica 6a
Primero se graficará un objeto aún no definido L1 que crea la interfase gráfica en la que trabajará.
Este comando crea una línea aún no definida (nan) de color rojo y un poco más gruesa. Se establecen los límites
de la gráfica y la rejilla mediante
donde N es el tamaño del vector, Fs la frecuencia de muestreo y r es el vector de datos que se graficará y se
inicializa con ceros. El comando linspace genera un vector de puntos igualmente espaciados entre 0 y N y se
utilizará para la escala de tiempo.
Para comenzar la adquisición de datos es necesario inicializar la tarjeta Arduino y escribir los comandos en un
lazo while infinito.
ard = arduino;
tic
while 1
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a0');
set(L1,'XData',t,'YData',r);
drawnow
end
end
La función tic, junto con toc, permite conocer el tiempo de ejecución de los comandos entre ambas funciones, y
se utilizará para generar bases de tiempo que permitan medir los periodos de muestreo de una manera informal.
El vector de datos que se graficará, r, se desplaza una posición a la izquierda para que el último dato del vector
contenga el valor capturado por la tarjeta de adquisición de datos dentro del lazo while. Se escribe el dato en la
línea L1 mediante el comando set y se actualiza la gráfica con la instrucción drawnow.
Con estas instrucciones genere una función en un nuevo script poniendo como encabezado la palabra function
nombre_de_funcion como encabezado, donde nombre_de_funcion es el nombre que se elige para la función. Es
conveniente incluir las instrucciones close all, clear y clc, inmediatamente después del encabezado para asegurarse
de limpiar el puerto, cerrar todas las ventanas adicionales que pudieran estar abiertas y limpiar el espacio de
trabajo antes de ejecutar el resto de las instrucciones. No olvidar incluir una instrucción end al final para indicar
el término de la función.
Ejecutar el programa cambiando los valores de tensión en el pin A0 de la tarjeta Arduino, ya sea mediante un
puente entre A0 y las terminales de tierra, GND, 3.5V y 5V, mediante potenciómetro o una fuente de alimentación
externa cuidando de no exceder el límite máximo de 5V que soporta la tarjeta como entrada.
Para eliminar los mensajes de error que aparecen al cerrar la ventana gráfica, se añade un botón de paro en la
interfase de usuario y se modifica la condición del lazo while quedando el programa de la siguiente manera:
function nombre_de_funcion
close all
clear
clc
ard = arduino;
Parar = false;
uicontrol('Style','pushbutton','String','Fin',...
'Callback', @Boton);
tic
while ~Parar
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a0');
set(L1,'XData',t,'YData',r);
drawnow
end
end
function Boton(obj, ~)
Parar = obj.Value;
end
end
2. Realizando mediciones de temperatura.
Utilice el siguiente script para capturar datos de un sensor de temperatura LM35 que mide la temperatura de una
resistencia de 10 a 1/2 W conectada a una fuente de 5V. Conecte la fuente de tensión en la entrada a1.
function AdquisicionTemp
clear
close all
clc
ard = arduino;
Parar = false;
uicontrol('Style','pushbutton','String','Fin',...
'Callback', @Boton);
tic
while ~Parar
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a1');
c(1:end-1) = c(2:end);
c(end) = readVoltage(ard, 'a0');
set(L1,'XData',t,'YData',r);
set(L2,'XData',t,'YData',2);
drawnow
end
end
function Boton(obj, ~)
Parar = obj.Value;
end
end
3. Simulando un sistema en tiempo discreto.
A continuación se simulará el comportamiento de un sistema de segundo orden subamortiguado y discretizado,
empleando como entrada o señal de excitación los datos generados por la tarjeta de adquisición de datos y se
observará su respuesta o señal de salida en otro trazo dibujado en el mismo gráfico.
𝐶(𝑠) 8
= 2
𝑅(𝑠) 𝑠 + 2𝑠 + 8
Gz = c2d(G,1/Fs,’zoh’);
function nombre_de_funcion
L1 = line(nan, nan, 'Color', 'r', 'LineWidth', 2);
L2 = line(nan, nan, 'Color', 'b', 'LineWidth', 2);
ard = arduino;
Parar = false;
uicontrol('Style','pushbutton','String','Fin',...
'Callback', @Boton);
%%%%%%%%%%%%%%%%%%%%%%%%%
G = tf(8,[1 2 8]);
Gz= c2d(G,1/Fs,'zoh');
n = Gz.num{1};
d = Gz.den{1};
b1= n(2);
b0= n(end);
a1= d(2);
a0= d(end);
%%%%%%%%%%%%%%%%%%%%%%%%%
tic
while ~Parar
if toc > 1/Fs
tic
r(1:end-1) = r(2:end);
r(end) = readVoltage(ard, 'a0');
c(1:end-1) = c(2:end);
c(end) = -a1*c(end-1)-a0*c(end-2)+b1*r(end-1)+b0*r(end-2);
set(L1,'XData',t,'YData',r);
set(L2,'XData',t,'YData',c);
drawnow
end
end
function Boton(obj, ~)
Parar = obj.Value;
end
end
Experimentar cambiando la frecuencia de muestreo Fs = 10 y el tamaño del vector N = 100, como también con
Fs = 1 y N = 10.