Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivos
• Desarrollar códigos de programación para poder realizar una comunicación serial del PIC con la
computadora.
• Implementar un sistema en tiempo real con tiempos de ejecución precisos para cada transmisión
y recepción de datos.
Marco Teórico
MATLAB (abreviatura de MATrix LABoratory, "laboratorio de matrices") es un software matemático que
ofrece un entorno de desarrollo integrado (IDE) con un lenguaje de programación propio (lenguaje M). Está
disponible para las plataformas Unix, Windows y Apple Mac OS X.
Es un software muy usado en universidades y centros de investigación y desarrollo. En los últimos años ha
aumentado el número de prestaciones, como la de programar directamente procesadores digitales de señal
o crear código VHDL.
La comunicación serial consiste en el envío de un bit de información de manera secuencial, esto es, un
bit a la vez y a un ritmo acordado entre el emisor y el receptor.
La comunicación serial en computadores ha seguido los estándares definidos en 1969 por el RS-232
(Recommended Standard 232) que establece niveles de voltaje, velocidad de transmisión de los datos, etc.
Por ejemplo, este protocolo establece un nivel de -12v como un uno lógico y un nivel de voltaje de +12v
como un cero lógico (por su parte, los microcontroladores emplean por lo general 5v como un uno lógico y
0v como un cero lógico).
Existen en la actualidad diferentes ejemplos de puertos que comunican información de manera serial (un
bit a la vez). El conocido como “puerto serial” ha sido gradualmente reemplazado por el puerto USB
(Universal Serial Bus) que permite mayor versatilidad en la conexión de múltiples dispositivos. Aunque en
naturaleza serial, no suele referenciarse de esta manera ya que sigue sus propios estándares y no los
establecidos por el RS-232.
El Universal Serial Bus (bus universal en serie) o Conductor Universal en Serie (CUS), abreviado
comúnmente USB, es un puerto que sirve para conectar periféricos a un ordenador. Fue creado en 1996
por siete empresas: IBM, Intel, Northern Telecom, Compaq, Microsoft, Digital Equipment
Corporation y NEC[cita requerida].
El diseño del USB tenía en mente eliminar la necesidad de adquirir tarjetas separadas para poner en los
puertos bus ISA o PCI, y mejorar las capacidades plug-and-play permitiendo a esos dispositivos ser
conectados o desconectados al sistema sin necesidad de reiniciar. Sin embargo, en aplicaciones donde se
necesita ancho de banda para grandes transferencias de datos, o si se necesita una latencia baja, los buses
PCI o PCIe salen ganando. Igualmente sucede si la aplicación requiere de robustez industrial. A favor del
bus USB, cabe decir que cuando se conecta un nuevo dispositivo, el servidor lo enumera y agrega el
software necesario para que pueda funcionar (esto dependerá ciertamente del sistema operativo que esté
usando el ordenador).
El USB no puede conectar los periféricos porque sólo puede ser dirigido por el drive central así como:
ratones, teclados, escáneres, cámaras digitales, teléfonos móviles, reproductores multimedia, impresoras,
discos duros externos entre otros ejemplos, tarjetas de sonido, sistemas de adquisición de datos y
componentes de red. Para dispositivos multimedia como escáneres y cámaras digitales, el USB se ha
convertido en el método estándar de conexión. Para impresoras, el USB ha crecido tanto en popularidad
que ha desplazado a un segundo plano a los puertos paralelos porque el USB hace mucho más sencillo el
poder agregar más de una impresora a un ordenador.
Algunos dispositivos requieren una potencia mínima, así que se pueden conectar varios sin necesitar
fuentes de alimentación extra. La gran mayoría de los concentradores incluyen fuentes de alimentación que
brindan energía a los dispositivos conectados a ellos, pero algunos dispositivos consumen tanta energía
que necesitan su propia fuente de alimentación. Los concentradores con fuente de alimentación pueden
proporcionarle corriente eléctrica a otros dispositivos sin quitarle corriente al resto de la conexión (dentro
de ciertos límites).
Los convertidores Edgeport de USB a serie constituyen una sencilla solución de conexión directa (plug-
and-play) para la expansión de puertos COM. Los Edgeport son una alternativa independiente (externa) a
las tarjetas PCI, y se conectan por USB a un PC o servidor, de modo que ya no es necesario abrir el chasis,
reconfigurar y reiniciar el equipo. Basta con conectar el Edgeport y en cuestión de minutos dispondrá de
hasta 16 puertos serie para conectar lectores de códigos de barras, impresoras o cualquier dispositivo serie
periférico.
Un puerto serie o puerto serial es una interfaz de comunicaciones de datos digitales, frecuentemente
utilizado por computadoras y periféricos, en donde la información es transmitida bit a bit enviando un solo
bit a la vez, en contraste con el puerto paralelo que envía varios bits simultáneamente. La comparación
entre la transmisión en serie y en paralelo se puede explicar usando una analogía con las carreteras. Una
carretera tradicional de un sólo carril por sentido sería como la transmisión en serie y una autovía con varios
carriles por sentido sería la transmisión en paralelo, siendo los vehículos los bits que circulan por el cable.
Material
1 PIC16F887
1 Capacitores Cerámicos de 22 pF.
Desarrollo
El PIC16F887 mandara un numero de tipo flotante al programa Matlab de la computadora el cual
corresponde al valor analógico que retorna el sensor de temperatura LM35, al recibir el numero Matlab se
encarga de hacer la conversión a temperatura.
Matlab mandara una cadena de caracteres que contiene
{[0XXXX],[0YYY],[ZZZ.ZZZ]}
XXXX: Configuración que contiene el ciclo útil para el PWM
YYY: Dato que contiene el ciclo útil del PWM , est6e se muestra en una pantalla LCD
ZZZ.ZZZ: dato que contiene la temperatura exacta , este dato se muestra en una pantalla LCD
1. Se procedió a armar el siguiente circuito. El cual también se muestra en las siguientes fig. 7.1 – 7.3
Descripción del programa
La función principal del programa es de transmitir un numero elegido por el programador hacia Matlab vía
USB-Serial, éste al recibirlo lo mostrara en pantalla, le sumara 5 y lo regresara al PIC el cual lo mostrara en
una barra de Let´s en formato Hexadecimal.
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
close all;
clc;
muestras=480;
voltaje=0; %Declara variable en la cual se van a guardar los valores
voltaje1=0;
duty_pwm=200;
porc=0;
Tmedio=50;
%Borra datos que se encuentren previos y vuelve a declarar el puerto y la
%velocidad de transmisión
delete(instrfind({'port'},{'COM5'}));
puerto=serial('COM5');
instrfind
fopen(puerto);%abre el puerto a utilizar
puerto.BaudRate=9600;
contador=1;
porc=duty_pwm*100/1023;
porc=round(porc);
chr_duty = int2str (duty_pwm);
chr_porc = int2str (porc);
if duty_pwm<10
chr_duty=strcat('0000',chr_duty);
elseif duty_pwm>=10 & duty_pwm<100
chr_duty=strcat('000',chr_duty);
elseif duty_pwm>=100 & duty_pwm<1000
chr_duty=strcat('00',chr_duty);
else
chr_duty=strcat('0',chr_duty);
end
if porc<10
chr_porc=strcat('00',chr_porc);
elseif porc>=10 & porc<100
chr_porc=strcat('0',chr_porc);
else
chr_porc=chr_porc;
end
config=strcat(chr_duty,chr_porc,chr_temp)
fprintf(puerto,'%s\r',config)
pause(0.24)
voltaje1=voltaje(contador);
plot(voltaje); %Grafica el voltaje
if(voltaje<Tmedio)
if (duty_pwm<1023)
duty_pwm=duty_pwm+1;
end
end
if(voltaje>Tmedio)
if(duty_pwm>0)
duty_pwm=duty_pwm-1;
end
end
drawnow
contador=contador+1;
end
%cierra y borra el puerto utilizado, borra todas las variables utilizadas
fclose(puerto);
delete(puerto);
puerto.BaudRate=9600;
contador=1;
porc=duty_pwm*100/1023;
porc=round(porc);
if duty_pwm<10
chr_duty=strcat('0000',chr_duty);
elseif duty_pwm>=10 & duty_pwm<100
chr_duty=strcat('000',chr_duty);
elseif duty_pwm>=100 & duty_pwm<1000
chr_duty=strcat('00',chr_duty);
else
chr_duty=strcat('0',chr_duty);
end
if porc<10
chr_porc=strcat('00',chr_porc);
elseif porc>=10 & porc<100
chr_porc=strcat('0',chr_porc);
else
chr_porc=chr_porc;
end
config=strcat(chr_duty,chr_porc,chr_temp)
fprintf(puerto,'%s\r',config)
pause(0.24)
voltaje1=voltaje(contador);
plot(voltaje); %Grafica el voltaje
if(voltaje<Tmedio)
if (duty_pwm<1023)
duty_pwm=duty_pwm+1;
end
end
if(voltaje>Tmedio)
if(duty_pwm>0)
duty_pwm=duty_pwm-1;
end
end
drawnow
contador=contador+1;
end
%cierra y borra el puerto utilizado, borra todas las variables utilizadas
fclose(puerto);
delete(puerto);
puerto.BaudRate=9600;
contador=1;
porc=duty_pwm*100/1023;
porc=round(porc);
if duty_pwm<10
chr_duty=strcat('0000',chr_duty);
elseif duty_pwm>=10 & duty_pwm<100
chr_duty=strcat('000',chr_duty);
elseif duty_pwm>=100 & duty_pwm<1000
chr_duty=strcat('00',chr_duty);
else
chr_duty=strcat('0',chr_duty);
end
if porc<10
chr_porc=strcat('00',chr_porc);
elseif porc>=10 & porc<100
chr_porc=strcat('0',chr_porc);
else
chr_porc=chr_porc;
end
config=strcat(chr_duty,chr_porc,chr_temp)
fprintf(puerto,'%s\r',config)
pause(0.24)
voltaje1=voltaje(contador);
plot(voltaje); %Grafica el voltaje
if(voltaje<Tmedio)
if (duty_pwm<1023)
duty_pwm=duty_pwm+1;
end
end
if(voltaje>Tmedio)
if(duty_pwm>0)
duty_pwm=duty_pwm-1;
end
end
drawnow
contador=contador+1;
end
%cierra y borra el puerto utilizado, borra todas las variables utilizadas
fclose(puerto);
delete(puerto);
close all;
clc;
muestras=1200;
voltaje=0; %Declara variable en la cual se van a guardar los valores
voltaje1=0;
duty_pwm=819;
porc=0;
% Tmedio=50;
%Borra datos que se encuentren previos y vuelve a declarar el puerto y la
%velocidad de transmisión
delete(instrfind({'port'},{'COM5'}));
puerto=serial('COM5');
instrfind
fopen(puerto);%abre el puerto a utilizar
puerto.BaudRate=9600;
contador=1;
porc=duty_pwm*100/1023;
porc=round(porc);
if duty_pwm<10
chr_duty=strcat('0000',chr_duty);
elseif duty_pwm>=10 & duty_pwm<100
chr_duty=strcat('000',chr_duty);
elseif duty_pwm>=100 & duty_pwm<1000
chr_duty=strcat('00',chr_duty);
else
chr_duty=strcat('0',chr_duty);
end
if porc<10
chr_porc=strcat('00',chr_porc);
elseif porc>=10 & porc<100
chr_porc=strcat('0',chr_porc);
else
chr_porc=chr_porc;
end
config=strcat(chr_duty,chr_porc,chr_temp)
fprintf(puerto,'%s\r',config)
pause(0.24)
voltaje1=voltaje(contador);
plot(voltaje); %Grafica el voltaje
% if(voltaje<Tmedio)
% if (duty_pwm<1023)
% duty_pwm=duty_pwm+1;
% end
% end
%
% if(voltaje>Tmedio)
% if(duty_pwm>0)
% duty_pwm=duty_pwm-1;
% end
% end
drawnow
contador=contador+1;
end
%cierra y borra el puerto utilizado, borra todas las variables utilizadas
fclose(puerto);
delete(puerto);
#include<lcd.c>
#BYTE PORTA= 5
#BYTE PORTD= 8
#INCLUDE <stdlib.h>
unsigned int16 bits,porcentaje; //Variable almacena los
bits
float tem,temp_float; //Almacena la temperatura
char ch;
char string [17];
char duty_pwm [6];
char porc [6];
char temperatura [9];
int i;
void main()
{
set_tris_b(0x00);
lcd_init(); //inicializa lcd
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
while(1)
{
set_adc_channel(0); //Selecciono el canal 0 (RA0)
delay_ms(1); //llamo retardo de 1 ms
tem=read_adc(); //Guarde el dato del LM en tempe
printf("\r%.0f\r\n",tem);
set_pwm1_duty(bits);
delay_ms(15);
gets(string);
for(i=0;i<5;i++){
duty_pwm[i]=string[i];
}
bits=atol(duty_pwm);
for(i=5;i<8;i++){
porc[0]='0';
porc[1]='0';
porc[i-3]=string[i];
}
porcentaje=atol(porc);
for(i=8;i<15;i++){
temperatura[i-8]=string[i];
}
temp_float=atof(temperatura);
Conclusión:
Al termino de esta práctica lo que se puede concluir es que la conexión serial es muy
importante ya que si no se cuenta con un puerto USB será de mucha ayuda el puerto serial o
en serie; una de las desventajas es que la conexión es algo lenta si uno de los pines esta
defectuosos o roto por eso estos puertos están siendo sustituidos por puertos USB los cuales
son más rápidos y confiables. Esta práctica será de mucha ayuda en el futuro cuando
tengamos que hacer proyectos más complicados que necesiten comunicación con una PC ya
que estaremos encaminados en el tema.
Referencias: