Vous êtes sur la page 1sur 28

PROYECTO : DRIVER CONTROLADOR DE SERVOS

Motivacion:

Como estudiantes, nuestor deber es indagar, investigar acerca de las posibilidades en


nuestros respectivos campos de estudio, razn por la cual nuestro proyecto esta motivado en
la programacin de un controlador GENERICO de servos el cual pueda ser usado en de manera
modular y dejando a un lado todo lo que conlleva el control de servos y su programacin,
facilitando la implementacin de servomecanismos, robots , etc.

OBJETIVO

El objetivo del proyecto es lograr el control de varios servos y sus respectivos angulos

Materiales de proyecto

La implementacin se realizo con :

*microcontrolador pic16f84.

POR QUE?

Por que es el principal material de estudio en nuestro actual curso


*servomecanismos

Que son los que se van a controlar mediante programacin

*conector usb-serial
Que nos dara la posibilidad de manejar el mecanismo desde otros dispositivos

IDEA PRINCIPAL

La idea principal es que el pic funcione nicamente como controlador de servos, recibiendo el
mismo datos(angulos) de manera externa desde otros sistemas que calculen la cinematica
necesaria en el sistema controlado.

DIAGRAMA ILUSTRATIVO
PIC16F84
PROCESADOR EXTERNO
SERIAL CONTROLADOR

VARIOS SERVOS
ALGORITMO

Se usara una tcnica parecida a la multiplexacion en tiempo

Donde el timer0 funcionara generando una onda para cada canal mediante la variable
asignada para cada uno.

A- El pic genera una determinada cantidad de ciclo de trabajo para un pin


B- Genera un tiempo total bajo
C- Ejecuta A para el siguiente
D- B para el siguiente
E- Hasta pasar por todos los servos.
F- Si el pin A esta en nivel alto, pasa a escuchar comunicacin serial
G- Se introducen los datos en el formato a123, que significa que el servo a se mueva
hacia el grado 123
H- Sale de la rutina modifcando la variable que controla el ciclo de trabajo del servo a
I- Vuelve a generar los pulsos para todos los servos conectados.
COMUNICACIN CON SISTEMAS EXTENOS:

Se realizara mediante el protocolo serial el cual nos da la posibilidad de introducir datos desde
la computadora, celulares, etc.

APLICACIONES

Sistemas que requieren una cantidad de servomecanismos


SERVOMECANISMO EN PANELES SOLARES
EN INDUSTRIA
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST P=16F84A

INCLUDE <P16F84A.INC>

CBLOCK 0x0C

GuardaDato

Unidades
Decenas

Centenas

SumaUDC

TeclaPulsada ;recoje letra del servo

servo1_general

servo2_general

servo3_general

servo4_general

servo5_general

servo6_general

servo7_general

servo8_general

general

control

temporal

ENDC

#DEFINE Salida PORTB,0

#DEFINE Salida1 PORTB,1

#DEFINE Salida2 PORTB,2

#DEFINE Salida3 PORTB,3

#DEFINE Salida4 PORTB,4

#DEFINE Salida5 PORTB,5

#DEFINE Salida6 PORTB,6

#DEFINE Salida7 PORTB,7

#DEFINE Entrada PORTA,0

#DEFINE Entrada1 PORTA,1

#DEFINE Entrada2 PORTA,2

; ZONA DE CDIGOS ********************************************************************

TeclaA EQU 'a'


TeclaB EQU 'b'

TeclaC EQU 'c'

TeclaD EQU 'd'

TeclaE EQU 'e'

TeclaF EQU 'f'

TeclaG EQU 'g'

Tecla1 EQU '1'

Tecla2 EQU '2'

Tecla3 EQU '3'

Tecla4 EQU '4'

Tecla5 EQU '5'

Tecla6 EQU '6'

Tecla7 EQU '7'

Tecla8 EQU '8'

Tecla9 EQU '9'

Tecla0 EQU '0'

ORG 0

Inicio

bsf STATUS,RP0 ; Acceso al Banco 1.

clrw

bcf Salida ; Esta lnea se configura como salida.

bcf Salida1

bcf Salida2

bcf Salida3

bcf Salida4

bcf Salida5

bcf Salida6

bcf Salida7

bsf Entrada

bsf Entrada2

