Академический Документы
Профессиональный Документы
Культура Документы
1 Introducción general 3
1.1 Duración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.1 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3.2 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.3 Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.4 Actividad 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.5 Actividad 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
i
ii CONTENIDO
6 Temporizadores 33
6.1 Duración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.2 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.2.1 Encoders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.2.2 Interrupción (TIMER2) . . . . . . . . . . . . . . . . . . . . . 34
6.3 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.3.1 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.3.2 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
CONTENIDO iii
6.3.3 Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.3.4 Actividad 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7 Controlador PID 43
7.1 Duración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.2 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.2.1 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
iv CONTENIDO
Lista de figuras
1 Terminales L293 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2 Control con tres señales . . . . . . . . . . . . . . . . . . . . . . . . . 51
3 Control con dos señales . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4 Uso de optoacopladores . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5 Entorno PIC C Compiler . . . . . . . . . . . . . . . . . . . . . . . . . 53
6 Compilación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7 Ventana de estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8 Entorno MPLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9 Configuración Ccsc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
v
vi LISTA DE FIGURAS
10 Selección Ccsc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
11 Selección del dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . 57
12 Creación de un proyecto . . . . . . . . . . . . . . . . . . . . . . . . . 58
13 Creación de un archivo nuevo . . . . . . . . . . . . . . . . . . . . . . 58
14 Agregar archivo al proyecto . . . . . . . . . . . . . . . . . . . . . . . 59
15 Opciones de configuración del proyecto . . . . . . . . . . . . . . . . . 59
16 Configuración del proyecto . . . . . . . . . . . . . . . . . . . . . . . . 60
17 Compilar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
18 Resultado de la compilación . . . . . . . . . . . . . . . . . . . . . . . 61
19 Entorno PICDOWNLOADER . . . . . . . . . . . . . . . . . . . . . . 62
20 Proceso de programación . . . . . . . . . . . . . . . . . . . . . . . . . 63
21 Sistema mı́nimo del microcontrolador PIC . . . . . . . . . . . . . . . 64
22 Terminal para comunicación serie . . . . . . . . . . . . . . . . . . . . 65
23 Configuración de la terminal . . . . . . . . . . . . . . . . . . . . . . . 66
24 Entorno de la hyperterminal . . . . . . . . . . . . . . . . . . . . . . . 67
Lista de Tablas
1 Control de motores de CD . . . . . . . . . . . . . . . . . . . . . . . . 49
vii
viii LISTA DE TABLAS
Introducción
Construirá el robot móvil que será utilizado durante el semestre, ası́ mismo
aprender a programar en lenguaje de alto nivel usando el compilador CCS para la
familia de microcontroladores PIC; conocerá y programará los periféricos más uti-
lizados en el control de robots móviles.
1
2
Práctica 1
Introducción general
1.1 Duración
Dos semanas
1.2 Introducción
Un robot móvil es un dispositivo que permite realizar tareas de manera autónoma,
que pueden variar su complejidad dependiendo de la aplicación que se quiera dar;
en general, un robot está compuesto básicamente de tres etapas:
1. Etapa mecánica
• Distribución diferencial
• Distribución tipo omnidireccional
• Distribución tipo bicicleta
• Distribución tipo triciclo
2. Etapa electrónica
• Microcontrolador
3
• Sensores
• Driver de poténcia
• Pilas
• Reguladores de voltaje
3. Software
1.3 Desarrollo
Para cada uno de los siguientes apartados, realizar los circuitos electrónicos y las
tareas que se piden.
1.3.1 Actividad 1
Leer detalladamente la información del apéndice A; construir el diagrama electrónico
para controlar dos motores de CD en una protoboard y colocarlo sobre la base del
robot.
4
1.3.2 Actividad 2
El direccionamiento por trayectoria guarda el estado siguiente y las salidas de cada
estado de una carta ASM en una localidad de memoria. La porción de la memo-
ria que indica el estado siguiente es llamada la liga, mientras que la porción que
indica las salidas es llamada la parte de las salidas, como se muestra en la figura 1.1.
Concatenando la liga del estado presente junto con las entradas se forma la di-
rección de memoria que contiene la dirección del estado siguiente. Esta dirección se
guarda en un registro que está concatenando a las lı́neas de dirección de la memoria,
como se muestra en la figura 1.1. La seal de reloj conectada a los registros es la que
indica la velocidad de la máquina de estados.
5
Figura 1.2: Robot móvil que evade obstáculos
6
En la figura 1.3 se muestra el algoritmo de un robot móvil que evade obstáculos,
cuando los sensores Si y Sd sensan un obstáculo son iguales a cero, en caso contrario
es uno.
1.3.3 Actividad 3
7
1.3.4 Actividad 4
Conecte la etapa de poténcia con las salidas de la máquina de estados.
1.3.5 Actividad 5
Pruebe el algoritmo que evade los obstáculos con el robot construı́do.
8
Práctica 2
2.1 Duración
Una semanas
2.2 Introducción
El sistema de desarrollo del microcontrolador PIC se representa en el figura 21 del
apéndice B; se distingue el circuito del sistema mı́nimo (fuente de reloj, sistema de
reset y el microcontrolador). Este se comunica al circuito convertidor RS232-TTL
(MAX232) a través de la USART interna, lo que permite enviar y recibir información
con formato serie ası́ncrono con una computadora personal.
2.3 Desarrollo
Realizar las siguientes actividades.
9
2.3.1 Actividad 1
Leer las notas anexas, que describen el uso del ambiente de desarrollo integrado
MPLAB y el PIC C COMPILER
2.3.2 Actividad 2
Usando el entorno de su elección (MPLAB o el PIC C Compiler), escribir el siguiente
programa en C y compilarlo.
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1F00, 0x1FFF void loader16F877(void){}
void main(){
int i,j;
char buffer[20];
float x;
i=0;
while(1) {
printf("\n\r type an integer ->");
gets(buffer);
j=atoi(buffer);
printf("\n\r type a float number ->");
gets(buffer);
x=atof(buffer);
printf("\n\r type a string ->");
gets(buffer);
printf("\n %d %d %f %s\n\r",i,j,x,buffer);
i++;
}
}
10
2.3.3 Actividad 3
Cargue este programa en la tarjeta de desarrollo del PIC usando el PICDOWN-
LOADER, como se indica en el anexo.
2.3.4 Actividad 4
Usando un programa de emulación de una terminal (hyperterminal) vea el texto que
envı́a el programa por el puerto serie e introduzca los datos que se piden.
2.3.5 Actividad 5
Escriba un programa en C que instrumente un contador; en el cuál se ingrese el valor
inicial, final y el incremento deseado; este último puede ser positivo o negativo.
11
12
Práctica 3
Objetivo: Emplear los puertos paralelos que tiene el microcontrolador PIC para
obtener datos de dispositivos externos y controlar la operación de dos motores de
corriente directa.
3.1 Duración
Dos semanas
3.2 Introducción
El microcontrolador PIC16F877 tiene 5 puertos paralelos, la tabla 3.1 indica la
disposición de ellos.
13
3.3 Desarrollo
Realizar las siguientes actividades.
3.3.1 Actividad 1
Empleando el puerto paralelo B del microcontrolador; realizar las acciones de control
indicadas por la tabla 2. Donde x es un dato que es ingresado a través de una
terminal externa hyperterminal.
3.3.2 Actividad 2
Empleando el puerto paralelo del microcontrolador, configurado como entrada; conec-
tar un dip-switch a este.
Modificar el siguiente programa, de tal forma que el dato actual del puerto A
sea transmitido a una terminal, además de ser mostrado en el puerto B.
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1F00, 0x1FFF void loader16F877(void){}
void main(){
int var1;
while(1) {
var1=input_a();
output_b(var1);
}
}
14
3.3.3 Actividad 3
De acuerdo a la asignación reservada para las señales de control de la etapa de
poténcia de los motores; realizar un programa que permita controlar el funcionamiento
y sentido de giro de estos por separado. La señal que indica el sentido de giro de
los motores se realiza por medio del puerto A y las seales de control al driver por el
puerto B; la tabla 3.3 presenta los requerimientos.
15
16
Práctica 4
4.1 Duración
Tres semanas
4.2 Desarrollo
Para cada uno de los siguientes apartados, realizar los diseños electrónicos y progra-
mas que se piden.
4.2.1 Actividad 1
Configurando el puerto A del PIC como entrada, conecte dos sensores de contacto a
dos pines de éste. Muestre el valor leı́do de los sensores en una hyperterminal cada
10 segundos.
17
SWIizquierdo SWDderecho Salida a la terminal
OFF OFF SWI ABIERTO SWD ABIERTO
OFF ON SWI ABIERTO SWD CERRADO
ON OFF SWI CERRADO SWD ABIERTO
ON ON SWI CERRADO SWD CERRADO
4.2.2 Actividad 2
Escriba una función en C que controle los movimientos de un robot móvil, en el se
indicará el ángulo en radianes que el robot primero girará y la distancia que después
avanzará. La función deberá tener el siguiente formato:
4.2.3 Actividad 3
Escriba una función en C que regrese el valor del sensor indicado. La función deberá
tener el siguiente formato:
float x;
return(x);
}
4.2.4 Actividad 4
Cargue el siguiente programa en C , este ejecuta el algoritmo de un robot móvil
que evade obstáculos, como el que se muestra en la figura 4.1, en su robot. En la
figura 4.2 se muestra el algoritmo de un robot móvil que evade obstáculos, cuando
18
los sensores de tacto Si y Sd sensan un obstáculo sus valores son igual a cero, en
caso contrario es uno.
19
Programa en C para un robot móvil que evade obstáculos.
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1F00, 0x1FFF void loader16F877(void){}
// Constantes
return(x);
}
20
strcpy(nombre_sensor,"contacto");
sensor = show_sensor(nombre_sensor, num_sensor);
return(valor_sensor);
}
void evade()
{
float AVANCE=10.;
int estado;
int Si, Sd;
char buffer[20];
// Estado inicial
estado = 0;
// Loop infinito
while(1)
{
printf("Estado presente: %d\n\r",estado);
// Acciones
switch ( estado )
{
case 0: // est0
// Lee sensores
Sd = lee_sensor(SENSOR_DER);
Si = lee_sensor(SENSOR_IZQ);
21
case 2: // est2
GIRO_IZQ;
break;
case 3: // est3
ATRAS;
break;
case 4: // est4
GIRO_DER;
break;
case 5: // est5
ATRAS;
break;
case 6: // est6
GIRO_IZQ;
break;
case 7: // est7
GIRO_IZQ;
break;
case 8: // est8
ADELANTE;
break;
case 9: // est9
ADELANTE;
break;
case 10: // est10
GIRO_DER;
break;
case 11: // est11
GIRO_DER;
break;
}
// Transiciones
switch ( estado )
{
case 0: if (Si == 0)
if (Sd == 0) estado = 0;
else estado = 1;
else
if (Sd == 0) estado = 3;
else estado = 5;
22
break;
case 1: estado= 2;
break;
case 2: estado = 0;
break;
case 3: estado = 4;
break;
case 4: estado = 0;
break;
case 5: estado = 6;
break;
case 6: estado = 7;
break;
case 7: estado = 8;
break;
case 8: estado = 9;
break;
case 9: estado = 10;
break;
case 10:estado = 11;
break;
case 11:estado = 0;
break;
}
}
}
void main(){
23
Figura 4.1: Robot móvil que evade obstáculos
24
Figura 4.2: Algoritmo de un robot móvil evasor de obstáculos
25
26
Práctica 5
Generación de Modulación de
Ancho de Pulso ”PWM”
5.1 Duración
Dos semanas
5.2 Introducción
Se genera una señal a un perı́odo constante y se modula el tiempo en alto de la
misma; con lo que se obtendrá un ciclo de trabajo variable, en respuesta a esta
acción el robot se podrá desplazar a diferentes velocidades.
Es usado el TIMER2 y los módulos CCP del microcontrolador PIC para fijar
la señal y controlar el PWM; el perı́odo está dado por (5.1):
donde Tosc int es el ciclo de máquina de procesador y es el inverso del reloj externo
dividido por cuatro; P R2 valor cargado en un registro interno de ocho bits y el
27
Figura 5.1: Modulación de ancho de pulso
f = 19.531KHz
T 2 DIV BY 1 indica el predivisor de uno, 255 el valor que tendrá PR2 y el número
28
10 es usado para generar peticiones de interrupción.
1
(5.2) TON = (V ALOR)( )(4)(P REDIV ISOR)
XT AL
1
(5.3) TON = (V ALOR)( )(P REDIV ISOR)
XT AL
5.3 Desarrollo
Para cada uno de los siguientes apartados, realizar los diseños electrónicos y progra-
mas que se piden.
5.3.1 Actividad 1
Busque en la ayuda del compilador CCS C información sobre las siguientes funciones
las cuales configuran pines del puerto C del PIC como salidas PWM:
setup_ccp1(CCP_PWM)
setup_ccp2(CCP_PWM)
set_pwm1_duty(duty)
set_pwm2_duty(duty)
29
5.3.2 Actividad 2
Tomando como base el programa en C que se muestra a continuación, controle
la velocidad de los motores del robot móvil que se ha construido en las prácticas
anteriores. Conecte las lı́neas de la etapa de poténcia que controlan los motores
izquierdo y derecho a los pines 1 y 2 del puerto C los cuáles generan las salidas
PWM.
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200,xmit=PIN_C6, rcv=PIN_C7)
#org 0x1F00, 0x1FFF
void loader16F877(void){}
// Inicializa puertos
inicializa_puertos(){
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
}
// Inicializa interrupciones
inicializa_temporizadores(){
mv(long duty){
30
// Se indica la direccion de movimiento de las llantas
output_d(0x0a);
// Programa principal
void main(){
char linea[20];
long duty;
// Loop infinito
while(TRUE){
}
}
31
32
Práctica 6
Temporizadores
6.1 Duración
Dos semanas
6.2 Introducción
6.2.1 Encoders
La lectura de los pulsos se realiza con las funciones del TIMER0 y TIMER1; estos
temporizadores pueden se configurados como temporizadores o como acumuladores
de eventos externos; en esta La lectura de los pulsos se realiza con las funciones
del TIMER0 y TIMER1; estos temporizadores pueden se configurados como tem-
porizadores o como acumuladores de eventos externos; en estaúltima modalidad, la
información que generan los encoders permitirán conocer la velocidad de rotación
de los motores. Con el valor de los encoders y el radio de la llanta servirán para
estimar la distancia recorrida por el robot y la velocidad angular de las llantas.
33
Figura 6.1: Captura de pulsos
y para el derecho:
34
Cuando el valor del registro TMR2 sea igual a PR2 entonces se genera una
comparación exitosa; cuando se han cumplido la cantidad de comparaciones indi-
cadas en el POSTESCALADOR, entonces se genera una solicitud de interrupción.
Para configurar el perı́odo de interrupción se usa la función:
6.3 Desarrollo
Para cada uno de los siguientes apartados, realizar los diseños electrónicos y progra-
mas que se piden.
6.3.1 Actividad 1
1. Busque en la ayuda del compilador CCS C información sobre las siguientes
funciones de los temporizadores:
setup_timer_0()
setup_timer_1()
setup_timer_2()
enable_interrupts()
6.3.2 Actividad 2
Tomando como base el programa en C que se encuentra en el programa 1 varı́e los
tiempos en los cuales ocurren las interrupciones de los temporizadores.
Programa 1
35
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT #use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1f00, 0x1FFF
void loader16F877(void){}
set_timer0(0x00);
i++;
if(i>1024){
j++;
printf("T0 %ld\n\r",j);
i=0;
if(j>100)j=0;
}
set_timer1(0xF000);
i++;
if(i>1024){
j++;
printf("T1 %ld\n\r",j);
i=0;
if(j>100)j=0;
}
36
}
i++;
if(i>4096){
j++;
printf("T2 %ld\n\r",j);
i=0;
if(j>100)j=0;
}
// Inicializa interrupciones
incializa_interrupciones(){
enable_interrupts(GLOBAL);
void main() {
incializa_interrupciones();
37
while(TRUE);
6.3.3 Actividad 3
Coloque a un lado de las llantas un fondo negro y lı́neas blancas para detectar cuanto
han girado usando sensores infrarrojos, como se muestran en la figura 6.1. Conecte
estos encodificadores a las pines C0 y A4 del PIC. Programe los temporizadores T0
y T1 con contador de eventos externos dados por las lı́neas de los encodificadores. El
programa 2 captura los pulsos detectados en las transiciones de los encoders usando
interrupciones.
Programa 2
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
38
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1F00, 0x1FFF void loader16F877(void){}
// Definicion de Constantes
#define NUM_PULSES_0 0xFF
#define NUM_PULSES_1 0xFFFF
//Variables Globales
static long CntRight=0,CntLeft=0;
CntLeft++;
printf("T0 %x\n\r",CntLeft);
set_timer0(NUM_PULSES_0);
CntRight++;
printf("T1 %ld\n\r",CntRight);
set_timer1(NUM_PULSES_1);
// Inicializa interrupciones
inicializa_interrupciones(){
set_timer1(NUM_PULSES_1);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
39
enable_interrupts(INT_TIMER1);
set_timer0(NUM_PULSES_0);
setup_timer_0(RTCC_DIV_1|RTCC_EXT_L_TO_H);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
void main(){
inicializa_interrupciones();
while(TRUE);
6.3.4 Actividad 4
Utilice el temporizador T2 para mostrar los contadores de los temporizadores T0 y
T1; como se muestra en el programa 3.
Programa 3
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1FFF, 0x1FFF void loader16F877(void){}
// Definicion de Constantes
#define NUM_TIMES_T2 256
#define NUM_SECOND 14
40
// Esta interrupcion es llamada en forma automatica por el TIMER2.
#INT_TIMER2
void wave_timer2() {
static long k=0,l=0,m=0;
long i,j;
k++;
i=get_timer0();
j=get_timer1();
if(k>NUM_TIMES_T2){
set_timer0(0);
set_timer1(0);
k=0;
l++;
if(l>NUM_SECOND){
printf("T2 Temp. %ld motor Iz. %lu De. %lu\n\r",m,i,j);
l=0;
m++;
}
/* Inicializa interrupciones*/
incializa_interrupciones(){
set_timer1(0);
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
set_timer0(0);
setup_timer_0(RTCC_DIV_1|RTCC_EXT_L_TO_H);
enable_interrupts(GLOBAL);
41
// Programa Principal
void main(){
char linea[20];
long duty;
incializa_interrupciones();
while(TRUE);
}
42
Práctica 7
Controlador PID
Objetivo: Controlar la velocidad de los dos motores del robot construido en las
practicas anteriores usando un controlador PID
7.1 Duración
Dos semanas
7.2 Desarrollo
Realizar la actividad indicada.
7.2.1 Actividad 1
1. 1. Tomando como base el siguiente programa, varié las constantes Kp, Ki y
Kd del controlador PID y modifique el código, si es necesario, para controlar las
velocidades de los motores de su robot.
/********************************************
* robot_pid.c *
* *
* v. 1.0 *
* *
43
* Este programa controla la *
* velocidad de dos motores *
* usando un control PID *
* *
* Jesus Savage *
* Ruben Anaya *
* Carlos Munive *
* *
* FI-UNAM, Nov-2007 *
* *
*********************************************/
// Definiciones PIC
#include <16f877.h>
#device ADC=8
#include <stdlib.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1FFF, 0x1FFF void loader16F877(void){}
// Definicion de Constantes
#define CNT_T2 3
#define NUM_TIMES_T2 64*CNT_T2
#define NUM_SECOND 80/CNT_T2
#define SIZE_DATA 50
#define ADELANTE 0x0a
44
#define Kcd4 Kcd*1.6
#define Kcd5 Kcd*1.2
//Variables Globales
long CntRight=0,CntLeft=0;
int flag=0;
long wi=0,wd=0;
float fCntRight,fCntLeft;
// Control PID
mv_pid(){
long rni=0,rnd=0;
float frni=0.0,frnd=0.0;
float ewi=0,ewd=0;
static float prev_rni=0,prev_rnd=0,prev_ewi=0,prev_ewd=0;
static float prev2_ewi=0,prev2_ewd=0;
float cntder,cntizq;
if(wi<=62)cntizq=wi*Kci1;
else if(wi<125)cntizq=wi*Kci2;
else if(wi<250)cntizq=wi*Kci3;
else if(wi<350)cntizq=wi*Kci4;
else cntizq=wi*Kci5;
cntizq=cntizq/1024.0;
cntder=cntder/1024.0;
// Calcula el error
ewd=cntder-fCntRight;
45
ewi=cntizq-fCntLeft;
k++;
if(k>NUM_TIMES_T2){
k=0;
CntLeft=get_timer0();
CntRight=get_timer1();
fCntRight=CntRight/1024.0;
fCntLeft=CntLeft/1024.0;
46
// Muestra los datos
if(flag==1){
i++;
if(i > SIZE_DATA)flag=0;
printf("%f %f\n\r",fCntLeft,fCntRight);
}
else i=0;
// Ejecuta el algoritmo de control PID
mv_pid();
// Inicializan los contadores de los temporizadores de nuevo
set_timer0(0);
set_timer1(0);
}
}
/* Inicializa puertos */
inicializa_puertos(){
// Se inicializan los pines para generar los pwms
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
// Se indica la dirrecion de los motores
output_d(ADELANTE);
}
/* Programa principal */
void main(){
47
char linea[5];
inicializa_interrupciones();
inicializa_puertos();
while(TRUE){
// lee las velocidades de los motores
gets(linea);
wi=atol(linea);
flag=1;
gets(linea);
wd=atol(linea);
flag=1;
}
}
48
Apendice A
Terminal Función
16 Alimentación al circuito 5 volts
8 Alimentación independiente al motor (0V a 32 V)
3, 4, 12, 13 0 Volts
2, 7, 10, 15 Control de dirección de los motores
3, 6, 11, 14 Salida a motores
2, 9 Habilitadores
49
Figura 1: Terminales L293
50
Figura 2: Control con tres señales
51
Figura 4: Uso de optoacopladores
52
Apendice B
Compilador CCS
El compilador CCS permite programar los algoritmos empleando programación en
lenguaje C, es posible la implantación de estos usando el entorno de desarrollo
integrado del PIC C Compiler o el IDE del MPLAB. Se recomienda consultar la
ayuda del compilador para conocer las funciones especı́ficas que vienen integradas
en este.
53
Una véz terminado el programa, se debe seleccionar la opción Microchip 14
bits, para configurar las versiones compatibles con los PIC16F877; una vez hecho
esto se procede a compilar; tal como se muestra en la figura 6.
Figura 6: Compilación
54
Figura 7: Ventana de estado
MPLAB
Usar este entorno para compilar programas escritos en C, requiere un proceso más
largo; se necesita crear un proyecto, agregar un programa fuente a este y compilar,
de igual manera generará un programa*.HEX.
55
Figura 8: Entorno MPLAB
56
Comprobar la ubicación del compilador; nuevamente seleccionar project, set
languaje T ool locations, ubicar el compilador Ccsc.exe; tal como se indica en la
figura 10.
57
Para crear un proyecto nuevo, en el menú P roject seleccionar new; indicar el
nombre y la ubicación del proyecto (figura 12).
58
El programa recién creado se deberá agregar al proyecto, siguiendo el pro-
cedimiento de la figura 14.
59
Deshabilitar la opción Symbol F ile en Others F iles y habilitar N one en debug
(figura 16).
60
En caso de no existir error, mostrará la pantalla de la figura 18. Se tendrá
entonces el código de máquina requerido para programar al microcontrolador.
61
PICDOWNLOADER
Una véz generado el código *.HEX, se programará en el PIC, este proceso se podrá
hacer utilizando un programador externo (hardware) o un pequeño código que se
programa previamente al microcontrolador llamado Bootloader y que permitirá por
software la programación del mismo.
62
Figura 20: Proceso de programación
63
Sistema mı́nimo
64
Hyperterminal
Para establecer esta terminal debe de acceder a P rogramas, accesorios y comunicaciones
para ubicar a la terminal; la primer pantalla que presenta, es para ingresar el nombre
de la conexión (figura 22); posteriormente solicitará el número de COM donde se
este conectando.
65
Figura 23: Configuración de la terminal
66
Una véz que se ha tecleado aplicar y posteriormente aceptar, se tendrá abierta
la terminal para la comunicación serie ası́ncrona entre una computadora personal y
el microcontrolador. Tal véz requiera presionar el botón de reset a procesador para
reiniciar el programa; en caso de requerir reprogramar al procesador mediante el
bootloader, deberá desconectarse de la hyperterminal para liberar el puerto.
67