oferta

martes, 28 de diciembre de 2010

INVERSION DE GIRO: MOTOR DC

En robotica se emplea mucho el control de motores DC para hacer la inversion de giro, como sabemos un motor de corriente continua tiene 2 polos: positivo y negativo, para hacer la inversion del motor solo tenemos que invertir la polaridad de la fuente y conectar al motor DC.

Inversion de giro para motor DC con el pic16f84a con puente H



Este programa controla un motor DC mediante un swicth en el puertob (Rb0) y utilizando Rb1 y Rb2 del puertob como salida para enviar los pulsos que invertiran el giro del motor DC, en el circuito deberan conectar ademas el cristal de 4 mhz y su respectiva alimentacion de 5Vdc.
Q1,Q2,Q3,Q4=BC548 para motores pequeños y TIP41 para motores grandes.
R1,R2,R3,R4= 300 ohmios.

;Programa para inversion de giro de motor DC
list p=16f84a           ; declaramos el pic que usaremos
; Declaracion de registros a usar
puertob  equ 0x06
trisb       equ 0x86
status     equ  0x03
; Configuracion de puertos
org        0x00
bsf        status,5               ; nos vamos al banco 1 de la memoria del pic
movlw   b'0000001'        ; guardamos en el registro W a  Rb0 como entrada
movwf   trisb                   ; y Rb1 a Rb7 como salidasy  mandamos lo de W a trisb
bcf        status,5              ; regresamos al banco 0 de la memoria del pic
; Programa principal
inicio   btfsc puertob,0                   ;  testeamos Rbo (pin6) si esta en 0 o 1
           goto izquierda                    ;  vamos a la etiqueta izquierda
           goto derecha                      ; vamos a la etiqueta derecha
izquierda   bsf puertob,1                ;  encendemos pin Rb1
                 bcf puertob,2               ;  y apagamos Rb2 para giro a la izquierda
                 goto     inicio                ; regresamos a inicio a ver si cambio el swicth
derecha    bcf  puertob,1               ; apagamos pin Rb1
                bsf  puertob,2               ; y encendemos Rb2 para invertir giro de motor
                goto     inicio                 ; regresamos a inicio a ver si cambio el swicth
                end                               ; y terminamos

Un proyecto mas interesante aplicando el control de un motor DC , ascensor de 4 niveles, para que lo bajen.

http://www.proyectoselectronicoos.blogspot.com/

sábado, 27 de marzo de 2010

CONTROL MOTOR PASO A PASO CON PIC


UN POCO DE TEORIA

Los motores paso a paso son ideales para la construcción de mecanismos en donde se requieren movimientos muy precisos. En este capítulo trataremos solamente los motores P-P del tipo de imán permanente, ya que estos son los mas usados en robótica.

Principio de funcionamiento

Básicamente estos motores están constituidos normalmente por un rotor sobre el que van aplicados distintos imanes permanentes y por un cierto número de bobinas excitadoras bobinadas en su estator.
Las bobinas son parte del estator y el rotor es un imán permanente. Toda la conmutación (o excitación de las bobinas) deber ser externamente manejada por un controlador.
Existen dos tipos de motores paso a paso de imán permanente:

Motor bipolar. tiene generalmente cuatro cables de salida (ver figura 1). Necesitan ciertos trucos para ser controlados, debido a que requieren del cambio de dirección del flujo de corriente a través de las bobinas en la secuencia apropiada para realizar un movimiento.
En figura 3 podemos apreciar un ejemplo de control de estos motores mediante el uso de un puente en H (H-Bridge). Como se aprecia, será necesario un H-Bridge por cada bobina del motor, es decir que para controlar un motor Paso a Paso de 4 cables (dos bobinas), necesitaremos usar dos H-Bridges iguales al de la figura 3 . El circuito de la figura 3 es a modo ilustrativo y no corresponde con exactitud a un H-Bridge. En general es recomendable el uso de H-Bridge integrados como son los casos del L293 .


Motor unipolar.- Estos motores suelen tener 6 o 5 cables de salida, dependiendo de su conexionado interno (ver figura 2). Este tipo se caracteriza por ser más simple de controlar.





figura2


Identificacion de bobinas en motores unipolares
  • Seleccionar un cable y conectarlo a masa. Ese será llamado cable A.
  • Manteniendo el cable A conectado a masa, probar cuál de los tres cables restantes provoca un paso en sentido antihorario al ser conectado también a masa. Ese será el cable B.
  • Manteniendo el cable A conectado a masa, probar cuál de los dos cables restantes provoca un paso en sentido horario al ser conectado a masa. Ese será el cable D.
  • El último cable debería ser el cable C. Para comprobarlo, basta con conectarlo a masa, lo que no debería generar movimiento alguno debido a que es la bobina opuesta a la A.