movlw d'256'

movwf temporal
movlw b'00000011'

movwf OPTION_REG ; Prescaler de 8 asignado al TMR0

call RS232_Inicializa ; van a utilizar en la comunicacin con el puerto

bcf STATUS,RP0 ; Acceso al Banco 0.

Principal

bsf Salida ; La salida pasa a nivel alto

call Timer0_HIGH

bcf Salida ; La salida pasa a nivel bajo

call Timer0_LOW

bsf Salida1 ; La salida pasa a nivel alto

call Timer1_HIGH

bcf Salida1 ; La salida pasa a nivel bajo

call Timer1_LOW

bsf Salida2 ; La salida pasa a nivel alto

call Timer2_HIGH

bcf Salida2 ; La salida pasa a nivel bajo

call Timer2_LOW

bsf Salida3 ; La salida pasa a nivel alto

call Timer3_HIGH

bcf Salida3 ; La salida pasa a nivel bajo

call Timer3_LOW

bsf Salida4 ; La salida pasa a nivel alto

call Timer4_HIGH

bcf Salida4 ; La salida pasa a nivel bajo

call Timer4_LOW
bsf Salida5 ; La salida pasa a nivel alto

call Timer5_HIGH

bcf Salida5 ; La salida pasa a nivel bajo

call Timer5_LOW

bsf Salida6 ; La salida pasa a nivel alto

call Timer6_HIGH

bcf Salida6 ; La salida pasa a nivel bajo

call Timer6_LOW

bsf Salida7 ; La salida pasa a nivel alto

call Timer7_HIGH

bcf Salida7 ; La salida pasa a nivel bajo

call Timer7_LOW

call Timer0_2000us ; durante este tiempo.

call Timer0_2000us ; durante este tiempo.

call Timer0_2000us ; durante este tiempo.

call Timer0_2000us ; durante este tiempo.

btfsc Entrada

goto SeteaServos2

btfsc Entrada1

goto Demo

;btfsc Entrada2

;goto Demo2

goto Principal
Demo

movlw d'200'

movwf servo1_general

movlw d'005'

movwf servo2_general

movlw d'240'

movwf servo3_general

movlw d'008'

movwf servo4_general

goto Principal

Demo2

movlw d'012'

movwf servo1_general

movlw d'215'

movwf servo2_general

movlw d'005'

movwf servo3_general

movlw d'214'

movwf servo4_general

return

Timer0_HIGH

movf servo1_general,W

sublw d'256' ;256-servo

movwf TMR0
bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Timer0_tempp0

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Timer0_tempp0 ; Todava no. Repite.

return

Timer0_LOW

movf servo1_general,W

movwf TMR0

bcf INTCON,T0IF

Timer0_temp20

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Timer0_temp20 ; Todava no. Repite.

return

Timer1_HIGH

movf servo2_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp1H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp1H ; Todava no. Repite.

return

Timer1_LOW

movf servo2_general,W

movwf TMR0

bcf INTCON,T0IF

Temp1L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp1L ; Todava no. Repite.

return
Timer2_HIGH

movf servo3_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp2H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp2H ; Todava no. Repite.

return

Timer2_LOW

movf servo3_general,W

movwf TMR0

bcf INTCON,T0IF

Temp2L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp2L ; Todava no. Repite.

return

Timer3_HIGH

movf servo4_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp3H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp3H ; Todava no. Repite.

return

Timer3_LOW
movf servo4_general,W

movwf TMR0

bcf INTCON,T0IF

Temp3L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp3L ; Todava no. Repite.

return

Timer4_HIGH

movf servo5_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp4H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp4H ; Todava no. Repite.

return

Timer4_LOW

movf servo4_general,W

movwf TMR0

bcf INTCON,T0IF

Temp4L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp4L ; Todava no. Repite.

return

Timer5_HIGH
movf servo6_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp5H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp5H ; Todava no. Repite.

return

Timer5_LOW

movf servo6_general,W

movwf TMR0

bcf INTCON,T0IF

Temp5L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp5L ; Todava no. Repite.

return

Timer6_HIGH

movf servo7_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp6H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp6H ; Todava no. Repite.

return

Timer6_LOW

movf servo7_general,W

movwf TMR0
bcf INTCON,T0IF

Temp6L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp6L ; Todava no. Repite.

