martes, 2 de octubre de 2007

Modulacion de ancho de pulso (PWM)

Entrando en materia, tenemos que tener presente como vamos a utilizar los motores para el movimiento de nuestro robot. Las variables que nos va a pasar el player/stage a los motores serán la velocidad lineal y la velocidad angular. Con estas dos variables el robot debe de poder moverse de un lado a otro con distintas velocidades.

La primera solucion para ello era utilizar motores paso a paso, ya que con ello podemos seleccionar los pasos que den los mismos tanto haccia adelante y hacia atras. Consultando con un pas de la universidad de alicante me acondejó que no lo hiciera así, ya que son motores muy bruscos y no muy recomendables para el movimiento de un robot, aunque si para la posición de algo.

A si es que he preferido meterme con el "tinglao" de motores de corriente continua (motores dc), es podible que eso sea lo que necesita nuestro robot. El problema reside es que para realizar los giros, un motor debe de ir a distinta velocidad que el otro. Para hacer esto recurrimos al pwm (pulse width modulation) modulacion del ancho del pulso.

PWM es una técnica en la que se modifica el ciclo de trabajo de una señal periódica. De esta manera conseguimos que trabaje mas o menos tiempo un motor. El microcontrolador trabajará por nivel alto, cuanto mas tiempo este en nivel alto más velocidad:

Para usar esto necesitamos un microcontrolador de gama media (no lo mas baratos), el elegido en nuestro caso es el del robot (pic 16f876) con dos salidas moduladas con pwm.

Para probarlo nhemos creado un programita que aumenta el % de nivel alto hasta el 100% y despues disminuye poco a poco hasta el 0% y así indefinidamente. El codigo del microcontrolador para esta tarea lo programamos de la siguiente manera:

;Includes
LIST P=16f876
RADIX HEX
INCLUDE "P16F876.INC"

;Configuracion quitar
; __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF


cont1 equ 0x0E ; Numero de ticks a esperar
cont2 equ 0x0F ; Numero de ticks a esperar
cont3 equ 0x10 ; Numero de ticks a esperar

ORG 0x00

GOTO INICIO

ORG 0x05

; Initialisierung
INICIO

; Preparacion del PWM
; Predivisor 16:1 y Timer2 on
BSF T2CON, T2CKPS1 ; Preescalador 16:1
BSF T2CON, TMR2ON ; Activa el Timer2


; Frecuencia a 1,22 KHz
BSF STATUS, RP0 ;Cambio al banco 1
MOVLW D'255' ;255 en decimal
MOVWF PR2 ;1.22 kHz
BCF STATUS, RP0 ;Cambio al banco 0


; Ponemos la potencia al 50%
MOVLW D'127' ;127 en decimal
MOVWF CCPR1L ;50%

; RC2/CCP1 salida
BSF STATUS, RP0 ;Banco 1
BCF TRISC, 2 ;RC2 salida
BCF STATUS, RP0 ;Volvemos al Banco 0

; Inicializamos el modo PWM de CCP1
CLRF CCP1CON ;Limpiamos reg CCP1
BSF CCP1CON, CCP1M3 ;CCP1 en modo pwm 11XX
BSF CCP1CON, CCP1M2

;Aumento

AUMENTO
CALL RETARDO
INCFSZ CCPR1L,1 ;Incrementamos uno
GOTO AUMENTO ;Va aumentando
GOTO DECREMENTA ;Toca decrementar

;decrementa
DECREMENTA
CALL RETARDO
DECFSZ CCPR1L,1 ;Decrementamos uno
GOTO DECREMENTA ;Va decrementando
GOTO AUMENTO ;Toca aumentar


;************************************************************
;* Rutina de espera.
;* ENTRADA:
;* -W: Numero de ticks a esperar. Cada tick es de 10ms
;************************************************************

RETARDO
movlw D'2'
movwf cont3
CICLO3 movlw D'20'
movwf cont2
CICLO2 movlw D'33'
movwf cont1
CICLO decfsz cont1,1
goto CICLO
decfsz cont2,1
goto CICLO2
decfsz cont3,1
goto CICLO3


RETURN ; Si, terminar


; FIN
end

A continuación podemos ver un video de la ejecucion del programa. La prueba se hace con un led. Cuanto mas pwm el led se ilumina mas y cuando vamos bajando vemos como el led disminuye su iluminacion hasta apagarse y luego al reves. Además podemos contemplar los voltages como aumenta y disminuye acorde con el led:

2 comentarios:

Anónimo dijo...

esta talega

Anónimo dijo...

This is very interesting, You are a very skilled blogger.
I've joined your feed and look forward to seeking more of your magnificent post. Also, I've shared your site
in my social networks!

Feel free to surf to my homepage Restaurants in Orange County