En el siguiente programa realizado en conjunto con MATLAB presentare una forma sencilla de muestreo de señales, en esta ocasión para posteriormente presentar un programa realizado igualmente en MATLAB del control de las articulaciones de un robot diseñado en MATLAB con ayuda del ADC, claro sera un ejemplo demostrativo por lo que el diseño del robot no sera del todo bueno pero es una forma de mostrar el uso del programa.
Es importante aclarar que el software MATLAB no es recomendable para muestreo de señales en tiempo real debido a sus procesamiento de datos, este programa tiene la finalidad únicamente de proporcionar una manera de obtener datos mediante este software para poder utilizarlo posteriormente en usos prácticos.
DESARROLLO:
Comenzaremos explicando el programa realizado para el microcontrolador AVR y en seguida el código en MATLAB.
MICROCONTROLADOR:
Para la ejecución del programa se utilizo el software VIRTUAL SERIAL PORT DRIVER el cual crea puertos seriales virtuales, se mostrara al final una imagen.
El código en sí es muy sencillo consta de tres partes principales, las cuales se describirán a continuación:
ISR(USART_RX_vect):
Realiza la recepción de los datos, únicamente lee el dato adquirido y asigna el valor de 1 a la variable habilitar, esto para realizar el envió de datos incluido en la función enviar.
ENVIAR:
Esta función realiza el envió de los datos adquiridos por el modulo ADC en especifico el ADC0, para esto, se envían datos cada vez que la variable habilitar es igual a uno, una vez leído el dato se pregunta si se recibió el carácter 'x' de ser así lee el valor de la señal y la procesa para enviar el valor leído en unidades, decenas y centenas en su correspondiente carácter en ASCII para que MATLAB pueda interpretar los datos y manipularlos, ademas se envía un byte el cual es el valor 0x0A indicando el termino de la cadena.
Cabe aclarar que esta función deshabilita la interrupción global al inicio para evitar que se dispare la interrupción mientras se envían los datos, al finalizar el envió se vuelve a habilitar la interrupción global y se asigna a la variable habilitar el valor cero para que únicamente se ejecute la función cuando suceda una interrupción.
MAIN:
Realiza la declaración de las funciones a utilizar y las inicializa. En esta ocasión el baudrate del USART sera de 19200 para que el muestreo sea rápido.
WHILE(1):
Envía los datos cada vez que surge una interrupción.
DESCONCATENAR(unsigned char dato):
Realiza la asignación del valor correspondiente de las unidades, decenas y centenas en su correspondiente carácter ASCII para ser tratados por el software MATLAB.
MATLAB:
El código en MATLAB realiza lo siguiente:
- Cierra y limpia para que no haya ningún conflicto en la ejecución del programa.
- Declara las variables a usar y designa los datos a capturar siendo el máximo de 2001, donde el ultimo es el carácter 0x0A que es un salto de linea.
- Configuración del puerto serial.
- Envió de carácter que permite leer los datos.
- Recepción de datos.
- Tratamiento de los datos adquiridos para poder manipularlos.
- Presentación en una gráfica los datos adquiridos
NOTA:
Alguna duda o aclaración puede ingresarla en los comentarios. Dejo al final los links para que pueda descargar los programas.
PROGRAMAS:
MICROCONTROLADOR:
/*
* MUESTREO_MATLAB_2.c
*
* Created: 16/03/2014 11:44:53
* Author: TERRAFORMARS
*/
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 8000000UL // XTAL de 8 MHz
#endif
#include "InitADC.h"
#include "UARTAiNit.h"
#include <util/delay.h>
#include <avr/interrupt.h>
#define setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit)))
#define clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit)))
#define bittoggle(sfr,bit)(_SFR_BYTE(sfr)^=_BV(bit))
unsigned char i,n,valor[3]={0},envio[4]={0},recibido,unidad,habilitar=0;
int j;
unsigned char desconcatenar(unsigned char dato);
ISR (USART_RX_vect){
recibido=ReceiveUART0();
if (recibido=='x')
{
habilitar=1;
}
}
void enviar(){
if (habilitar==1)
{
cli();
for (j=0;j<500;j++)
{
n=convADC();
valor[0]=n/100;
valor[1]=(n-100*valor[0])/10;
valor[2]=n-100*valor[0]-10*valor[1];
for (i=0;i<3;i++)
{
envio[i]=desconcatenar(valor[i]);
}
envio[3]=0;
for (i=0;i<4;i++)
{
TransmiteUART0(envio[i]);
}
}
envio[3]=10;
TransmiteUART0(envio[3]);
habilitar=0;
sei();
}
}
int main(void)
{
canalADC(0);
initADC(2,1,5);
initializeUART0(19200,0,8,2,2);
setbit(UCSR0B,RXCIE0);
sei();
while(1)
{
//TODO:: Please write your application code
enviar();
}
}
unsigned char desconcatenar(unsigned char dato){
switch(dato){
case 0:
unidad='0';
break;
case 1:
unidad='1';
break;
case 2:
unidad='2';
break;
case 3:
unidad='3';
break;
case 4:
unidad='4';
break;
case 5:
unidad='5';
break;
case 6:
unidad='6';
break;
case 7:
unidad='7';
break;
case 8:
unidad='8';
break;
case 9:
unidad='9';
break;
}
return unidad;
}
MATLAB
close all
clear all
clc
n=2001;
n2=(n-1)/4;
temp=zeros(1,n);
B=zeros(n2,4);
x=0:n-1;
b=0;
%configuracion de puerto serial
s2 = serial('COM2','BaudRate',19200,'DataBits',8,'StopBits',2);
set(s2,'Parity','none'); % se configura sin paridad
set(s2,'InputBufferSize' ,n); % ”n” es el número de bytes a recibir
set(s2,'Timeout',2); % 1 segundos de tiempo de espera a recibir los datos
set(s2,'FlowControl','none'); %sin control de flujo
set(s2,'Terminator','LF'); %el carácter que indica la terminación de la cadena
%abrir puerto
fopen(s2);
fprintf(s2,'%c','x'); %Manda el carácter 'x'
A=fread(s2,n,'uchar'); %Lee los caracteres en el buffer
%cerrar puerto
fclose(s2);
delete(s2);
clear s2
instrfind
for i=1:n2-1
if i==1 %si i es igual a 1 entonces b es igual a 1
b=1;
else %sino b es igual a 4
b=4;
end
for l=1:4
s=b*i+l-1;
B(i,l)=A(s); %asigna los datos en A a la variable B
end
end
C=char(B); %convierte los datos en B en datos tipo char y los guarda en C
for i=1:n2
D=cat(2,C(i,1),C(i,2),C(i,3),C(i,4)); %Guarda la concatenación de C en D
temp(i)=str2double(D); %Convierte el valor de D a tipo double y lo guarda en temp.
end
y1=5*temp/255; %Preescala el valor de temp de 0 a 255 en 0 a 5
plot(x,y1) %grafica el valor de x e y1
axis([0 n2 0 5]) %Manipula las propiedades de los ejes para visualizar la grafica de forma %adecuada
VÍDEO DE FUNCIONAMIENTO:
IMÁGENES:
PROGRAMA EN ISIS:
EJECUCIÓN DE ISIS Y MATLAB 1:
PROGRAMA EN ISIS 2:
EJECUCIÓN DE ISIS Y MATLAB 2:
CÓDIGO EN MATLAB:
CONFIGURACIÓN DE COMPIM
CONFIGURACIÓN DE VIRTUAL SERIAL PORT DRIVER:
LINKS:
MATLAB:
https://mega.co.nz/#!Fx0HQRLZ!zN6FnXMNwuuvUPVHVWm6EqbnfEcwRMo8MPRY3Cj4jhE
MICROCONTROLADOR:
https://mega.co.nz/#!508FUKrR!dYeL91engG0F7aYaBxGFrk_nLdc6kCyQgwHtllkFp0E
No hay comentarios:
Publicar un comentario