capitulo 8

Anuncio
Diseño e implementación de un equipo de prácticas
de control automático
7
Resumen de costes
PRECIOS CONSULTADOS EN EL DISTRIBUIDOR FARNELL.COM
MICROCONTROLADORES…………………………………………………12€
PLACAS PCB………………………………………………………………….20€
CAJA ALUMINIO………………………………………………………….......11€
DISCO DE INERCIA……………………………………………………………6€
PANTALLA GLCD……………………………………………………………..11€
ELEMENTOS PASIVOS (RESISTENCIA, CONDENSADOR,
PULSADORES, CONECTORES ETC.)…………………………………….35€
MOTOR MAXON REDUCTOR (ENGRANAJE)……………………………90€
VARIOS………………………………………………………………………...15€
TOTAL…………………………………………………………………………200€
22/06/2011
Alejandro Quintero García
Página 155 de 214
Diseño e implementación de un equipo de prácticas
de control automático
8
8.1
Anexos
Especificaciones del motor Maxon.
22/06/2011
Alejandro Quintero García
Página 156 de 214
Diseño e implementación de un equipo de prácticas
de control automático
8.2
Código del microcontrolador principal.
////////////////////////////////////////////////////////////////////////////////
////
////
////
FIRMWARE DEL PIC18F4550 PARA LA PLACA PROTOTIPO DEL PFC
////
////
////
////
Modificado por Alejandro Quintero García '11
////
////
////
////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
////////////////////////////////////////////////////////////////////////////////
//
HABILITACION DE PRIORIDAD DE INTERRUPCIONES
//
////////////////////////////////////////////////////////////////////////////////
#DEVICE HIGH_INTS=TRUE
#fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,HSPLL,VREGEN
#use delay(clock=48M)
#use rs232(baud=38000,xmit=pin_c6,rcv=pin_c7)
////////////////////////////////////////////////////////////////////////////////
//
CONFIGURACION DE LAS LIBRERIAS DINAMICAS DE CCS COMPILER
//
////////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE
#define
FALSE
USB_EP1_TX_ENABLE
// Deshabilitamos el uso de las directivas HID
USB_ENABLE_BULK
//
USB_ENABLE_BULK
//
HABILITAR
EP1(EndPoint1)
EN
MODO
IN
PARA
OUT
PARA
TRANSFERENCIAS bulk/interrupt
#define
USB_EP1_RX_ENABLE
HABILITAR
EP1(EndPoint1)
EN
MODO
TRANSFERENCIAS bulk/interrupt
#define USB_EP1_TX_SIZE
32
// TAMAÑO DEL BUFFER TX endpoint 1
#define USB_EP1_RX_SIZE
32
// TAMAÑO DEL BUFFER RX endpoint 1
////////////////////////////////////////////////////////////////////////////////
//
INTRODUCCION DE LAS LIBRERIAS DINAMICAS DE CCS COMPILER
//
////////////////////////////////////////////////////////////////////////////////
#include "math.h"
#include "float.h"
#include "stdlib.h"
#include
"C:\Documents
and
Settings\yomismo\Escritorio\CODIGO
PARA
EL
PIC\include\configurar_el_usb_2.h"
// NOTA:El archivo configurar_el_usb_2.h es la union de las librerias
// proporcionadas por CCS para la configuracion de la comunicacion USB
22/06/2011
Alejandro Quintero García
Página 157 de 214
Diseño e implementación de un equipo de prácticas
de control automático
// en los micros PIC.Se las ha unificado eliminando un poco su generalidad
// con objeto de simplificar un poco la libreria eliminando ademas las partes
// innecesarias.
////////////////////////////////////////////////////////////////////////////////
//
CREACIÓN DE ALIAS
//
////////////////////////////////////////////////////////////////////////////////
#define ACTIVAR_FRENO
output_high(PIN_D6)
#define DESACTIVAR_FRENO
output_low(PIN_D6)
#define ACTIVAR_DIR_HORARIA
output_high(PIN_D7)
#define ACTIVAR_DIR_ANTIHORARIA
output_low(PIN_D7)
#define LIBRE_UC
output_high(PIN_B0)
#define OCUPADO_UC
output_low(PIN_B0)
#define ENABLE_CANAL_A
output_high(PIN_D3)
#define DISABLE_CANAL_A
output_low(PIN_D3)
#DEFINE LED0
PIN_B0
#DEFINE LED1
PIN_B6
#DEFINE LED2
PIN_B7
#define Enciende
Output_High
#define Apaga
Output_Low
#define Conmuta
Output_Toggle
#define MOTOR
set_pwm1_duty
#define LISTO
0
//CONTROLADOR ESPERANDO INSTRUCCION
#define DAR_TM
1
//ESTABLECE EL FUNCIONAMIENTO EN BA
#define SETBC
2
//ESTABLECE EL FUNCIONAMIENTO EN BC
#define SETTM
3
//INTRODUCE EL TIEMPO DE MUESTREO
#DEFINE SETPIDKC
4
//INTRODUCE EL VALOR KC (BC)
#DEFINE SETPIDTI
5
//INTRODUCE EL VALOR TI (BC)
#DEFINE SETPIDTD
6
//INTRODUCE EL VALOR TD (BC)
#DEFINE LEEPOS
7
//DEVUELVE LA POSICION DEL MOTOR
#DEFINE ESCTENSION
8
//INTRODUCE UN VALOR DE PWM (0-150)
#DEFINE LEEVEL
9
//DEVUELVE LA VELOCIDAD ACTUAL DEL MOTOR
#DEFINE RESETEO_TOTAL
10 //RESETEA TIEMPO Y POSICION
#define ESCREF
11 //INTRODUCE EL VALOR DE REFERENCIA (BC)
#define AJ_RELOJ
12 //AJUSTA EL TIMER 0
22/06/2011
Alejandro Quintero García
Página 158 de 214
Diseño e implementación de un equipo de prácticas
de control automático
#define STATUS_TIMERS
13 //DEVUELVE TESP Y EL MULTIPLICADOR ENCOD.
#define ST_ERR_CONTROL
14 //DEVUELVE EL VALOR DE LOS ERRORES DEL AJUSTE.
#define DAR_PWM
15 //DEVUELVE EL VALOR ACTUAL DEL PWM
#DEFINE DAR_REF_POS
16 //DEVUELVE EL VALOR ACTUAL DE LA REFERENCIA.
#define BUFFER_INIT
17 //INICIALIZA LOS BUFFERES
#define AJ_TIMER3
18 //AJUSTA EL TIMER3 DESDE MATLAB
#define ERROR_POS
19 //INTRODUCE EL ERROR EN POSICION (BC)
#define FRENO
20 //ACTIVA O DESACTIVA EL FRENO.
#define AJ_ENCODER
21 //AJUSTA LOS MULTIPLICADORES DEL ENC.
#DEFINE CONF_INT_TIMER0
22 //ACTIVA O DESACTIVA LA INT_RTCC
#DEFINE BUFFER_INIT_GEN
23 //INICIALIZA EL BUFFER GENERICO
#DEFINE CONF_INT_TIMER3
24 //ACTIVA O DESACTIVA LA INT_TIMER3
#DEFINE CONF_INT_CCP2
25 //ACTIVA O DESACTIVA LA INT_CCP2
#DEFINE RESETEO_RELOJ
26 //RESETEA EL RELOJ
#DEFINE RESETEO_CONT_POS
27 //RESETEA LA POSICION
#DEFINE TM_POR_PUNTO
28 //ESTABLECE LOS TM POR PUNTO ALMACENADO.
#define DAR_ERR_POS
29 //DEVUELVE EL VALOR ACTUAL DEL ERROR.
#define DAR_ITER_MAX
30 //DEVUELVE EL NUMERO DE ITERACIONES MAXIMAS.
#define ACTIVA_INT_GLOBAL
31 //ACTIVA INTERRUPCIONES
#DEFINE DESACTIVA_INT_GLOBAL
32 //DESACTIVA INTERRRUPCIONES
#DEFINE DAR_RES_ITER
33 //DEVUELVE EL NUMERO DE ITERACIONES DEL ULT.AJUSTE.
#define ESTATUS_PID
34 //DEVUELVE LOS VALORES DEL PID
#define RECUPERA_M
35 //DEVUELVE UN BLOQUE DE MEMORIA
#define EST_CONTROL
36 //DEVUELVE LOS ULT. VALORES DE POS DEL AJUSTE.
const int8 Lenbuf = 15;
////////////////////////////////////////////////////////////////////////////////
//
RAM
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
VARIABLES COMANDO
//
////////////////////////////////////////////////////////////////////////////////
INT COMANDO;
INT COMANDO_S;
////////////////////////////////////////////////////////////////////////////////
//
VARIABLES DEL ENCODER
//
////////////////////////////////////////////////////////////////////////////////
UNSIGNED int32 LH;
unsigned int16 ENCount1;
//contador de posiciones.
unsigned int32 ENCount2;
//contador de vueltas.
22/06/2011
Alejandro Quintero García
Página 159 de 214
Diseño e implementación de un equipo de prácticas
de control automático
////////////////////////////////////////////////////////////////////////////////
//
VARIABLES DE TIEMPO
//
////////////////////////////////////////////////////////////////////////////////
unsigned int32 time;
unsigned int16 valorT3;
unsigned int16 valorT0;
////////////////////////////////////////////////////////////////////////////////
//
VARIABLES DE CONTROL
//
////////////////////////////////////////////////////////////////////////////////
unsigned int32 REFPOS;
unsigned int32 ERRPOS;
unsigned long TM;
unsigned int iter_max;
unsigned int iter_count;
unsigned int32 POS1_TM;
unsigned int32 POS2_TM;
unsigned int32 POSG_TM;
unsigned int32 ERRPOS_TM_P;
signed int32 ERRPOS_TM_k;
signed int32 ERRPOS_TM_k_1;
signed int32 ERRPOS_TM_k_2;
unsigned int32 REFPOS_TM;
unsigned int32 RES_iter;
unsigned int32 RES_POS;
unsigned int32 RES_ek;
unsigned int32 RES_ek_1;
unsigned int32 RES_ek_2;
unsigned int32 RES_PWM;
unsigned int32 RES_iter_max;
unsigned int32 KCd;
unsigned int32 KCn;
unsigned int32 TDd;
unsigned int32 TDn;
unsigned int32 TId;
unsigned int32 TIn;
22/06/2011
Alejandro Quintero García
Página 160 de 214
Diseño e implementación de un equipo de prácticas
de control automático
float q0;
float q1;
float q2;
float uk;
float uk_1;
////////////////////////////////////////////////////////////////////////////////
//
VARIABLES DE ESTADO DEL MOTOR
//
////////////////////////////////////////////////////////////////////////////////
char MOVING;
// A,H,P
char MOVING_ANT;
unsigned int PWM;
////////////////////////////////////////////////////////////////////////////////
//
VARIABLES DE ACTIVACION DEL ENCODER
//
////////////////////////////////////////////////////////////////////////////////
int8 active;
int8 active2;
int8 CTRL_POS;
int8 encoder_mul;
unsigned int16 PULSOS_VUELTA;
////////////////////////////////////////////////////////////////////////////////
//
VARIABLE DEL BUFFER
//
////////////////////////////////////////////////////////////////////////////////
int
i;
unsigned int8 envia_pak_GEN;
char recbuf[Lenbuf]="000000000000";
int PACKET_ACTIVE;
int TMPPA;
unsigned int32 MEMORIA[161];
unsigned int BUFFER_GEN[32];
unsigned int32 varG32_1;
unsigned int32 varG32_2;
unsigned int32 varG32_3;
unsigned int32 varG32_4;
unsigned int16 varG16_1;
unsigned int16 varG16_2;
unsigned int8
varG8_1;
unsigned int bloque_m;
22/06/2011
Alejandro Quintero García
Página 161 de 214
Diseño e implementación de un equipo de prácticas
de control automático
////////////////////////////////////////////////////////////////////////////////
//
INTERRUPCION DEL CAPTURADOR 2
//
////////////////////////////////////////////////////////////////////////////////
#int_ccp2 HIGH
void isr(){
if (active==1) {LH=LH+1;}
else {LH=0;}
if (active2==1) {if (MOVING=='H'){ENCount1++;
if (ENCount1==PULSOS_VUELTA) {ENCount1=0;
ENCount2++;} }
if (MOVING=='A'){ENCount1--;
if (ENCount1==0) {ENCount1=PULSOS_VUELTA;
ENCount2--;} }}
}
////////////////////////////////////////////////////////////////////////////////
//
INTERRUPCION DEL TEMPORIZADOR 0
//
////////////////////////////////////////////////////////////////////////////////
#int_rtcc HIGH
void clock_isr() {
set_rtcc(valorT0);++time;
//750
}
////////////////////////////////////////////////////////////////////////////////
//
RUTINAS DE ALMACENADO DE DATOS EN LOS BUFFERS
1/1.5/2us
//
////////////////////////////////////////////////////////////////////////////////
void almacena_BUFFER(unsigned int32 dato)
{
int ocupacion;
ocupacion=BUFFER_GEN[2];
if (ocupacion==0) {
BUFFER_GEN[4]=dato;
dato=dato>>8;
BUFFER_GEN[5]=dato;
dato=dato>>8;
BUFFER_GEN[6]=dato;
22/06/2011
Alejandro Quintero García
Página 162 de 214
Diseño e implementación de un equipo de prácticas
de control automático
dato=dato>>8;
BUFFER_GEN[7]=dato;
BUFFER_GEN[2]=1;
}
if (ocupacion==1) {
BUFFER_GEN[8]=dato;
dato=dato>>8;
BUFFER_GEN[9]=dato;
dato=dato>>8;
BUFFER_GEN[10]=dato;
dato=dato>>8;
BUFFER_GEN[11]=dato;
BUFFER_GEN[2]=2;
}
if (ocupacion==2) {
BUFFER_GEN[12]=dato;
dato=dato>>8;
BUFFER_GEN[13]=dato;
dato=dato>>8;
BUFFER_GEN[14]=dato;
dato=dato>>8;
BUFFER_GEN[15]=dato;
BUFFER_GEN[2]=3;
}
if (ocupacion==3) {
BUFFER_GEN[16]=dato;
dato=dato>>8;
BUFFER_GEN[17]=dato;
dato=dato>>8;
BUFFER_GEN[18]=dato;
dato=dato>>8;
BUFFER_GEN[19]=dato;
BUFFER_GEN[2]=4;
}
if (ocupacion==4) {
BUFFER_GEN[20]=dato;
dato=dato>>8;
BUFFER_GEN[21]=dato;
dato=dato>>8;
BUFFER_GEN[22]=dato;
dato=dato>>8;
BUFFER_GEN[23]=dato;
BUFFER_GEN[2]=5;
}
if (ocupacion==5) {
22/06/2011
Alejandro Quintero García
Página 163 de 214
Diseño e implementación de un equipo de prácticas
de control automático
BUFFER_GEN[24]=dato;
dato=dato>>8;
BUFFER_GEN[25]=dato;
dato=dato>>8;
BUFFER_GEN[26]=dato;
dato=dato>>8;
BUFFER_GEN[27]=dato;
BUFFER_GEN[2]=6;
}
if (ocupacion==6) {
BUFFER_GEN[28]=dato;
dato=dato>>8;
BUFFER_GEN[29]=dato;
dato=dato>>8;
BUFFER_GEN[30]=dato;
dato=dato>>8;
BUFFER_GEN[31]=dato;
BUFFER_GEN[2]=7;
envia_pak_GEN=1;
}
}
void envia_paquete(int last,int instr)
//3us + T.envio USB
{
if (instr>=1){BUFFER_GEN[0]=4;
if (last==1) {BUFFER_GEN[1]=1;}
if (last==0) {BUFFER_GEN[1]=0;}
BUFFER_GEN[3]=instr;
usb_put_packet(1,BUFFER_GEN,32,USB_DTS_TOGGLE);
BUFFER_GEN[2]=0;
envia_pak_GEN=0;}
}
void almacena_punto(unsigned int32 dato,int INSTR)
{
int oc;
if (INSTR>1){oc=MEMORIA[0];
oc++;
if (oc<=160){MEMORIA[oc]=dato;MEMORIA[0]=oc;}}
}
22/06/2011
Alejandro Quintero García
Página 164 de 214
Diseño e implementación de un equipo de prácticas
de control automático
void Reset_MEMORIA()
//1us
{
int x;
MEMORIA[0]=0;
for (x=1;x<=160;x++){
MEMORIA[x]=0;
}
}
void envia_bloque()
{
int i;
int j;
int z;
if (bloque_m<23){z=((bloque_m-1)*7)+1;
j=z+6;
for (i=z;i<=j;i++){almacena_BUFFER(MEMORIA[z]);}
envia_paquete(1,COMANDO);}
if (bloque_m==23){z=((bloque_m-1)*7)+1;
j=z+5;
for (i=z;i<=j;i++){almacena_BUFFER(MEMORIA[z]);}
envia_paquete(1,COMANDO);}
}
void inicializa_buffer_gen()
{
int x;
BUFFER_GEN[0]=4;
BUFFER_GEN[1]=1;
BUFFER_GEN[2]=0;
BUFFER_GEN[3]=0;
for (x=4;x<=31;x++){
BUFFER_GEN[x]=0;
}
envia_pak_GEN=0;
}
////////////////////////////////////////////////////////////////////////////////
//
INTERRUPCION DEL TEMPORIZADOR 3
////////////////////////////////////////////////////////////////////////////////
22/06/2011
Alejandro Quintero García
Página 165 de 214
Diseño e implementación de un equipo de prácticas
de control automático
/*#int_timer3
// Esta interrrupcion no se empleara en principicio.
void wave_timer() {
set_timer3(valorT3);
}*/
////////////////////////////////////////////////////////////////////////////////
//
RUTINA DE ESPERA TIEMPO DE MUESTREO
////////////////////////////////////////////////////////////////////////////////
void inicializa_vBC(int j)
{
if (j==1){
RES_iter=0;
RES_POS=0;
RES_ek=0;
RES_ek_1=0;
RES_ek_2=0;
RES_PWM=0;
RES_iter_max=0;
}
if (j==2){
POSG_TM=0;
ERRPOS_TM_P=0;
ERRPOS_TM_k=0;
ERRPOS_TM_k_1=0;
ERRPOS_TM_k_2=0;
REFPOS_TM=0;
iter_max=0;
iter_count=0;
}
}
unsigned int32 esperaTM()
{
unsigned int32 pulsos;
unsigned int32 time1;
unsigned int32 time2;
time1=time;
active=1;
time2=time1+TM;
22/06/2011
Alejandro Quintero García
Página 166 de 214
Diseño e implementación de un equipo de prácticas
de control automático
do{
pulsos=LH;
}while(time<=time2);
active=0;
return(pulsos);
}
void esperaTM_POS(int y)
{
unsigned int32 time1;
unsigned int32 time2;
int i;
time1=time;
time2=time1+TM;
i=0;
do{
if (i==0){POS1_TM=ENCount1;
POS2_TM=ENCount2;
POS1_TM=POS1_TM*360;
POS1_TM=POS1_TM/PULSOS_VUELTA;
POS2_TM=POS2_TM*360;
POSG_TM=POS1_TM+POS2_TM;
if (y==1){almacena_punto(POSG_TM,COMANDO);}
ERRPOS_TM_k_2=ERRPOS_TM_k_1;
ERRPOS_TM_k_1=ERRPOS_TM_k;
if (REFPOS>POSG_TM){ERRPOS_TM_k =REFPOS_TM-POSG_TM;}
uk=uk_1+q0*ERRPOS_TM_k+q1*ERRPOS_TM_k_1+q2*ERRPOS_TM_k_2;
uk_1=uk;}
i++;
if (i==250){i=1;}
}while(time<=time2);
}
////////////////////////////////////////////////////////////////////////////////
//
RUTINA DE ESPERA
////////////////////////////////////////////////////////////////////////////////
22/06/2011
Alejandro Quintero García
Página 167 de 214
Diseño e implementación de un equipo de prácticas
de control automático
/*void espera()
{
unsigned int32 time1;
time1=time+TM;
do{
}while(time<=time1);
}
*/
////////////////////////////////////////////////////////////////////////////////
//
RUTINAS DE CONVERSION
////////////////////////////////////////////////////////////////////////////////
int convert(char k)
{
if (k=='0') {return (0);}
if (k=='1') {return (1);}
if (k=='2') {return (2);}
if (k=='3') {return (3);}
if (k=='4') {return (4);}
if (k=='5') {return (5);}
if (k=='6') {return (6);}
if (k=='7') {return (7);}
if (k=='8') {return (8);}
if (k=='9') {return (9);}
}
char desconvert(int k)
{
if (k==0) {return ('0');}
if (k==1) {return ('1');}
if (k==2) {return ('2');}
if (k==3) {return ('3');}
if (k==4) {return ('4');}
if (k==5) {return ('5');}
if (k==6) {return ('6');}
if (k==7) {return ('7');}
if (k==8) {return ('8');}
if (k==9) {return ('9');}
}
////////////////////////////////////////////////////////////////////////////////
//
RUTINAS DEL CALCULO DE VELOCIDAD
22/06/2011
Alejandro Quintero García
Página 168 de 214
Diseño e implementación de un equipo de prácticas
de control automático
////////////////////////////////////////////////////////////////////////////////
long encoder_pulsos_bc()
{
long RPM;
active=1;
//esperaTM();
active=0;
RPM=LH;
return(RPM);
}
////////////////////////////////////////////////////////////////////////////////
//
DESEMPAQUETADO DE LOS DATOS RECIBIDOS
////////////////////////////////////////////////////////////////////////////////
void decodificar()
{
INT dec;
INT UNIDAD;
unsigned int32 aux;
unsigned int32 cant1;
unsigned int32 cant2;
unsigned int32 cant3;
unsigned int32 cant4;
unsigned int32 cant5;
unsigned int32 cant6;
unsigned int32 cant7;
unsigned int32 cant8;
unsigned int32 cant9;
unsigned int32 cant10;
UNIDAD=convert(recbuf[2]);
DEC=convert(recbuf[1]);
COMANDO=DEC*10+UNIDAD;
COMANDO_S=convert(recbuf[3]);
if (recbuf[0]=='L'){
cant1=convert(recbuf[4]);
cant2=convert(recbuf[5]);
cant3=convert(recbuf[6]);
cant4=convert(recbuf[7]);
cant5=convert(recbuf[8]);
cant6=convert(recbuf[9]);
22/06/2011
Alejandro Quintero García
Página 169 de 214
Diseño e implementación de un equipo de prácticas
de control automático
cant7=convert(recbuf[10]);
cant8=convert(recbuf[11]);
cant9=convert(recbuf[12]);
cant10=convert(recbuf[13]);
aux=(cant1*1000000000)+(cant2*100000000);
aux=aux+(cant3*10000000)+(cant4*1000000);
aux=aux+(cant5*100000)+(cant6*10000);
aux=aux+(cant7*1000)+(cant8*100);
aux=aux+(cant9*10)+(cant10);
varG32_1=aux;
}
if (recbuf[0]=='C'){
cant6=convert(recbuf[9]);
cant7=convert(recbuf[10]);
cant8=convert(recbuf[11]);
cant9=convert(recbuf[12]);
cant10=convert(recbuf[13]);
aux=(cant6*10000)+(cant7*1000)+(cant8*100);
aux=aux+(cant9*10)+(cant10);
varG16_1=aux;
}
if (recbuf[0]=='X'){
cant8=convert(recbuf[11]);
cant9=convert(recbuf[12]);
cant10=convert(recbuf[13]);
aux=(cant8*100)+(cant9*10)+(cant10);
varG8_1=aux;
}
if (recbuf[0]=='T'){
cant6=convert(recbuf[9]);
cant7=convert(recbuf[10]);
cant8=convert(recbuf[11]);
cant9=convert(recbuf[12]);
cant10=convert(recbuf[13]);
aux=(cant6*10000)+(cant7*1000)+(cant8*100);
aux=aux+(cant9*10)+(cant10);
varG16_1=aux;
cant6=convert(recbuf[4]);
cant7=convert(recbuf[5]);
cant8=convert(recbuf[6]);
cant9=convert(recbuf[7]);
cant10=convert(recbuf[8]);
aux=(cant6*10000)+(cant7*1000)+(cant8*100);
aux=aux+(cant9*10)+(cant10);
22/06/2011
Alejandro Quintero García
Página 170 de 214
Diseño e implementación de un equipo de prácticas
de control automático
varG16_2=aux;
}
}
////////////////////////////////////////////////////////////////////////////////
//
RUTINA DE DIRECCION
////////////////////////////////////////////////////////////////////////////////
void cambia_direccion()
{
char C;
if (MOVING=='A') {C='H';}
if (MOVING=='H') {C='A';}
switch (C){
case 'A':ACTIVAR_FRENO;
ACTIVAR_DIR_ANTIHORARIA;
DESACTIVAR_FRENO;
MOVING='A';
case 'H':ACTIVAR_FRENO;
ACTIVAR_DIR_HORARIA;
DESACTIVAR_FRENO;
MOVING='H';
}
}
void direccion(char C)
{
switch (C){
case 'A':if (C=='A'){if (MOVING=='H'){ACTIVAR_FRENO;
ACTIVAR_DIR_ANTIHORARIA;
DESACTIVAR_FRENO;
MOVING='A';}}
case 'H':if (C=='H'){if (MOVING=='A'){
ACTIVAR_FRENO;
ACTIVAR_DIR_HORARIA;
DESACTIVAR_FRENO;
MOVING='H';}}
22/06/2011
Alejandro Quintero García
Página 171 de 214
Diseño e implementación de un equipo de prácticas
de control automático
}
}
////////////////////////////////////////////////////////////////////////////////
//
RUTINAS DE BUCLE CERRADO
////////////////////////////////////////////////////////////////////////////////
void euler()
{
float q_aux;
float TDdd;
float TDnn;
float TIdd;
float TInn;
float KCdd;
float KCnn;
float T_aux;
float TMm;
TMm=TM;
TDdd=TDd;
TDnn=TDn;
TIdd=TId;
TInn=TIn;
KCdd=KCd;
KCnn=KCn;
T_aux=TMm/1000;
q_aux=TDnn/(TDdd*T_aux);
q_aux=q_aux+1;
q_aux=KCnn*q_aux;
q0=q_aux/KCdd;
q_aux=(T_aux*TIdd)/TInn;
q_aux=q_aux-2*(TDnn/(TDdd*T_aux));
q_aux=q_aux-1;
q1=q_aux*(KCnn/KCdd);
q_aux=TDnn/(TDdd*T_aux);
q2=q_aux*(KCnn/KCdd);
}
22/06/2011
Alejandro Quintero García
Página 172 de 214
Diseño e implementación de un equipo de prácticas
de control automático
void BC_posicion(int u)
{
unsigned int32 time3;
unsigned int32 time4;
int b;
int fin;
int xz;
b=0;
euler();
if (u==1){Reset_MEMORIA();}
xz=TMPPA;
uk_1=0;
uk=0;
RES_iter=0;
RES_POS=0;
REFPOS_TM=REFPOS;
ERRPOS_TM_P=ERRPOS*(REFPOS_TM/100);
RES_iter_max=0;
RES_ek=0;
RES_ek_1=0;
RES_ek_2=0;
RES_PWM=0;
ERRPOS_TM_k_2=0;
ERRPOS_TM_k_1=0;
ERRPOS_TM_k=0;
fin=1;
iter_count=0;
ENCount1=0;
ENCount2=0;
time=0;
MOTOR(0);
time=0;
time3=time;
time4=time3+TM;
do{
if (b==0){
POS1_TM=ENCount1;
POS2_TM=ENCount2;
POS1_TM=POS1_TM*360;
POS1_TM=POS1_TM/PULSOS_VUELTA;
POS2_TM=POS2_TM*360;
POSG_TM=POS1_TM+POS2_TM;
ERRPOS_TM_k_2=ERRPOS_TM_k_1;
ERRPOS_TM_k_1=ERRPOS_TM_k;
if (REFPOS_TM>POSG_TM){ERRPOS_TM_k=REFPOS_TM-POSG_TM;}
22/06/2011
Alejandro Quintero García
Página 173 de 214
Diseño e implementación de un equipo de prácticas
de control automático
uk=uk_1+q0*ERRPOS_TM_k+q1*ERRPOS_TM_k_1+q2*ERRPOS_TM_k_2;
uk_1=uk;
PWM=uk;
if (uk>150){PWM=150;}
MOTOR(PWM);
iter_count++;
if (u==1) {if (xz==1){almacena_punto(POSG_TM,COMANDO);xz=TMPPA;}
if (xz>1){xz--;}}}
b++;
if (b==250){b=1;}
}while(time<=time4);
WHILE(fin)
{
if (ERRPOS_TM_k<ERRPOS_TM_P){
if (ERRPOS_TM_k_1<ERRPOS_TM_P){
if (ERRPOS_TM_k_2<ERRPOS_TM_P){fin=0;}}}
if (iter_count==iter_max) {fin=0;}
if (fin==1){if (xz==1){esperaTM_POS(1);xz=TMPPA;}
if (xz>1){esperaTM_POS(0);xz--;}
if (uk<0) {direccion('A');
PWM=-uk;
if (uk<-150){PWM=150;}
}
if (uk>=0) {direccion('H');
PWM=uk;
if (uk>150){PWM=150;}}
MOTOR(PWM);
iter_count++;}
}
RES_iter=iter_count;
RES_POS=POSG_TM;
RES_PWM=PWM;
RES_iter_max=iter_max;
if (ERRPOS_TM_k<0){RES_ek=-ERRPOS_TM_k;}
if (ERRPOS_TM_k>=0){RES_ek=ERRPOS_TM_k;}
if (ERRPOS_TM_k_1<0){RES_ek_1=-ERRPOS_TM_k_1;}
if (ERRPOS_TM_k_1>=0){RES_ek_1=ERRPOS_TM_k_1;}
if (ERRPOS_TM_k_2<0){RES_ek_2=-ERRPOS_TM_k_2;}
if (ERRPOS_TM_k_2>=0){RES_ek_2=ERRPOS_TM_k_2;}
ENCount1=0;
ENCount2=0;
time=0;
22/06/2011
Alejandro Quintero García
Página 174 de 214
Diseño e implementación de un equipo de prácticas
de control automático
PWM=0;
MOTOR(0);
}
////////////////////////////////////////////////////////////////////////////////
//
INTERRUPCION DEL PUERTO SERIE
//
////////////////////////////////////////////////////////////////////////////////
#INT_RDA
void RDA_isr()
{
apaga(LED0);
delay_ms(500);
Enciende(LED0);
OCUPADO_UC;
PWM=20;
direccion('H');
COMANDO=ESCTENSION;
}
////////////////////////////////////////////////////////////////////////////////
//
//
M A I N
//
////////////////////////////////////////////////////////////////////////////////
void main(void) {
// Mensaje de bienvenida!!
// Enviamos el entero 1 al uC2 de tal forma que lo interpreta como un mensaje de
// inicio o bienvenida
putc(1);
delay_ms(2000);
int delante;
int atras;
int stop;
int t;
//unsigned int valor;
int i;
output_low(PIN_D6);
22/06/2011
Alejandro Quintero García
Página 175 de 214
Diseño e implementación de un equipo de prácticas
de control automático
OUTPUT_LOW(PIN_D5);
TMPPA=1;
PACKET_ACTIVE=1;
PULSOS_VUELTA=9000;
////////////////////////////////////////////////////////////////////////////////
//
INICIALIZACION DE VARIABLES DEL BC
////////////////////////////////////////////////////////////////////////////////
ERRPOS=0;
TM=0;
REFPOS=0;
iter_max=0;
iter_count=0;
POSG_TM=0;
RES_PWM=0;
RES_iter=0;
RES_POS=0;
RES_ek=0;
RES_ek_1=0;
RES_ek_2=0;
RES_iter_max=0;
ERRPOS_TM_P=0;
ERRPOS_TM_k=0;
ERRPOS_TM_k_1=0;
ERRPOS_TM_k_2=0;
REFPOS_TM=0;
KCd=0;
KCn=0;
TDd=0;
TDn=0;
TId=0;
TIn=0;
////////////////////////////////////////////////////////////////////////////////
//
RESTO DE INICIALIZACIONES
////////////////////////////////////////////////////////////////////////////////
ENCount1=0;
ENCount2=0;
MOVING='H';
time=0;
stop=0;
delante=0;
atras=0;
22/06/2011
Alejandro Quintero García
Página 176 de 214
Diseño e implementación de un equipo de prácticas
de control automático
i=0;
t=0;
//valor=25;
PWM=0;
bloque_m=0;
COMANDO=0;
COMANDO_S=0;
encoder_mul=1;
active2=1;
CTRL_POS=0;
////////////////////////////////////////////////////////////////////////////////
//
INICIALIZACION DE VARIABLES DE TIMER 0 (RTCC)
////////////////////////////////////////////////////////////////////////////////
valorT0=64786;
//1MS
valorT3=64786;
////////////////////////////////////////////////////////////////////////////////
//
INICIALIZACION DE VARIABLES INTERNAS
////////////////////////////////////////////////////////////////////////////////
varG32_1=0;
varG32_2=0;
varG32_3=0;
varG32_4=0;
varG16_1=0;
varG16_2=0;
varG8_1=0;
////////////////////////////////////////////////////////////////////////////////
//
ACTIVACION DEL CANAL DE CAPTURA (MC3486) Y ENCENDIDO DE LEDS
////////////////////////////////////////////////////////////////////////////////
ENABLE_CANAL_A;
Apaga(LED0);
Apaga(LED1);
Enciende(LED2);
////////////////////////////////////////////////////////////////////////////////
//
INICIALIZACION DEL LOS BUFFERS
////////////////////////////////////////////////////////////////////////////////
inicializa_buffer_gen();
Reset_MEMORIA();
22/06/2011
Alejandro Quintero García
Página 177 de 214
Diseño e implementación de un equipo de prácticas
de control automático
////////////////////////////////////////////////////////////////////////////////
//
CONFIGURACION DE LOS TEMPORIZADORES Y LOS CCPs
////////////////////////////////////////////////////////////////////////////////
setup_timer_2(T2_DIV_BY_4, 149, 1);
setup_timer_1(T1_INTERNAL);
setup_counters( RTCC_INTERNAL, RTCC_DIV_16);
//setup_timer_3 (T3_INTERNAL | T3_DIV_BY_8);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_CAPTURE_RE);
set_pwm1_duty(PWM);
////////////////////////////////////////////////////////////////////////////////
//
INICIALIZACION DEL USB
////////////////////////////////////////////////////////////////////////////////
usb_init();
usb_task();
usb_wait_for_enumeration();
////////////////////////////////////////////////////////////////////////////////
//
CONFIGURACION DE LAS INTERRUPCIONES
////////////////////////////////////////////////////////////////////////////////
enable_interrupts(INT_RTCC);
enable_interrupts(INT_CCP2);
Enciende(LED1);
enable_interrupts(global);
//disable_interrupts(INT_TIMER3);
////////////////////////////////////////////////////////////////////////////////
//
INICIO DEL BUCLE PRINCIPAL DEL CONTROLADOR
////////////////////////////////////////////////////////////////////////////////
int flag=0;
while (TRUE)
{
if(usb_enumerated())
{
if(flag==0)
{
// Enviamos un 2 para indicar que el usb ha sido iniciado con éxito!
putc(2);
Apaga(LED2);
22/06/2011
Alejandro Quintero García
Página 178 de 214
Diseño e implementación de un equipo de prácticas
de control automático
Enciende(LED0);
flag=flag+1;
}
if (usb_kbhit(1))
{
usb_get_packet(1, recbuf, Lenbuf);
decodificar();
//enable_interrupts(INT_RDA);
//enable_interrupts(global);
switch (COMANDO){
case LISTO:OCUPADO_UC;
//TRE:<1us
LIBRE_UC;
case DAR_TM:OCUPADO_UC;
//TRE:<1us
if (COMANDO==1){varG32_1=TM;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case SETBC:OCUPADO_UC;
//TRE:<1us
if (COMANDO==2){
iter_max=varG16_1;
varG16_1=0;
BC_posicion(1);
}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case SETTM:OCUPADO_UC;
//TRE:<1us
if (COMANDO==3){TM=varG16_1;
varG16_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case SETPIDKC:OCUPADO_UC;
//TRE:<1us
22/06/2011
Alejandro Quintero García
Página 179 de 214
Diseño e implementación de un equipo de prácticas
de control automático
if (COMANDO==4){KCd=varG16_1;
KCn=varG16_2;
varG16_1=0;
varG16_2=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case SETPIDTI:OCUPADO_UC;
//TRE:<1us
if (COMANDO==5){TId=varG16_1;
TIn=varG16_2;
varG16_1=0;
varG16_2=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case SETPIDTD:OCUPADO_UC;
//TRE:<1us
if (COMANDO==6){TDd=varG16_1;
TDn=varG16_2;
varG16_1=0;
varG16_2=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case LEEPOS:OCUPADO_UC;
//TRE:7us+Tusb
if (COMANDO==7){varG32_1=ENCount1;
varG32_2=ENCount2;
varG32_3=time;
varG32_4=encoder_mul;
almacena_BUFFER(varG32_1);
almacena_BUFFER(varG32_2);
almacena_BUFFER(varG32_3);
almacena_BUFFER(varG32_4);
envia_paquete(1,COMANDO);
varG32_1=0;
varG32_2=0;
varG32_3=0;
varG32_4=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case ESCTENSION:OCUPADO_UC;
//TRE:<1us
22/06/2011
Alejandro Quintero García
Página 180 de 214
Diseño e implementación de un equipo de prácticas
de control automático
if (COMANDO==8)
{
PWM=varG8_1;
if (COMANDO_S==0){direccion('H');set_pwm1_duty(PWM);}
if (COMANDO_S==1){direccion('A');set_pwm1_duty(PWM);}
putc(3);
delay_us(30);
if(varG8_1==0)
{
varG8_1=200;
}
putc(varG8_1);
}
varG8_1=0;
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case LEEVEL:OCUPADO_UC;
//TRE:20us+Tusb+TE
if (COMANDO==9){varG32_1=esperaTM();
almacena_BUFFER(varG32_1);
varG32_1=encoder_mul;
almacena_BUFFER(varG32_1);
varG32_1=TM;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case RESETEO_TOTAL:OCUPADO_UC;
if (COMANDO==10){TIME=0;
ENCount1=0;
ENCount2=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case ESCREF:OCUPADO_UC;
//TRE:<1us
if (COMANDO==11){if (COMANDO_S==1) {REFPOS=varG32_1;
varG32_1=0;}}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
22/06/2011
Alejandro Quintero García
Página 181 de 214
Diseño e implementación de un equipo de prácticas
de control automático
case AJ_RELOJ:OCUPADO_UC;
//TRE:<1us
if (COMANDO==12){valorT0=varG16_1;varG16_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case STATUS_TIMERS:OCUPADO_UC;
//TRE:<1us
if (COMANDO==13){varG32_1=valorT0;
varG32_2=valorT3;
almacena_BUFFER(varG32_1);
almacena_BUFFER(varG32_2);
envia_paquete(1,COMANDO);
varG32_1=0;
varG32_2=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case ST_ERR_CONTROL:OCUPADO_UC;
if (COMANDO==14){
varG32_1=RES_ek;
almacena_BUFFER(varG32_1);
varG32_1=RES_ek_1;
almacena_BUFFER(varG32_1);
varG32_1=RES_ek_2;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case DAR_PWM:OCUPADO_UC;
if (COMANDO==15){varG32_1=PWM;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case DAR_REF_POS:OCUPADO_UC;
if (COMANDO==16){varG32_1=REFPOS;
almacena_BUFFER(varG32_1);
22/06/2011
Alejandro Quintero García
Página 182 de 214
Diseño e implementación de un equipo de prácticas
de control automático
envia_paquete(1,COMANDO);}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case BUFFER_INIT:OCUPADO_UC;
if (COMANDO==17){Reset_MEMORIA();}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case AJ_TIMER3:OCUPADO_UC;
if (COMANDO==18){valorT3=varG16_1;VARg16_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case ERROR_POS:OCUPADO_UC;
//TRE:<1us
if (COMANDO==19){ERRPOS=varG8_1;
varG8_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case FRENO:OCUPADO_UC;
//TRE:<1us
if (COMANDO==20){
if (COMANDO_S==1){ACTIVAR_FRENO;MOVING_ANT=MOVING;MOVING='F';}
if (COMANDO_S==2){DESACTIVAR_FRENO;MOVING=MOVING_ANT;}}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case AJ_ENCODER:OCUPADO_UC;
if (COMANDO==21){
if
(COMANDO_S==1)
{setup_ccp2(CCP_CAPTURE_RE);PULSOS_VUELTA=9000;encoder_mul=1;}
if
(COMANDO_S==2)
{setup_ccp2(CCP_CAPTURE_RE
|
{setup_ccp2(CCP_CAPTURE_RE
|
CCP_CAPTURE_DIV_4);PULSOS_VUELTA=2250;encoder_mul=4;}
if
(COMANDO_S==3)
CCP_CAPTURE_DIV_16);PULSOS_VUELTA=563;encoder_mul=16;}}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
22/06/2011
Alejandro Quintero García
Página 183 de 214
Diseño e implementación de un equipo de prácticas
de control automático
case CONF_INT_TIMER0:OCUPADO_UC;
//TRE:<1us
if (COMANDO==22){
if (COMANDO_S==1){enable_interrupts(INT_RTCC);}
if (COMANDO_S==2){disable_interrupts(INT_RTCC);}}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case BUFFER_INIT_GEN:OCUPADO_UC;
if (COMANDO==23){inicializa_buffer_gen();}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case CONF_INT_TIMER3:OCUPADO_UC;
//TRE:<1us
if (COMANDO==24){
if (COMANDO_S==1){enable_interrupts(INT_TIMER3);}
if (COMANDO_S==2){disable_interrupts(INT_TIMER3);}}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case CONF_INT_CCP2:OCUPADO_UC;
//TRE:<1us
if (COMANDO==25){
if (COMANDO_S==1){enable_interrupts(INT_CCP2);Enciende(LED1);}
if (COMANDO_S==2){disable_interrupts(INT_CCP2);Apaga(LED1);}}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case RESETEO_RELOJ:OCUPADO_UC;
if (COMANDO==26){TIME=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case RESETEO_CONT_POS:OCUPADO_UC;
if (COMANDO==27){ENCount1=0;
ENCount2=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case TM_POR_PUNTO:OCUPADO_UC;
//TRE:<1us
22/06/2011
Alejandro Quintero García
Página 184 de 214
Diseño e implementación de un equipo de prácticas
de control automático
if (COMANDO==28){TMPPA=varG8_1;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case DAR_ERR_POS:OCUPADO_UC;
if (COMANDO==29){varG32_1=ERRPOS;
almacena_BUFFER(varG32_1);
varG32_1=ERRPOS_TM_P;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case DAR_ITER_MAX:OCUPADO_UC;
if (COMANDO==30){varG32_1=RES_iter_max;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case ACTIVA_INT_GLOBAL:OCUPADO_UC;
if (COMANDO==31){
enable_interrupts(INT_RTCC);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER3);}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case DESACTIVA_INT_GLOBAL:OCUPADO_UC;
if (COMANDO==32){
disable_interrupts(INT_RTCC);
disable_interrupts(INT_CCP2);
disable_interrupts(INT_TIMER3);}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case DAR_RES_ITER:OCUPADO_UC;
if (COMANDO==33){varG32_1=RES_iter;
22/06/2011
Alejandro Quintero García
Página 185 de 214
Diseño e implementación de un equipo de prácticas
de control automático
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case ESTATUS_PID:OCUPADO_UC;
if (COMANDO==34){varG32_1=KCn;
almacena_BUFFER(varG32_1);
varG32_1=KCd;
almacena_BUFFER(varG32_1);
varG32_1=TDn;
almacena_BUFFER(varG32_1);
varG32_1=TDd;
almacena_BUFFER(varG32_1);
varG32_1=TIn;
almacena_BUFFER(varG32_1);
varG32_1=TId;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case RECUPERA_M:OCUPADO_UC;
if (COMANDO==35){bloque_m=varG8_1;
envia_bloque();
varG8_1=0;
}
COMANDO=0;
COMANDO_S=0;
LIBRE_UC;
case EST_CONTROL:OCUPADO_UC;
if (COMANDO==36){
varG32_1=RES_POS;
almacena_BUFFER(varG32_1);
varG32_1=RES_PWM;
almacena_BUFFER(varG32_1);
envia_paquete(1,COMANDO);
varG32_1=0;}
COMANDO=0;
COMANDO_S=0;
22/06/2011
Alejandro Quintero García
Página 186 de 214
Diseño e implementación de un equipo de prácticas
de control automático
LIBRE_UC;
default :LIBRE_UC;
}
}
}
else{
Apaga(LED1);
Enciende(LED2);
}
}
}
8.3
Código del microcontrolador secundario.
////////////////////////////////////////////////////////////////////////////////
////
////
////
FIRMWARE DEL PIC18F4685 PARA LA PLACA PROTOTIPO DEL PFC
////
////
////
////
Modificado por Alejandro Quintero García '11
////
////
////
////////////////////////////////////////////////////////////////////////////////
#include <18f4685.h>
#DEVICE HIGH_INTS=TRUE
#device adc=10
#fuses NOWDT,NOPROTECT,HS,MCLR
#use delay(clock=20M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
#include <ks0108b_mio.c>
#include "graphics.c"
#include "math.h"
#include "float.h"
#include "stdlib.h"
#include "stdio.h"
////////////////////////////////////////////////////////////////////////////////
//
Variables Globales
//
////////////////////////////////////////////////////////////////////////////////
22/06/2011
Alejandro Quintero García
Página 187 de 214
Diseño e implementación de un equipo de prácticas
de control automático
int32 valor;
int32 volt;
int condicion;
const int8 inicio[64][16] = {
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x03 , 0xFF , 0xFF , 0xC0 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF0 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x03 , 0xFF , 0xFF , 0xC0 , 0x0F , 0xFF , 0xFF , 0xC0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x07 , 0xFF , 0xFF , 0x00 , 0x01 , 0xFF , 0xFF , 0xC0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x07 , 0xFF , 0xFC , 0x00 , 0x00 , 0x7F , 0xFF , 0xE0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x0F , 0xFF , 0xF8 , 0x00 , 0x00 , 0x3F , 0xFF , 0xE0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x0F , 0xFF , 0xE0 , 0x00 , 0x00 , 0x1F , 0xFF , 0xF0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x1F , 0xFF , 0xC0 , 0x03 , 0x00 , 0x0F , 0xFF , 0xF0,
22/06/2011
Alejandro Quintero García
Página 188 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x1F , 0xFF , 0xC0 , 0x1F , 0xF0 , 0x07 , 0xFF , 0xF8,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x1F , 0xFF , 0x80 , 0x7F , 0xFC , 0x03 , 0xFF , 0xF8,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFF , 0x01 , 0xFF , 0xFE , 0x03 , 0xFF , 0xF8,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFF , 0x03 , 0xFF , 0xFF , 0x01 , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFE , 0x03 , 0xFF , 0xFF , 0x81 , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFE , 0x07 , 0xFF , 0xFF , 0xC0 , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFE , 0x0F , 0xFF , 0xFF , 0xC0 , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xE0 , 0xFF , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xF8 , 0x00 , 0x07 , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFC , 0x00 , 0x0F , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFE , 0x00 , 0x1F , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0x00 , 0x3F , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0x80 , 0x7F , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xC0 , 0xFF , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xE1 , 0xFF , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFC , 0x0F , 0xFF , 0xFF , 0xF3 , 0xFF , 0xFE,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFE , 0x07 , 0xFF , 0xFF , 0xFB , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x7F , 0xFE , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFE , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFF , 0x01 , 0xFF , 0xFE , 0x7F , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFF , 0x00 , 0xFF , 0xFC , 0x3F , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x1F , 0xFF , 0x80 , 0x7F , 0xF8 , 0x1F , 0xFF , 0xF8,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
22/06/2011
Alejandro Quintero García
Página 189 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0x1F , 0xFF , 0xC0 , 0x1F , 0xE0 , 0x0F , 0xFF , 0xF8,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x1F , 0xFF , 0xE0 , 0x00 , 0x00 , 0x1F , 0xFF , 0xF0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x0F , 0xFF , 0xF0 , 0x00 , 0x00 , 0x3F , 0xFF , 0xF0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x0F , 0xFF , 0xF8 , 0x00 , 0x00 , 0x7F , 0xFF , 0xF0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x07 , 0xFF , 0xFE , 0x00 , 0x01 , 0xFF , 0xFF , 0xE0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x07 , 0xFF , 0xFF , 0x80 , 0x03 , 0xFF , 0xFF , 0xC0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x03 , 0xFF , 0xFF , 0xF0 , 0x1F , 0xFF , 0xFF , 0xC0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x80 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF8 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x07 , 0xFF , 0xFF , 0xE0 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
};
22/06/2011
Alejandro Quintero García
Página 190 de 214
Diseño e implementación de un equipo de prácticas
de control automático
const int8 stop[64][16] = {
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF8 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x3F , 0xFF , 0xFF , 0xFC , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x80 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00,
0x00 , 0x00 , 0x20 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00,
0x00 , 0x00 , 0x30 , 0x60 , 0x04 , 0x00 , 0x00 , 0x00,
0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00,
0x00 , 0x00 , 0x30 , 0x60 , 0x04 , 0x00 , 0x00 , 0x00,
0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00,
0x00 , 0x00 , 0x28 , 0xA3 , 0xCF , 0x3C , 0x58 , 0x00,
0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80,
0x00 , 0x00 , 0x28 , 0xA4 , 0x24 , 0x42 , 0x60 , 0x00,
0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0,
0x00 , 0x00 , 0x28 , 0xA4 , 0x24 , 0x42 , 0x40 , 0x00,
0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0,
0x00 , 0x00 , 0x25 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00,
0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0,
0x00 , 0x00 , 0x25 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00,
0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8,
0x00 , 0x00 , 0x25 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00,
0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC,
0x00 , 0x00 , 0x22 , 0x24 , 0x24 , 0x42 , 0x40 , 0x00,
0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC,
0x00 , 0x00 , 0x22 , 0x23 , 0xC7 , 0x3C , 0x40 , 0x00,
0x3F , 0x03 , 0xC0 , 0x07 , 0xC0 , 0xFE , 0x00 , 0xFC,
22/06/2011
Alejandro Quintero García
Página 191 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3E , 0x01 , 0xC0 , 0x07 , 0x80 , 0x7E , 0x00 , 0x7C,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x00 , 0xC0 , 0x07 , 0x00 , 0x3E , 0x00 , 0x3C,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x70 , 0xFC , 0x7F , 0x0C , 0x3E , 0x3E , 0x1C,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x78 , 0xFC , 0x7F , 0x1E , 0x3E , 0x3F , 0x1C,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x7F , 0xFC , 0x7E , 0x1E , 0x1E , 0x3F , 0x1C,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x7F , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0x1C,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x3F , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0x1C,
0x00 , 0x07 , 0xF0 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00,
0x3E , 0x0F , 0xFC , 0x7E , 0x3F , 0x1E , 0x3E , 0x1C,
0x00 , 0x04 , 0x08 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00,
0x3E , 0x07 , 0xFC , 0x7E , 0x3F , 0x1E , 0x00 , 0x3C,
0x00 , 0x04 , 0x08 , 0x00 , 0x00 , 0x00 , 0x40 , 0x00,
0x3F , 0x81 , 0xFC , 0x7E , 0x3F , 0x1E , 0x00 , 0x7C,
0x00 , 0x04 , 0x08 , 0xF1 , 0x67 , 0x87 , 0x47 , 0x80,
0x3F , 0xE1 , 0xFC , 0x7E , 0x3F , 0x1E , 0x00 , 0xFC,
0x00 , 0x04 , 0x09 , 0x09 , 0x88 , 0x48 , 0xC8 , 0x40,
0x3F , 0xF0 , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC,
0x00 , 0x07 , 0xF0 , 0x09 , 0x00 , 0x48 , 0x48 , 0x40,
0x3F , 0xF8 , 0xFC , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC,
0x00 , 0x04 , 0x00 , 0x79 , 0x03 , 0xC8 , 0x48 , 0x40,
0x3F , 0xF8 , 0x7C , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC,
0x00 , 0x04 , 0x00 , 0x89 , 0x04 , 0x48 , 0x48 , 0x40,
0x3F , 0xFC , 0x7C , 0x7E , 0x3F , 0x1E , 0x3F , 0xFC,
0x00 , 0x04 , 0x01 , 0x09 , 0x08 , 0x48 , 0x48 , 0x40,
0x38 , 0xFC , 0x7C , 0x7E , 0x1E , 0x1E , 0x3F , 0xFC,
0x00 , 0x04 , 0x01 , 0x19 , 0x08 , 0xC8 , 0xC8 , 0x40,
0x38 , 0xFC , 0x7C , 0x7F , 0x1E , 0x3E , 0x3F , 0xFC,
0x00 , 0x04 , 0x00 , 0xE9 , 0x07 , 0x47 , 0x47 , 0x80,
0x38 , 0x78 , 0xFC , 0x7F , 0x0C , 0x3E , 0x3F , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3C , 0x00 , 0xFC , 0x7F , 0x00 , 0x3E , 0x3F , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3E , 0x01 , 0xFC , 0x7F , 0x80 , 0x7E , 0x3F , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0x03 , 0xFC , 0x7F , 0xC0 , 0xFE , 0x3F , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
22/06/2011
Alejandro Quintero García
Página 192 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x80,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x3F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x1F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF8 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x0F , 0xFF , 0xFF , 0xFF , 0xFF , 0xF0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFF , 0xE0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x03 , 0xFF , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x01 , 0xFF , 0xFF , 0xFF , 0xFF , 0x80 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x3F , 0xFF , 0xFF , 0xFC , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x1F , 0xFF , 0xFF , 0xF8 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
};
const int8 imagen3[64][16] = {
0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF,
22/06/2011
Alejandro Quintero García
Página 193 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x80 , 0x00 , 0x00 , 0x1F , 0xE0 , 0x00 , 0x00 , 0x03,
0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF9,
0x80 , 0x00 , 0x00 , 0x3F , 0xF8 , 0x00 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0xFF , 0xFC , 0x00 , 0x00 , 0x02,
0xFF , 0x00 , 0x00 , 0x20 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x01 , 0xFF , 0xFE , 0x00 , 0x00 , 0x02,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x01 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02,
0x80 , 0x1D , 0x21 , 0x25 , 0xC3 , 0xC0 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x80 , 0x23 , 0x21 , 0x26 , 0x24 , 0x20 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0xFF , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x80 , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x80 , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x80 , 0x21 , 0x21 , 0x24 , 0x24 , 0x20 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x80 , 0x23 , 0x23 , 0x26 , 0x24 , 0x20 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0xFF , 0x1D , 0x1D , 0x25 , 0xC3 , 0xC0 , 0x00 , 0x09,
0x80 , 0x00 , 0x03 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02,
0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x01 , 0xFF , 0xFF , 0x00 , 0x00 , 0x02,
0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0xFF , 0xFE , 0x00 , 0x00 , 0x02,
0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0xFF , 0xFC , 0x00 , 0x00 , 0x02,
0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x7F , 0xF8 , 0x00 , 0x00 , 0x02,
0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x1F , 0xF0 , 0x00 , 0x00 , 0x02,
0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x74 , 0x78 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x8C , 0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
22/06/2011
Alejandro Quintero García
Página 194 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x84 , 0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x84 , 0xFC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x84 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x84 , 0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x8C , 0x84 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x74 , 0x78 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x00 , 0x80 , 0x00 , 0x40 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x01 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0xB8 , 0xB3 , 0xC3 , 0xCF , 0x47 , 0x87 , 0x87 , 0x89,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0xC4 , 0xC4 , 0x24 , 0x24 , 0x48 , 0x48 , 0x48 , 0x49,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x84 , 0x80 , 0x24 , 0x04 , 0x48 , 0x00 , 0x48 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x84 , 0x81 , 0xE4 , 0x04 , 0x48 , 0x03 , 0xC6 , 0x09,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x84 , 0x82 , 0x24 , 0x04 , 0x48 , 0x04 , 0x41 , 0x89,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x84 , 0x84 , 0x24 , 0x04 , 0x48 , 0x08 , 0x40 , 0x49,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0xC4 , 0x84 , 0x64 , 0x24 , 0x48 , 0x48 , 0xC8 , 0x49,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0xB8 , 0x83 , 0xA3 , 0xC7 , 0x47 , 0x87 , 0x47 , 0x89,
0x80 , 0x00 , 0x07 , 0xFF , 0xFF , 0x80 , 0x00 , 0x02,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
22/06/2011
Alejandro Quintero García
Página 195 de 214
Diseño e implementación de un equipo de prácticas
de control automático
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x02,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x09,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03,
0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xF9,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x80 , 0x00 , 0x00 , 0x00 , 0x07 , 0xFF , 0xC0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x87 , 0xE0 , 0x00 , 0x00 , 0x7F , 0xFF , 0xF0 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x87 , 0xF0 , 0x00 , 0x07 , 0xFF , 0xFF , 0xFC , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x87 , 0xF0 , 0x00 , 0x7F , 0xFF , 0xFF , 0xFE , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x83 , 0xF8 , 0x07 , 0xFF , 0xFF , 0xFF , 0xFE , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x83 , 0xFF , 0xFF , 0xFF , 0xFF , 0xF1 , 0xFF , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x81 , 0xFF , 0xFF , 0xFF , 0xFC , 0x00 , 0x7F , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x81 , 0xFF , 0xFF , 0xFF , 0xC0 , 0x00 , 0x3F , 0x80,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x80 , 0x7F , 0xFF , 0xFC , 0x00 , 0x00 , 0x3F , 0x80,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x80 , 0x3F , 0xFF , 0xE0 , 0x00 , 0x00 , 0x1F , 0x80,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x80 , 0x03 , 0xFC , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x80 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01,
0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF,
0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE
};
////////////////////////////////////////////////////////////////////////////////
//
Funciones auxiliares
//
////////////////////////////////////////////////////////////////////////////////
void glcd_inicio()
22/06/2011
Alejandro Quintero García
Página 196 de 214
Diseño e implementación de un equipo de prácticas
de control automático
{
char i,j;
signed char k;
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;k--)
{
if( bit_test(inicio[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
glcd_update();
}
void glcd_imagen()
{
char i,j;
signed char k;
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;k--)
{
if( bit_test(imagen3[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
glcd_update();
}
void glcd_imagen2()
{
char i,j;
signed char k;
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
22/06/2011
Alejandro Quintero García
Página 197 de 214
Diseño e implementación de un equipo de prácticas
de control automático
for(k=7;k>-1;k--)
{
if( bit_test(stop[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
glcd_update();
}
void glcd_imagen_N()
{
char i,j;
signed char k;
for( i = 0 ; i < 64 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;k--)
{
if( bit_test(~imagen3[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
glcd_update();
}
////////////////////////////////////////////////////////////////////////////////
//
Interrupciones
//
////////////////////////////////////////////////////////////////////////////////
#INT_RDA
void RDA_isr()
{
output_toggle(PIN_E1);
valor=GETC();
delay_us(40);
volt=0;
condicion=1;
if(valor==3)
{
22/06/2011
Alejandro Quintero García
Página 198 de 214
Diseño e implementación de un equipo de prácticas
de control automático
condicion=0;
disable_interrupts(INT_RDA);
while(volt<1)
//while(kbhit())
{volt=GETC();}
delay_us(40);
if(volt==200){valor=90;}
enable_interrupts(INT_RDA);
}
output_toggle(PIN_E1); // led
}
////////////////////////////////////////////////////////////////////////////////
//
Funcion Principal
//
////////////////////////////////////////////////////////////////////////////////
void main()
{
////////////////////////////////////////////////////////////////////////////////
//
Inicialización parámetros del micro
//
////////////////////////////////////////////////////////////////////////////////
// setup_adc_ports(sAN0|VSS_VDD);
setup_adc_ports(AN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
char dato1[10];
char dato4[]="USB OK!";
float val;
int32 lectura;
float ADC;
char datoadc[20];
glcd_init(ON);
//Iniciamos la lcd
glcd_fillScreen(0);
//LIMPIAMOS LA PANTALLA
glcd_update();
output_toggle(PIN_E1);
glcd_imagen();
22/06/2011
Alejandro Quintero García
Página 199 de 214
Diseño e implementación de un equipo de prácticas
de control automático
glcd_update();
delay_ms(2000);
output_toggle(PIN_E1);
while(1)
{
switch (valor)
{
case 90:glcd_fillScreen(0);
glcd_update();
glcd_imagen2();
glcd_update();
output_toggle(PIN_E1);
valor = 99 ;
break;
case 1:glcd_fillScreen(0);
glcd_update();
glcd_imagen();
valor = 99;
break;
case 2:glcd_fillScreen(0);
glcd_text57(20,117, dato4, 1, 1);
glcd_imagen();
glcd_update();
output_toggle(PIN_E1);
delay_ms(500);
output_toggle(PIN_E1);
delay_ms(500);
output_toggle(PIN_E1);
delay_ms(500);
output_toggle(PIN_E1);
delay_ms(2000);
putc(1);
valor = 99;
break;
case 3:glcd_fillScreen(0);
glcd_inicio();
22/06/2011
Alejandro Quintero García
Página 200 de 214
Diseño e implementación de un equipo de prácticas
de control automático
glcd_update();
while(condicion=1)
{
if(val==32)
{
break;
}
val=volt*0.16;
sprintf(dato1,"IN
%fV",val);
// glcd_text57(2,2, dato1, 1, 1);
// glcd_update();
// Leemos el ADC
set_adc_channel(0);
delay_us(50);
lectura=read_adc();
ADC=(float)lectura;
ADC=ADC/1023*5;
ADC=ADC*24/3.73;
sprintf(datoadc,"OUT %fV",ADC);
glcd_bar(64, 1, 127, 1, 80, 0);
glcd_text57(66,10, dato1, 1,1);
glcd_text57(66,30, datoadc, 1, 1);
if(val!=32)glcd_update();
output_toggle(PIN_E1);
delay_ms(150);
}
valor=99;
if(val==32)valor=90;
volt=0;
val=0;
break;
}
}
}
22/06/2011
Alejandro Quintero García
Página 201 de 214
Diseño e implementación de un equipo de prácticas
de control automático
8.4
Librería GLCD.
/////////////////////////////////////////////////////////////////////////
// Conexiones de pines del GLCD (Con chipset K0108)
//
//
1: CS1
<-> B1
//
2: CS1
<-> B0
//
6: R/S
<-> B2
//
7: R/W
//
8: E
//
//
//
//
//
//
//
<-> B3
//
<-> B4
//
9..16: D0..D7 <-> D0..D7
//
17: Reset <-> B5
//
//
//
// Los valores pueden cambiarse con los DEFINE que están más abajo
//
//---------------------------------------------------------------------//
// > GLCD_limpiar(color)
//
// "Borra" la pantala, llenando la del color seleccionado.
//
// color = 0 : puntos apagados
//
// color = 1 : puntos encendidos
//
//
//
// > GLCD_RAM2LCD()
//
// Vuelca el contenido de la RAM a la pantalla.
//
// solo funciona si FAST_GLCD está definido.
//
//---------------------------------------------------------------------//
// > GLCD_inicializa(modo)
//
// Inicializa el GLCD, y debe llamarse ANTES de cualquier otra.
// modo = 0 : GLCD en ON
//
// modo = 1 : GLCD en OFF
//
//
//
//
// EN LAS SIGUIENTES FUNCIONES, SIEMPRE SE RESPETA QUE:
// color = 0 : puntos apagados
//
// color = 1 : puntos encendidos
//
//
//
// > GLCD_punto(x,y,color)
//
// Dibuja un punto en x,y. 0,0 es la esquina superior izquierda.
//
//
// Dibuja una linea desde (x1,y1) a (x2,y2)
//
//
// >GLCD_rectangulo (x1,y1,x2,y2,color)
//
// Dibuja un rectangulo con esquinas en (x1,y1) y (x2,y2)
//
// >GLCD_caja (x1,y1,x2,y2,color)
//
//
// > GLCD_linea(x1,y1,x2,y2,color)
//
//
//
//
//
22/06/2011
Alejandro Quintero García
Página 202 de 214
Diseño e implementación de un equipo de prácticas
de control automático
// Dibuja un rectangulo pintado con esquinas en (x1,y1) y (x2,y2)
//
//
//
// >GLCD_circulo (x1,y1,r,color)
//
// Dibuja un circulo con centro en (x1,y1) y radio R
//
//
//
/////////////////////////////////////////////////////////////////////////
//Pines a usar
#define GLCD_CS1
PIN_E2
#define GLCD_CS2
PIN_E1
#define GLCD_DI
#define GLCD_RW
#define GLCD_E
PIN_C3
PIN_C2
PIN_C1
#define GLCD_RESET PIN_E0
//Lados del GLCD
#define GLCD_lado_CS1 0
#define GLCD_lado_CS2 1
BYTE GLCD_leeBYTE(int1 lado);
//----------------------------------------------------------------------//Escribe un byte en una de las mitades de la pantalla (lado=0:izq Lado=1:der)
//----------------------------------------------------------------------void GLCD_enviaBYTE(int1 lado, BYTE dato)
{
if(lado) output_high(GLCD_CS2); // Selecciono la mitad correspondiente
else output_high(GLCD_CS1);
output_low(GLCD_RW);
output_d(dato);
delay_us(1);
// Coloco el dato en el puerto y...
// ...espero.
output_high(GLCD_E);
delay_us(2);
// Modo escritura
// Pongo el bit Enable en alto y...
// ...espero.
output_low(GLCD_E);
// Pongo el bit Enable en bajo.
output_low(GLCD_CS1);
// Libero la linea CS1 y...
output_low(GLCD_CS2);
// CS2.
}
//----------------------------------------------------------------------// Lee un byte de una de las dos mitades de la pantalla
22/06/2011
Alejandro Quintero García
Página 203 de 214
Diseño e implementación de un equipo de prácticas
de control automático
//----------------------------------------------------------------------BYTE GLCD_leeBYTE(int1 lado)
{
BYTE dato;
set_tris_d(0xFF);
// Puerto D como entrada
output_high(GLCD_RW);
// GLCD en Modo lectura
// Selecciono la mitad del display a leer.
if(lado) output_high(GLCD_CS2);
else output_high(GLCD_CS1);
delay_us(1);
// Espero...
output_high(GLCD_E);
delay_us(2);
// Pongo en alto el pin enable y...
// ...espero.
dato = input_d();
// Guardo en "dato" el valor devuelto y...
output_low(GLCD_E);
// ...pongo en bajo el pin enable.
// Vuelvo a poner en bajo las lineas CS1 y CS2.
output_low(GLCD_CS1);
output_low(GLCD_CS2);
return dato;
}
//----------------------------------------------------------------------// Limpia el GLCD (pinta toda la pantalla de un color)
//----------------------------------------------------------------------void GLCD_limpiar(int1 color)
{
int8 i, j;
// Recorre las 8 paginas (vertical)
for(i = 0; i < 8; ++i)
{
output_low(GLCD_DI); // Modo instruccion
//Comienzo, en cada página, desde la dirección 0
GLCD_enviaBYTE(GLCD_lado_CS1, 0b01000000);
GLCD_enviaBYTE(GLCD_lado_CS2, 0b01000000);
//Selecciono la direccion dentro de la pagina
GLCD_enviaBYTE(GLCD_lado_CS1, i | 0b10111000);
GLCD_enviaBYTE(GLCD_lado_CS2, i | 0b10111000);
22/06/2011
Alejandro Quintero García
Página 204 de 214
Diseño e implementación de un equipo de prácticas
de control automático
output_high(GLCD_DI); // Modo datos
// Recorre las dos mitades (horizontales)
for(j = 0; j < 64; ++j)
{ GLCD_enviaBYTE(GLCD_lado_CS1, 0xFF * color); // Enciende/apaga pixeles
GLCD_enviaBYTE(GLCD_lado_CS2, 0xFF * color); // Enciende/apaga pixeles
}
}
}
//----------------------------------------------------------------------//Esta funcion inicializa el LCD.
//----------------------------------------------------------------------void GLCD_inicializa(int1 modo)
{
// Pone los pines de control en el estado correcto.
output_high(GLCD_RESET);
output_low(GLCD_E);
output_low(GLCD_CS1);
output_low(GLCD_CS2);
output_low(GLCD_DI); // Modo instruccion
// Envio datos de inicialización ----------------------GLCD_enviaBYTE(GLCD_lado_CS1, 0xC0);
GLCD_enviaBYTE(GLCD_lado_CS2, 0xC0);
GLCD_enviaBYTE(GLCD_lado_CS1, 0x40);
GLCD_enviaBYTE(GLCD_lado_CS2, 0x40);
GLCD_enviaBYTE(GLCD_lado_CS1, 0xB8);
GLCD_enviaBYTE(GLCD_lado_CS2, 0xB8);
// Si modo = 1 inicializa encendido. Sino, apagado.
if(modo == 1)
{ GLCD_enviaBYTE(GLCD_lado_CS1, 0x3F); // Enciendo el GLCD
GLCD_enviaBYTE(GLCD_lado_CS2, 0x3F); }
else {
GLCD_enviaBYTE(GLCD_lado_CS1, 0x3E); // Apago el GLCD
GLCD_enviaBYTE(GLCD_lado_CS2, 0x3E); }
// Borro la pantalla
GLCD_limpiar(0);
}
22/06/2011
Alejandro Quintero García
Página 205 de 214
Diseño e implementación de un equipo de prácticas
de control automático
//----------------------------------------------------------------------// Dibuja un pixel
//----------------------------------------------------------------------void GLCD_punto(int8 x, int8 y, int1 color)
{
BYTE dato;
int1 lado = GLCD_lado_CS1; // Lado en que voy a dibujar.
if(x > 63)
// Veo si cae del otro lado
{ x -= 64;
lado = GLCD_lado_CS2;}
output_low(GLCD_DI);
// Modo instruccion
bit_clear(x,7);
// Limpio bit MSB...
bit_set(x,6);
// ...y pongo el bit 6 en 1
GLCD_enviaBYTE(lado, x); //Envio la dirección de la coordenada X
// Calculo en que pagina de las 8 cae...
GLCD_enviaBYTE(lado, (y/8 & 0xBF) | 0xB8);
output_high(GLCD_DI);
// ...y paso a Modo datos
//Se necesitan dos lecturas para que devuelva el dato en la nueva direccion
GLCD_leeBYTE(lado);
dato = GLCD_leeBYTE(lado);
//De acuerdo al valor de color...
if(color == 1) bit_set(dato, y%8);
else
// Enciendo el pixel
bit_clear(dato, y%8); // apago el pixel
output_low(GLCD_DI);
GLCD_enviaBYTE(lado, x);
output_high(GLCD_DI);
// Modo instruccion
// Fijo el lado a escribir,
// pongo en Modo Datos y....
GLCD_enviaBYTE(lado, dato); // dibujo el pixel
}
//----------------------------------------------------------------------// Dibuja una linea desde (x1,y1) a (x2,y2) de color (0 o 1)
//----------------------------------------------------------------------void GLCD_linea(int x1, int y1, int x2, int y2, int1 color)
{
//Declaro variables------------------signed int x, y, incremento_x, incremento_y, distancia_x, distancia_y;
signed long P;
22/06/2011
Alejandro Quintero García
Página 206 de 214
Diseño e implementación de un equipo de prácticas
de control automático
int i;
//Calculo las diferencias entre las coordenadas de origen y destino
distancia_x = abs((signed int)(x2 - x1));
distancia_y = abs((signed int)(y2 - y1));
//Inicializo x e y con las coordenadas de origen
x = x1;
y = y1;
//Calculo el sentido de los incrementos (positivos o negativos)
//en funcion de la posicion del origen y el destino
if(x1 > x2) incremento_x = -1; else incremento_x = 1;
if(y1 > y2) incremento_y = -1; else incremento_y = 1;
//Si la distancia horizontal es mayor a la vertical...
if(distancia_x >= distancia_y)
{ P = 2 * distancia_y - distancia_x;
for(i=0; i<=distancia_x; ++i)
{
GLCD_punto(x, y, color);
if(P < 0)
{ P += 2 * distancia_y;
x += incremento_x; }
else
{ P += 2*distancia_y - 2*distancia_x;
x += incremento_x;
y += incremento_y;}
}
}
//Si la distancia vertical es mayor a la horizontal...
else
{ P = 2 * distancia_x - distancia_y;
for(i=0; i<=distancia_y; ++i)
{ GLCD_punto(x, y, color);
if(P < 0)
{ P += 2 * distancia_x;
y += incremento_y; }
else
{ P += 2 * distancia_x - 2 * distancia_y;
x += incremento_x;
y += incremento_y; }
22/06/2011
Alejandro Quintero García
Página 207 de 214
Diseño e implementación de un equipo de prácticas
de control automático
}
}
}
//-----------------------------------------------------------------------
//----------------------------------------------------------------------// Dibuja un rectángulo desde (x1,y1) a (x2,y2) de color (0 o 1)
//----------------------------------------------------------------------void GLCD_rectangulo(int x1, int y1, int x2, int y2, int1 color)
{
GLCD_linea(x1,y1,x2,y1,color);
GLCD_linea(x1,y1,x1,y2,color);
GLCD_linea(x1,y2,x2,y2,color);
GLCD_linea(x2,y1,x2,y2,color);
}
//-----------------------------------------------------------------------
//----------------------------------------------------------------------// Dibuja un rectángulo PINTADO desde (x1,y1) a (x2,y2) de color (0 o 1)
//----------------------------------------------------------------------void GLCD_caja(int x1, int y1, int x2, int y2, int1 color)
{
//Declaro variables------------------int i;
for(i=y1;i<=y2;i++) {
GLCD_linea(x1,i,x2,i,color); }
}
//-----------------------------------------------------------------------
//----------------------------------------------------------------------// Dibuja un circulo con centro en (x1,y1), radio y color (0 o 1)
//----------------------------------------------------------------------void GLCD_circulo(int x1, int y1, int radio, int1 color)
{
signed int d, x, y;
//Inicializo las variables.
d = 1 - radio;
x = 0;
y = radio;
22/06/2011
Alejandro Quintero García
Página 208 de 214
Diseño e implementación de un equipo de prácticas
de control automático
//Dibujo los cuatro pixeles que "caen" sobre los ejes cartesianos.
GLCD_punto(x1, y1 + radio, color);
GLCD_punto(x1, y1 - radio, color);
GLCD_punto(x1 + radio, y1, color);
GLCD_punto(x1 - radio, y1, color);
//Este es el bucle que pinta los octavos de la circunferencia.
while(x < y) {
if(d < 0) {d = d + 2 * x + 3;}
else {d = d + 2 * (x - y ) + 5;
y = y - 1 ;}
x = x + 1;
//Pone el punto en cada uno de los "octantes".
GLCD_punto(x1 + x, y1 + y, color);
GLCD_punto(x1 - x, y1 + y, color);
GLCD_punto(x1 + x, y1 - y, color);
GLCD_punto(x1 - x, y1 - y, color);
GLCD_punto(x1 + y, y1 + x, color);
GLCD_punto(x1 - y, y1 + x, color);
GLCD_punto(x1 + y, y1 - x, color);
GLCD_punto(x1 - y, y1 - x, color);
}
}
22/06/2011
Alejandro Quintero García
Página 209 de 214
Diseño e implementación de un equipo de prácticas
de control automático
8.5
Función de transferencia de la planta.
Apoyándonos en la herramienta de indentificación “ident” de Matlab se ha procedido a realizar varios
ensayos con entrada en escalón,a partir de los cuales Matlab nos ofrece una función de transferencia en
bucle abierto aproximada.
Para distintas entradas escalón conseguimos una función de transferencia bastante aproximada y coherente
con la planta, es decir, con dos polos:
Una vez obtenida la función de transferencia aproximada podemos buscar un controlador también
aproximado con la herramienta sisotool de Matlab:
22/06/2011
Alejandro Quintero García
Página 210 de 214
Diseño e implementación de un equipo de prácticas
de control automático
8.6
Imágenes del prototipo.
22/06/2011
Alejandro Quintero García
Página 211 de 214
Diseño e implementación de un equipo de prácticas
de control automático
22/06/2011
Alejandro Quintero García
Página 212 de 214
Diseño e implementación de un equipo de prácticas
de control automático
22/06/2011
Alejandro Quintero García
Página 213 de 214
Diseño e implementación de un equipo de prácticas
de control automático
8.7
Bibliografía.
•
Gran parte de la informacion se ha tomado de distintos datasheets correspondiente a los distintos
dispositivos que conforman la placas desarrrolladas.
•
Pagina de Farnell. (http://es.farnell.com).
•
Manuales de ayuda de Matlab.
•
Manual de referencia del CCS compiler.
22/06/2011
Alejandro Quintero García
Página 214 de 214
Descargar