Una Controladora Bipolar para motores Paso a Paso de Potencia, controlada con un microcontrolador 16F627/8...
Este circuito lo he diseñado yo después de estudiar varios esquemas por internet y realizar varias pruebas con el. No es muy sofisticado, pero al llevar un microcontrolador que es quien gestiona los demás componentes, garantiza una fiabilidad de funcionamiento en las funciones que le he programado...
Funciones que incorpora: . Trabaja con dos señales de control, Sentido y Paso... . Bloqueo del motor cortocircuitando todas las bobinas -> no consume corriente en reposo... . Sistema de activación de semi-paso descompensado... Funciones que NO incorpora: . Sistema de protección contra sobre intensidades (se quema si el motor consume mas de lo que soportan los transistores transistores)... )...
Os recomiendo que veáis todos los artículos relacionados con los motores PaP que tengo en mi pagina para que podáis comprender mejor el funcionamiento de esta controladora...
DESCRIPCIÓN DE FUNCIONAMIENTO... Básicamente se trata de hacer un aparato que sea capaz de estar pendiente de cuando se le da la orden de dar un paso y según la señal del sentido en que debe darlo, realice la activación y desactivacion del array de puentes H, formados por los transistores Mosfets, para que las bobinas del motor bipolar queden activadas en la posición deseada. Pues bien, todo esto lo hacemos vía software ya que hoy en día disponemos de herramientas tan útiles como los microcontroladores , que no son mas que unos pequeños circuitos integrados que tienen la capacidad de ser programados para que podamos realizar con ellos la actividad que seamos capaces de programarles. En este caso se ha utilizado el Micro 16F628 (también se puede usar el 16F627 pero es igual que el 628 y con menos memoria) de la casa Microchip ( http://www.microchip.com ) ya que sus características son idóneas para este tipo de aplicación. Para mas datos os remito a la pagina de su fabricante. Lo bueno a destacar, es que se puede programar todas las veces que queramos...
Antes de seguir con el micro, paso a describir brevemente lo que es un transistor MOSFET: Como yo no soy un experto en electrónica, solo me he quedado con la capacidad de conmutar grandes cantidades de corriente sin que para ello se necesite gran potencia de activación. Según esquema adjunto, un transistor mosfet viene, entre otros, con este encapsulado. Para no extendernos mucho, el mosfet tiene tres patas, la para Gate es la de activación, que es la que será controlada por el microcontrolador. La pata Source, es la entrada de corriente y la Drain, es la de salida. con esto así, podemos encontrar transistores que trabajan conmutando el positivo, y los que conmutan el negativo.. Para este esquema se ha usado Mosfets IRFZ44N
para conmutar el negativo e IRF5305 para el positivo.
*Para mas datos, ya sabéis, http://www.google.com/
EL ESQUEMA DE LA CONTROLADORA... Pues, a partir de aquí, lo demás es electrónica auxiliar que es necesaria para el funcionamiento del regulador. Un esquema detallando todos sus componentes es el siguiente:
Pinchar sobre la imagen para descargarse el PDF con el esquema...
PRECAUCIONES:
Como se ha dicho antes, esta controladora maneja grandes cantidades de corriente por lo que hay que tener mucho cuidado con la polarización de la fuente de alimentación y con el consumo del os motores, ya que ambas cosas pueden hacer volara por los aires todo el invento...
DESCRIPCIÓN DEL PROGRAMA DEL PIC 16F628: Por si todavía no se sabe, el motor paso a paso funciona de la siguiente forma: Las bobina de un motor paso a paso están dispuestas de forma esquemáticas en le motor de la forma en como indican las imágenes a la izquierda. Como se aprecia, hay dos modos simples de controlar los motores. Uno es bobina a bobina Simple-Activacion independientemente, llamado Simple Activación. Y el segundo es activar las bobinas dos a dos para que el rotor se posicione entre las dos bobinas y así el motor tiene mas fuerza pero consume el doble. Ambas formas tiene un problema de control, y no es otro que el debido a que el rotor debe dar un salto relativamente grande entre un paso y otro Doble-Activacion haciendo que el sistema presente un problema de resonancia que puede afectar a la perdida de pasos del motor a frecuencias mas lentas que la máxima que nos permite el motor.
Para solventar esto en cierta forma, lo que hago yo es trabajar en semipaso descompensado. Esto quiere decir que el motor trabaja en simple activación y en doble activación. Veamos que es lo que hago: Suponiendo que el rotor esta posicionado en la bobina 1 ,como si se tratara de Simple Activación solamente, a la hora de querer que el rotor pase a la posición de la bobina 2 lo que hago es activar la 2 sin desactivar la 1, así consigo que el motor arranque con mas fuerza y pase a la posición intermedia y luego desactivo la bobina 1 dejando el rotor ya en la posición de la bobina 2. Y lo llamo descompensado ya que el tiempo que estan las dos bobinas activadas a la vez es distinto al que
esta la bobina destino activada ya que la doble activacion solo la uso para el instante de vencer la inercia del rotor y ya con la inercia vencida, no necesito mas que activar la bobina de destino para que el rotor se pare...
Pues ya con esto claro, paso a explicar como funciona el programa del pic. El pic esta programado para llevar la cuenta de los pasos que esta dando y en funcion de esto realizar la activacion de los Mosfets para que las bobinas de los motores queden activadas correctamente. PAra hacerlo compatible con todos los soft cncdel mercado, esta controladora trabaja con dos señales, la de Paso y la de Sentido. Cada vez que la señal de dar Paso se activa, el micro comprueba hacia donde lo tiene que dar en funcion del estado de la señal de Sentido. Una vez hecho esto, el programa realiza la activacionen Simple Activacion del estado actual durante un periodo de 0,25ms ya que las bobinas son apagadas cuando el motor lleva un cierto tiempo sin girar.Luego de estos 0,25ms, el programa realiza la Doble Polarizacion para iniciar el arranque del rotor y asi vencer la inercia del mismo durante un tiempo de 0,75ms y luego pasa a Simple Activacion durante un tiempo de 2ms. Todo esto hace que un paso completo se realice en 3ms, pero estos parametros son modificables en el programa dependiendo del motor que tengamos... Una vez pasados estos 3ms el programa cortocircuitea las bobinas a negativo para que esto produzca un efecto de freno e impida que le motor gire cuando estan las bobinas apagadas. El rotor se bloquea ya que sin estar activadas las bobinas, el motor se comporta como un generador el cual al tener las bobinas cortocircuitadas es como hacer que tenga un consumo elevadisimo el generador haciendo que para mover el rotor haga falta realizar una fuerza muy elevada...
Y bueno, ya en este punto solo me queda poner el código en Ensamblador del PIC para quien quiera utilizarlo lo haga... ; *********************************************************** ******** ; Function: Control de Mosftes para MotorPAP bipolar ; Processor: PIC16F628 at 4 MHz usando internal RC
oscillator ; Hardware: 628papB ; Filename: 628papB.asm ; Author: modificado para mantener doble polarizacion durante 1 ms ; Website: www.terra.es/personal/franpr ;********************************************************** ********* ; ; ; ---- ---; | 0 | ; | | ; | 7| pSent ; | 6| pEnab ; Vss | | Vdd ; MnegH2 |0 7| MnegH0 ; MposH2 |1 6| MposH0 ; MposH3 |2 5| MnegH1 ; MnegH3 |3 4| MposH1 ; --------; ;-----------------------------------------------------------------------------------------; ;Estado de las Bobinas Segun Posicion ; ; Bridge 00 Bridge 01 Bridge 10 Bridge 11 ; OFF OFF OFF OFF OFF ; BRK_N N N N N ; ; P0 P N OFF OFF ; P1 OFF OFF P N ; P2 N P OFF OFF ; P3 OFF OFF N P ; ; P01 P N P N ; P12 N P P N ; P23 N P N P ; P30 P N N P ; ; ; Bridge 00 Bridge 01 Bridge 10 Bridge 11 ; Mosf N Mosf P Mosf N Mosf P Mosf N Mosf P Mosf N Mosf P ; OFF 0 1 0 1 0 1 0 1 ; BRK_N 1 1 1 1 1 1 1 1 ; ; P0 0 0 1 1 0 1 0 1 ; P1 0 1 0 1 0 0 1 1
; P2 1 1 0 0 0 1 0 1 ; P3 0 1 0 1 1 1 0 0 ; ; P01 0 0 1 1 0 0 1 1 ; P12 1 1 0 0 0 0 1 1 ; P23 1 1 0 0 1 1 0 0 ; P30 0 0 1 1 1 1 0 0 ; ; ; PortB 0 1 2 3 4 5 6 7 ; Mosf 4 5 7 6 3 2 1 0 ; ; OFF 0 1 1 0 1 0 1 0 ; BRK_N 1 1 1 1 1 1 1 1 ; ; P0 0 1 1 0 1 1 0 0 ; P1 0 0 1 1 1 0 1 0 ; P2 0 1 1 0 0 0 1 1 ; P3 1 1 0 0 1 0 1 0 ; ; P01 0 0 1 1 1 1 0 0 ; P12 0 0 1 1 0 0 1 1 ; P23 1 1 0 0 0 0 1 1 ; P30 1 1 0 0 1 1 0 0 ; ; Invertido por ULN ; OFF 1 0 0 1 0 1 0 1 ; BRK_N 0 0 0 0 0 0 0 0 ; ; P0 1 0 0 1 0 0 1 1 ; P1 1 1 0 0 0 1 0 1 ; P2 1 0 0 1 1 1 0 0 ; P3 0 0 1 1 0 1 0 1 ; ; P01 1 1 0 0 0 0 1 1 ; P12 1 1 0 0 1 1 0 0 ; P23 0 0 1 1 1 1 0 0 ; P30 0 0 1 1 0 0 1 1 ; ; ;-----------------------------------------------------------------------------------------;-----------------------------------------------------------------------------------------;-----------------------------------------------------------------------------------------LIST P=16F628, R=DEC decimal system #include "P16F628.INC"
; Use the PIC16F628 and
; Include header file
__config _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF &_MCLRE_OFF ; ; -------------------------------; Definicion de DEFINES ; -------------------------------; #define #define
piEnab piSent
#define poOFF #define #define #define #define
poPos0 poPos1 poPos2 poPos3
#define #define #define #define
poPos01 poPos12 poPos23 poPos30
#define poBrkN
PORTA,6 PORTA,7
b'10101001' b'11001001' b'10100011' b'00111001' b'10101100' b'11000011' b'00110011' b'00111100' b'11001100' b'00000000'
;#define isPinHj btfss #define isPinLj btfss ;invertido ya que el buffer de entrada invierte las señales #define isPinHj btfsc ;invertido ya que el buffer de entrada invierte las señales ; ; -------------------------------; Declaracion de variables ; -------------------------------; CBLOCK 0x20 ; Declare variable addresses starting at 0x20 dStepPos dpoPosMed dpoPosAct dataL PDel0 PDel1 ENDC ; ; -------------------------------; Empieza el pograma... ; --------------------------------
; ORG
0x000
; Program starts at 0x000
bcf STATUS,RP1 bcf STATUS,RP0
; RAM PAGE 0 ; RAM PAGE 0
; ; -------------------------------; SET ANALOG/DIGITAL INPUTS PORT A ; -------------------------------; movlw 7 movwf CMCON
; CMCON=7 set comperators off
; ; ---------------------; INITIALIZE PORTS ; ---------------------; movlw b'00000000' movwf PORTA movlw b'00000000' movwf PORTB
bcf STATUS,RP1 bsf STATUS,RP0
movlw b'11111111' movwf TRISA movlw b'00000000' movwf TRISB bcf STATUS,RP1 bcf STATUS,RP0
; set up portA
; set up portB
; RAM PAGE 1 ; RAM PAGE 1
; portA all pins input
; portB all pins output ; RAM PAGE 0 ; RAM PAGE 0
; ; ---------------------; INITIALIZE VARIABLES ; ---------------------; movlw 0x00 ;Inicializo a 1 la Posicion Actual del Rotor movwf dStepPos movlw poPos0 las Bobinas a Pos1
;Inicializo el estado Medio de
movwf
dpoPosMed
; ; ---------------------; INITIALIZE PROGRAMA ; ---------------------; gInicio movlw movwf movlw movwf gWaitP goto
poOFF PORTB poBrkN PORTB isPinHj gWaitP
;Activo Freno
piEnab
movlw poOFF movwf PORTB movf dpoPosAct,W ;Activo las bobinas en Paso Actual antes de dar el paso movwf PORTB isPinHj piSent goto gDoStepDown goto gDoStepUp gDoStep movlw call
.50 DEMORA
movlw poOFF Aqui han pasado 22us. movwf PORTB movf dpoPosMed,W movwf PORTB
;0.25ms en Activacion Previa ;Doy Paso Medio
-> Hasta
movlw call
.150 DEMORA
movlw movwf movf movwf
poOFF PORTB dpoPosAct,W PORTB
;Doy Paso Actual
.8 DEMORA1
;8x0.25ms=2ms ;2ms como Maximo en Simple
movlw call Activacion gD1RetH movlw
poOFF
;0.75ms en Doble Activacion
;Activo Freno
movwf movlw movwf gWaitEL goto goto gD1RetL movlw movwf movlw movwf goto
PORTB poBrkN PORTB isPinLj gWaitEL gWaitP
piEnab
poOFF PORTB poBrkN PORTB gWaitP
; ; ---------------------; Funciones de DarPaso ; ---------------------; gDoStepUp movf dStepPos,W ADDWF PCL, F goto gStep01 goto gStep12 goto gStep23 goto gStep30 gStep01 movwf movlw movwf movlw movwf goto
movlw 0x01 dStepPos poPos01 dpoPosMed poPos1 dpoPosAct gDoStep
gStep12 movwf movlw movwf movlw movwf goto
movlw 0x02 dStepPos poPos12 dpoPosMed poPos2 dpoPosAct gDoStep
gStep23 movwf movlw movwf movlw movwf
movlw 0x03 dStepPos poPos23 dpoPosMed poPos3 dpoPosAct
;Activo Freno
goto gStep30 movwf movlw movwf movlw movwf goto
gDoStep movlw 0x00 dStepPos poPos30 dpoPosMed poPos0 dpoPosAct gDoStep
; ---------------------gDoStepDown movf dStepPos,W ADDWF PCL, F goto gStep03 goto gStep10 goto gStep21 goto gStep32 gStep03 movwf movlw movwf movlw movwf goto
movlw 0x03 dStepPos poPos30 dpoPosMed poPos3 dpoPosAct gDoStep
gStep10 movwf movlw movwf movlw movwf goto
movlw 0x00 dStepPos poPos01 dpoPosMed poPos0 dpoPosAct gDoStep
gStep21 movwf movlw movwf movlw movwf goto
movlw 0x01 dStepPos poPos12 dpoPosMed poPos1 dpoPosAct gDoStep
gStep32 movwf movlw movwf movlw movwf goto
movlw 0x02 dStepPos poPos23 dpoPosMed poPos2 dpoPosAct gDoStep
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; DEMORA movwf PDel0 PLoop0 nop ; este bucle dura 5us nop decfsz PDel0, F goto PLoop0 ; 2 no, loop return ; DEMORA1 movwf PDel1 DEMRA11 movlw .50 movwf PDel0 PLoop2 isPinHj piEnab que piEnab este en HIGH goto PLoop3 decfsz PDel0, F goto PLoop2 decfsz PDel1, F goto DEMRA11 goto gD1RetH DEMRA12 movwf
movlw PDel0
; Bucle de 5 us. Compruebo
; 2 no, loop ; 2 no, loop
.50
PLoop3 isPinLj piEnab que piEnab este en LOW goto gWaitP decfsz PDel0, F goto PLoop3 decfsz PDel1, F goto DEMRA12 goto gD1RetL
; Bucle de 5 us. Compruebo
; 2 no, loop ; 2 no, loop
END
COMO PROGRAMAR EL PIC... Esto se hace con un programa llamado ICPROG, que os lo bajáis de internet buscándolo en algún buscador, y con un programador que venden en las tiendas de electrónica llamado TE20. Con esto así sin mas, se programa el PIC. A continuación paso a poner unas fotos del programa, programador, y las opciones de configuración del programa para este programador... Pinchando en cualquiera de las imágenes siguientes os bajareis el fichero .hex que hace falta para programar el PIC con el programa...
Este es el aspecto del programa que pasa el fichero .hex al pic...
Ventana de opciones del programa según el programador usado. En este caso, el TE20...
Aspecto del programador TE20...
Espero que no sufráis mucho con el circuito y que lo disfrutéis...
Para mi fresadora yo utilizo tres motores como los de la foto de abajo, alimentados con 12V. Con esta sobrealimentación no tengo problemas de temperatura ni en los motores ni en la controladora y la maquina se mueve a 450mm por minuto. No es mucho, pero es suficiente para hacer lo que tengo pensado hacer con ella. Si sobrealimentara mas los motores, podría aumentar la frecuencia de conmutaciónde los pasos del programa del pic y hacer que los motores se muevan mas rápidos pero no me hace falta y así estoy completamente seguro de que la electrónica va sobrada de potencia como para estar tranquilo al dejar la maquina trabajando sola en la cochera mientras yo veo la tele.
Motor Paso a Paso de mi fresadora...
Tres Controladoras Bipolares...
Pagina del autor: http://www.infolaser.net/franpr/