return

Timer7_HIGH

movf servo8_general,W

sublw d'256'

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.

Temp7H

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp7H ; Todava no. Repite.

return

Timer7_LOW

movf servo8_general,W

movwf TMR0

bcf INTCON,T0IF

Temp7L

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Temp7L ; Todava no. Repite.

return

Timer0_2000us

movlw d'6' ; Carga el Timer 0.

movwf TMR0

bcf INTCON,T0IF ; Resetea el flag de desbordamiento del TMR0.


Timer0_Rebosamiento

btfss INTCON,T0IF ; Se ha producido desbordamiento?

goto Timer0_Rebosamiento ; Todava no. Repite.

return

; Comprobando con la ventana Stopwatch del simulador se obtienen unos tiempos para la onda

; cuadrada de 511 s para el nivel alto y 513 s para el bajo.

ascii ;carga w con el valor real a partir de w

xorlw Tecla0 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'0'

xorlw Tecla1 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'1'

xorlw Tecla2 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'2'

xorlw Tecla3 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'3'

xorlw Tecla4 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'4'

xorlw Tecla5 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'5'

xorlw Tecla6 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'6'
xorlw Tecla7 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'7'

xorlw Tecla8 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'8'

xorlw Tecla9 ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

movlw d'9'

return

SeteaServos2

btfss Entrada

goto Principal

call RS232_LeeDato ; Espera recibir un carcter.

movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.

xorlw TeclaA ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

call CargaSumaUDCA

movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada.

xorlw TeclaB ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

goto CargaSumaUDCB ; S, se desea movimiento hacia adelante.

movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada.

xorlw TeclaC ; Es la tecla del movimiento hacia adelante?


btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

goto CargaSumaUDCC ; S, se desea movimiento hacia adelante.

movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada.

xorlw TeclaD ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

goto CargaSumaUDCD ; S, se desea movimiento hacia adelante.

movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada.

xorlw TeclaE ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

goto CargaSumaUDCE ; S, se desea movimiento hacia adelante.

movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada.

xorlw TeclaF ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

goto CargaSumaUDCF ; S, se desea movimiento hacia adelante.

movf TeclaPulsada,W ; Guarda el contenido de la tecla pulsada.

xorlw TeclaG ; Es la tecla del movimiento hacia adelante?

btfsc STATUS,Z ; si lo es entonces salta a la inztruccion goto de llamada

goto CargaSumaUDCG ; S, se desea movimiento hacia adelante.

goto SeteaServos2

CargaSumaUDCA

call PideCifras

call SumaUDC_UPDATE

movwf servo1_general

goto Principal
CargaSumaUDCB

call PideCifras

call SumaUDC_UPDATE

movwf servo2_general

goto Principal

CargaSumaUDCC

call PideCifras

call SumaUDC_UPDATE

movwf servo3_general

goto Principal

CargaSumaUDCD

call PideCifras

call SumaUDC_UPDATE

movwf servo4_general

goto Principal

CargaSumaUDCE

call PideCifras

call SumaUDC_UPDATE

movwf servo5_general

goto Principal

CargaSumaUDCF

call PideCifras

call SumaUDC_UPDATE

movwf servo6_general

goto Principal

CargaSumaUDCG

call PideCifras

call SumaUDC_UPDATE

movwf servo7_general

goto Principal
CargaSumaUDCH

call PideCifras

call SumaUDC_UPDATE

movwf servo8_general

goto Principal

PideCifras

clrw

call RS232_LeeDato

call ascii

movwf Centenas

call RS232_LeeDato

call ascii

movwf Decenas

call RS232_LeeDato

call ascii

movwf Unidades

clrw

return

;RUTINA PARA PODER RECIBIR DATOS

Rx ; serie RS232.

call RS232_LeeDato ; Espera recibir un carcter.

movwf GuardaDato ; Guarda el dato recibido.

movf GuardaDato,W ; Y ahora lo reenva otra vez al ordenador.


call RS232_EnviaDato

return

SumaUDC_UPDATE

clrw

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0
addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0
addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0

addwf Centenas,0
addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Decenas,0

addwf Unidades,0

return

INCLUDE "RS232"

INCLUDE "RETARDOS"

END

Vous aimerez peut-être aussi