Secuencias para manejar motores paso a paso unipolares

A continuación se puede ver la tabla con la secuencia necesaria para controlar motores paso a paso del tipo unipolares
Primera secuencia de pasos para motores PAP

















Segunda secuencia de pasos para motores PAP




























CONTROL DE UN MOTOR UNIPOLAR (en un solo sentido)
En la figura podemos apreciar un ejemplo de conexionado para controlar un motor paso a paso unipolar mediante el uso de un ULN2803 el cual es una array de 8 tansistores tipo Darlington capaces de manejar cargas de hasta 500mA. Las entradas de activación (Activa A, B , C y D) se conectan al puerto B del pic16f84A , pin6=A, pin7=B, pin8=C y pin9=D respectivamente

LIST P=16F84A
;DECLARACION REGISTROS A USAR
status equ 0x03
portb equ 0x06
trisb equ 0x86
reg1 equ 0x0c                  ;registro usado para el retardo
reg2 equ 0x0d                  ;registro usado para el retardo
;CONFIGURACION PUERTO B COMO SALIDA
org    0x00                       ;origen del programa
bsf status,5                       ;vamos al banco1 de la memoria RAM
clrf trisb                            ;puerto queda configurado como salida
bcf status,5                       ;regresamos al banco0 de la memoria RAM
;PROGRAMA PRINCIPAL
inicio movlw b'00001000'    ;cargamos W con b'00001000'
movwf portb                         ;mandamos lo que hay en W al puerto B
call retardo                            ;hacemos una pausa
movlw b'00000100'
movwf portb
call retardo
movlw b'000000010'
movwf portb
call retardo
movlw b'00000001'
movwf portb
call retardo
goto inicio
retardo
MOVLW 0x90                   ;cargamos (w) con el hexadecimal 90
MOVWF reg1                    ;mover lo que hay en W al registro1
MOVLW 0x90                   ;cargamos (w) con hexadecimal 90
MOVWF reg2                    ;mover que hay en W al registro2
uno DECFSZ reg1,1           ;Decrementa registro1 y el resultado guardalo en el mismo
GOTO uno
dos DECFSZ reg2,1           ;decrementa registro2 y el resultado guardalo en el mismo
GOTO dos
RETURN                            ;retorna de donde lo llamaron
end                                      ;Fin del programita

Aqui tienen el archivo HEX. probado:
http://www.4shared.com/file/41AN3W3e/motorunipolar.html


EXPLICACION DEL PROGRAMA
Vamos hacer uso de la primera secuencia de pasos para controlar el motor PAP en un solo sentido, fijese que son 4 pasos para que complete una secuencia, por lo que podemos repetir estos 4 pasos con una etiqueta inicio e indicar que todo se repite con GOTO inicio.
con MOVLW b'00001000' guardamos la primera secuencia de paso en el registro auxiliar W y luego con MOVWF portb enviamos al puerto B la secuencia guardada en W anteriormente, en este momento se encendera solo el pin9 del puerto B y los restantes pines estaran apagados y finalmente con CALL retardo hacemos una pausa para poder visualizar el encendido


Las tres instruccciones siguientes hacen lo mismo ejecuntando el paso 2 para motores PAP (ver tabla de pasos) y solo encendera el pin8 del pic, y asi las 3 instrucciones siguientes ejecutan el paso3 y encendera el pin7 del pic, ylas 3 ultimas instrucciones ejecutan el paso4 y encendera el pin6 del pic.
Para que todo este proceso se repita solo colocamos una etiqueta inicio y hacemos bucle con GOTO inicio.


Led parpadeante


DIODO LED PARPADEANTE EN EL PUERTO B (PIN 6= RBO)

 

El led se prendera y apagara  y no lo podremos notar porque es tan rapido la ejecucion del programa que el pic ejecuta un millon de instrucciones en 1 segundo, entonces necesitamos que el PIC entre el apagado y encendido haga una pausa o retardo para poder visualizar el encendido y apagado del led, para eso haremos otro pequeño programita que retarde el encendido y apagado del led. Lo llamaremos RETARDO para lo cual usaremos 2 registros; y los llamaremos reg1 y reg2 respectivamente (puede ser cualquier nombre).Con esta rutina de RETARDO,  el pic16f84 pierde tiempo haciendo un conteo descendente con 2 registros, cada registro de 8 bits es desde  0 hasta 255 =11111111=0xff, entonces con 2 registros aumentamos el tiempo de retardo :
*************************************************************************

