Mediante es circuito se puede comprobar el funcionamiento de un servomotor usando un microcontrolador PIC16F84A.
CIRCUITO
Mediante S1 formado por 3 pulsadores, conectados al puerto B, se controla la posición del eje del servomotor. Es posible posicionarlo en 0º, 90º y 180º, estos valores son aproximados ya que dependen del fabricante del servomotor. El servo se conecta al conector JP1, el pin RA0 envía la señal de control al servo. IC1 es un microcontrolador PIC 16F84, Q1 es un cristal de 4Mhz. Las resistencias R2-R4 no son necesarias si se activan las resistencias internas del puerto B del microcontrolador.
El conector del servo tiene posición, normalmente el cable negro es negativo, el rojo positivo y el cable de control puede ser blanco o amarillo.
PROGRAMA
El programa de control está constituido por un bucle infinito que se ejecuta cada 20ms, para lo cual se usa el temporizador TMR0, al finalizar la cuenta provoca una interrupción que llama a la rutina encargada de generar el pulso de control del servo.
;********************************************************************************* ; Programa: ControlServo.asm ; Fecha: 23/03/2007 ; Autor: Jorge Fernández ; Descripción: Programa para el control de un servo de radio control conectado al ; pin RA0, la posición se puede controlar mediante 3 pulsadores conectados a RB0, ; RB1 y RB2 ;********************************************************************************* ; CONTROL SERVOMOTOR RC CON PIC 16F84A ;********************************************************************************* title "Control Servomotor" __CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF LIST P=16F84A, R=DEC ; 16F84 a 4 MHz errorlevel 0,-305 INCLUDE "p16f84a.inc" LIST ; Registros usados CBLOCK 0x00C ; Bloque de registros comenzando en 0x00C PWM ; Variable para el control PWM POSICION ; Variable para salvar la posición ENDC ; Variables #DEFINE A_0 PORTB,0 ; Pulsador posición 0º #DEFINE A_90 PORTB,1 ; Pulsador posición 90º #DEFINE A_180 PORTB,2 ; Pulsador posición 180º #DEFINE SERVO PORTA,0 ; Pin de control del servo #DEFINE POS_0 124 ; Duración del pulso para posición 0º (1ms) #DEFINE POS_90 186 ; Duración del pulso para posición 90º (1,5ms) #DEFINE POS_180 249 ; Duración del pulso para posición 180º (2ms) ;********************************************************************************* ; INICIALIZACIÓN DEL PIC ;********************************************************************************* org 0 ; Posición de inicio goto Inicio ; Salto a la posición de inicialización PIC org 4 ; Vector interrupción goto Servos ; Tratamiento interrupcion TMR0 ;********************************************************************************* ; Inicialización de los puertos ;********************************************************************************* Inicio clrf PORTA ; Borrar PORTA clrf PORTB ; Borrar PORTB bsf STATUS,RP0 ; Selección banco 1 movlw b'11110' ; movwf TRISA ; Configurar puerto A movlw b'01111111' ; movwf TRISB ; Configurar puerto B bcf STATUS,RP0 ; Selección banco 0 ;********************************************************************************* ; Inicialización de las interrupciones y Configuración TMR0 ;********************************************************************************* movlw b'10100000' ; Habilitar interrupción TMR0 movwf INTCON ; bsf STATUS,RP0 movlw b'000000110' ; Configuración TMR0 movwf OPTION_REG bcf STATUS,RP0 ;********************************************************************************* ; INICIALIZACION DE LOS PARAMETROS ;********************************************************************************* movlw POS_0 movwf POSICION ;********************************************************************************* ; PROGRAMA DE CONTROL PRINCIPAL ;********************************************************************************* main goto main ;********************************************************************************* ; TRATAMIENTO DE LA INTERRUPCION ;********************************************************************************* ;********************************************************************************* ; SERVOS ;********************************************************************************* Servos bsf SERVO ; Activar pin servo bcf INTCON,T0IF ; Habilitar interrupción desbordamiento TMR0 movlw 100 movwf TMR0 movf PORTB,0 andlw b'00000111' btfsc STATUS,Z goto seguir btfsc A_0 movlw POS_0 btfsc A_90 movlw POS_90 btfsc A_180 movlw POS_180 movwf POSICION seguir movf POSICION,W movwf PWM pulso decf PWM ; Decrementar valor registro control servo btfsc STATUS,Z ; ¿Es igual a cero? bcf SERVO ; Desactivar pin servo nop btfss SERVO retfie goto pulso ;************************************************************************************************ ; FIN DEL PROGRAMA ;************************************************************************************************ end
SEÑAL DE CONTROL
La señal que se genera mediante el microcontrolador tiene un periodo de 20 ms y la duración (ancho) del pulso varía entre 1 ms y 2 ms, dependiendo del pulsador que se haya activado, esta señal se conoce como PWM (Pulse Width Modulation).
El funcionamiento del tester se puede comprobar montando el circuito en una placa de prototipos.