Mecanismo Hexapodo

Mecanismo Hexapodo

Proyecto final
José Felipe Hurtado Castaño - Jhon Fredy Paez Nemeguen

Resumen

En el presente informe se explicara para un mecanismo hexápodo el uso del módulo interno de ancho de pulso que se encuentra en el microcontrolador pic 16f877a desde el desarrollo de su código fuente por medio de un entorno de programación hasta la ejecución de su código ilustrado en un motor DC, con el fin de poder variar la velocidad de giro del eje del motor, se mostrara el cambio de velocidad en una pantalla LCD, también se utilizara un sensor de ultrasonido que detendrá el mecanismo cuando se detecte un objeto (obstáculo) a una distancia determinada.

Objetivo

Entender y aplicar el funcionamiento interno del módulo PWM a un motor de corriente continua e implementar
el sensor ultrasonido mediante el uso del microcontrolador de referencia pic16f877a, para luego incorporarlo
al mecanismo hexápodo.

Introduccion

El microcontrolador es un dispositivo el cual contiene un circuito integrado programable capaz de ejecutar una
o varias órdenes dependiendo de la información guardada en la memoria. El microcontrolador contiene un
procesador o UPC (unidad central de proceso), memoria RAM para guardar los datos, memoria para el programa
de tipo ROM/PROM/EPROM, puertos I/O, generador de impulsos de reloj, módulos para el control de periféricos
como temporizadores, puertas serie/paralelo, conversor análogo-digital. La modulación por ancho de pulsos o
pwm es una técnica en la que se puede encontrar en el micrcontrolador pic16f877a donde se modifica el ciclo
de trabajo de una señal, con solo un bit de salida se configura el paso de encendido o apagado del módulo.

thump_9379058img-01.jpg

Los sensores de ultrasonido son detectores de proximidad que mide la distancia de un objeto por medio del
emisor y receptor del sensor que emite un pulso ultrasónico, este pulso rebota en un objeto, por lo cual genera
un rebote haciendo que el sensor vuelva a recibir el pulso, dependiendo del tiempo de ida y regreso del pulso
este mide la distancia y crea una señal eléctrica.

thump_9379060img-02.jpg

Código desarrollado

El código diseñado para el manejo de un motor DC fue el siguiente:

#include "C:\Users\famihurtado\Desktop\ProyectoFinal\mainR.h"
 
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG 
#USE DELAY (CLOCK=4M) 
#DEFINE use portd_lcd TRUE 
#INCLUDE <LCD.C> 
 
#BYTE PORTB=0x06 
#BYTE TRISB=0X86 
#BYTE PORTC=0X07 
#BYTE TRISC=0X87 
#BYTE PORTD=0X08 
#BYTE TRISD=0X88 
 
VOID MAIN(void){ 
unsigned long int total; 
int16 total_pwm; 
float valor;
BOOLEAN Direccion;
trisb=0b01111111; 
trisc=0x00;
portb=0b10000000; 
portc=0x00; 
portd=0x00; 
 
lcd_init(); 
 
output_low(PIN_C2); 
setup_ccp1(CCP_PWM);
output_low(PIN_C1);
setup_ccp2(CCP_PWM); 
setup_timer_2(T2_DIV_BY_1,255,1); 
set_pwm1_duty(0); 
set_pwm2_duty(0);
 
total=0; 
total_pwm=0; 
valor=0;
 
Direccion=1;
while(1){
 
   while(Direccion==1){
      set_pwm2_duty(0);
      if(bit_test(portb,2)==1){Direccion=0; 
         total=0; 
         total_pwm=0; 
         valor=0;
         while(bit_test(portb,2)==1){}
      }
 
      if(bit_test(portb,0)==1){
 
         if(total<=75){
         total=total + 25;
         valor=valor+25;
         total_pwm = (1023.0 * total)/100;
         set_pwm1_duty(total_pwm);
         printf(lcd_putc, "%f", valor);
         }
         while(bit_test(portb,0)==1){}
      }
 
      if(bit_test(portb,1)==1){
 
         if(total>=25){
         total=total - 25;
         valor=valor-25;
         total_pwm = (1023.0 * total)/100;
         set_pwm1_duty(total_pwm);
         printf(lcd_putc, "%f", valor); 
 
         }
         while(bit_test(portb,1)==1){}
       } 
 
   lcd_gotoxy(1,1); 
   lcd_putc("VELOCIDAD1: " ); 
 
   }
 
   while(Direccion==0){ 
      set_pwm1_duty(0);
      if(bit_test(portb,3)==1){Direccion=1; while(bit_test(portb,3)==1){}
      total=0; 
      total_pwm=0; 
      valor=0;
      }
 
      if(bit_test(portb,0)==1){
 
         if(total<=75){
            total=total + 25;
            valor=valor+25;
            total_pwm = (1023.0 * total)/100;
            set_pwm2_duty(total_pwm);
            printf(lcd_putc, "%f", valor);
            }
         while(bit_test(portb,0)==1){}
       } 
 
      if(bit_test(portb,1)==1){
 
         if(total>=25){
            total=total - 25;
            valor=valor-25;
            total_pwm = (1023.0 * total)/100;
            set_pwm2_duty(total_pwm);
            printf(lcd_putc, "%f", valor); 
          }
         while(bit_test(portb,1)==1){}
        } 
 
   lcd_gotoxy(1,1); 
   lcd_putc("VELOCIDAD2: " ); 
 
   }
 
}
 
}

Este código se encarga de identificar cuando un pulsador es oprimido, cuando esto ocurre, el motor incrementa o decrementa según se desee.

Referencias

http://www.embebidos-cidetec.com.mx/profesores/jcrls/doctos/aplic_cidetec.pdf

http://www-app.etsit.upm.es/departamentos/teat/asignaturas/lab-ingel/modulacion_pwm_pmdc_v4.pdf

http://www.alcabot.com/alcabot/seminario2006/Trabajos/DiegoPerezDeDiego.pdf

http://picfernalia.blogspot.com/2012/06/modulacion-pwm-pulse-width-modulation.html

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License