LIST P=16F84A              ; indicamos el PIC que utlizaremos;
;DECLARACION REGISTROS A USAR
STATUS EQU 0x03        ; Registros de la memoria RAM
PORTB   EQU 0x06        ;con  su direccion hexadecimal
TRISB     EQU 0x86
reg1         EQU 0X0C      ;registro usado para el retardo
reg2         EQU 0X0D      ;registro usado para el retardo

org         0x00                  ;inicio del programa


; CONFIGURAMOS PUERTO B COMO SALIDA
BSF STATUS,5                ;vamos al banco1
CLRF TRISB                    ;puerto b es salida(colocamos '00000000')
BCF STATUS,5               ;regresamos banco0

;PROGRAMA PRINCIPAL
inicio  BSF PORTB,0         ;enviamos un "1"(5 voltios) al pin6, prende el led
          call RETARDO         ;se dirige a subrutina RETARDO
          BCF PORTB,0         ;enviamos un "0" (0 voltios) al pin6, apaga el led
         call RETARDO          ;se dirige a subrutina RETARDO
         GOTO inicio

RETARDO
MOVLW 0x90                  ;cargamos (w) con el hexadecimal 90
MOVWF reg1                   ;mover lo que hay en W al registro1
MOVLW 0x90                  ;cargamos (w) con hexadecimal 90
MOVWF reg2                   ;mover lo que hay en W al registro2
uno DECFSZ reg1,1          ;Decrementa registro1 y el resultado guardalo en el mismo
      GOTO uno
dos DECFSZ reg2,1          ;decrementa registro2 y el resultado guardalo en el mismo
      GOTO dos
      RETURN                    ;retorna de donde lo llamaron
     END
********************************************************************

Si quisieramos que el parpadeo sea mas lento tenemos que hacer un conteo descendente de mayor cantidad en este caso tendriamosque cambiar 0x90 por 0xFF en reg1 y reg2.

sábado, 20 de marzo de 2010

Primer programa: encender un led


PIC16F84A.- Es un circuito integrado programable, el cual esta compuesto basicamente de memorias RAM y EEPROM ,buses de comunicacion, unidad logica aritmetica(ALU) y puertos que sirven como entrada y salida, las flechas indican si los pines son de entrada, salida o bidireccionales(ingresan y salen datos) 


Instrucciones del PIC16F84
ADDWF f,d ........................Suma W con f
ANDWF f,d ........................Lógica AND W con f
CLRF f ...............................Borra f (pone todos los bits a 0)
CLRW ................................Borra W
COMF f,d ...........................Complementa f (Invierte)
DECF f,d ............................Decrementa f
INCF f,d .............................Incrementa f
Iorwf f,d .............................Lógica OR entre W y f
MOWF f .............................Mueve W a f
MOVF f ..............................Mueve f
NOP ....................................No opera (no hace nada )
RLF f,D ...............................Rota f a la izquierda a través del acarreo
RRF f,D ...............................Rota f a la derecha a través del acarreo
SUBWF f,d .........................Resta W a f
SWAPF f,d .........................Intercambia nibbles
XORWF f,d ........................Lógica WOR entre W y f
BCF f,d ...............................Borra el bit b (pone a 0) de f
BSF f,d ...............................Activa (pone a 1) el bit b de f
BTFSC f,d ..........................Explora un bit de f y brinca si vale 0
BTFSS f,d ..........................Explora un bit de f y brinca si vale 1
DECFSZ f,d .......................Decrementa f y si vale 0 brinca
INCFSZ f,d ........................Incrementa f y si vale 1 brinca
ADDLW k ..........................Suma inmediata de K con W
ANDLW k ..........................AND inmediata de K con W
IORLW k ...........................OR inmediata de K con W
MOVLW k .........................Mueve a W el valor inmediato de K
SUBLW k ...........................Resta W del valor inmediato K
XORLW k ..........................XOR exclusiva de W con el valor K
CALL k ...............................Llamadas a subrutina
CLRWDT ...........................Refresca el perro guardián
GOTO k .............................Salto incondicional
RETFIE .............................Retorno de interrupción (GIE=1)
RETLW k ..........................Retorno de subrutina y carga W=k
RETURN ...........................Retorno de subrutina
SLEEP ...............................Pasa al modo reposo

NOTA:
w: registro trabajo auxiliar     f: registro fuente         d: destino

Memoria RAM.- Es mapa de registros, cada registro especial tiene su funcion de momento sólo nos preocupa saber cómo están distribuidos y qué posición (hexadecimal) ocupan, por ejemplo un registro que usaremos bastante es STATUS y si nos fijamos en memoria de datos su direccion hexadecimal es 03h = 0x03, igual PORTA es 05h = 0x05 y asi sucesivamente.


NUESTRO PRIMER PROGRAMA: ENCENDER UN DIODO LED EN EL PUERTO B (PIN 6= RBO)
Haremos el primer programa que considero el mas simple, esto es encender un diodo led del puerto B (pin Nª 6) del PIC. Para esto solo necesitamos saber 5 instrucciones , conocer la distribución memoria RAM(memoria de datos) y por supuesto conocer los pines del PIC16f84a para armar el siguiente circuito.
Ademas la estructura de un programa assembler para un pic se divide en 3 partes: etiquetas, instrucciones y los comentarios que van despues del punto y coma ( ; ) el pic no tomara en cuenta estos comentarios al ejecutar las instrucciones.


LIST P=16F84A                      ;indicamos el PIC que utlizaremos

; DECLARACION REGISTROS A USAR
STATUS EQU 0x03               ; Registros de la memoria RAM
PORTB   EQU 0x06               ; con su direccion hexadecimal
TRISB    EQU 0x86

; CONFIGURAMOS PUERTOS DE ENTRADA O SALIDA
ORG 0x00                              ;Iniciamos el programa en el origen
BSF STATUS,5                     ;vamos al banco1
CLRF TRISB                         ;puerto b es salida(colocamos '00000000')
BCF STATUS,5                     ;regresamos banco0

; PROGRAMA PRINCIPAL
BSF PORTB,0                       ;pone un “1” ( enciende) en rbo =pin6
END                                       ;fin de programa

Comentarios sobre el programa:

STATUS, es un registro de 8 bits , desde B0 hasta B1 cada bit tiene su funcion lo cual veremos mas adelante, por ahora solo nos interesa el bit 5 (RP0) este bit indica la posicion de la memoria RAM (que esta dividida en 2 bancos)
si  RP0=0 nos estamos ubicando en el banco0,
si  RP0=1 nos ubicamos en el banco1.
Asi podemos acceder a los diferentes registros ubicados en cada banco, su direccion hexadecimal es 03h = 0x03










PORTB, registro de 8 bits cuya direccion es 06h (6 en hexadecimal, que tambien se puede escribir 0x06) y corresponde a cada pin del PIC16f84a
o RB0 ==> PORTB,0 (pin 6 del pic)
o RB1 ==> PORTB,1 (pin 7 del pic)
o RB2 ==> PORTB,2 (pin 8 del pic)
o RB3 ==> PORTB,3 (pin 9 del pic)
o RB4 ==> PORTB,4 (pin 10 del pic)
o RB5 ==> PORTB,5 (pin 11 del pic)
o RB6 ==> PORTB,6 (pin 12 del pic)
o RB7 ==> PORTB,7 (pin 13 del pic)

TRISB, es otro registro de 8 bits, su funcion es decir si los bits del puerto B van a trabajar como entrada(lectura) o de salida (escritura). Si colocamos ceros (b'00000000') en este registro quiere decir que el puerto B trabajara como salida de datos. Si colocamos Unos (b'11111111')entonces el puerto B trabajara como entrada. Fijate en el mapa de memoria y veras que su direccion hexadecimal es 86h.
Podemos combinar si queremos que trabaje como entrada y salida de datos el puerto B.

Sobre las instrucciones

ORG 0,  la memoria de un pic consta de varias celdas o bits, es logico que cada celda tengauna direccion para que el pic pueda ubicarlas y trabajar con ellas, con ORG 0 estamos indicando que trabajaremos en el inicio o posicion 1 de la memoria del PIC
BSF STATUS,5  colocamos un "1" en el registro status en la posicion 5 (que se llama RP0) para ir al banco1 de la memoria( por defecto esta en el banco0) y luego trabajar con el registro TRISB
CLRF TRISB,  "Limpiamos" o colocamos '00000000' en el registro trisb para que podamos enviar datos por el puerto B. (recordar que el trisb decide si el puerto B recibe o envia datos)
BCF STATUS,5  colocamos un '0' en el registro status en la posicion 5 (llamado RP0) para volver al banco0
BSF PORTB,0  aqui encendemos el led (Rb0=pin6) del puerto
END  siempre se coloca para indicar el fin del programa

Bien espero hayan entendido este pequeño programa, he tratado de hacerlo lo mas simple, si tuvieran dudas gustoso les absolvere.