Una Controladora Bipolar para motores Paso a Paso de Potencia, controlada con un microcontrolador 16F627/8...

Controladora bipolar microcontrolada para motores de potencia!!!

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)...


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:

  descripcion del circuito con sus componentes

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:

Simple-Activacion


 Doble-Activacion
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 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 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    ; Use the PIC16F628 and decimal system

        #include "P16F628.INC"  ; Include header file

        __config  _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF &_MCLRE_OFF

;
; --------------------------------
; Definicion de DEFINES
; --------------------------------
;

#define    piEnab    PORTA,6
#define    piSent    PORTA,7

#define poOFF    b'10101001'

#define poPos0    b'11001001'
#define poPos1    b'10100011'
#define poPos2    b'00111001'
#define poPos3    b'10101100'

#define poPos01    b'11000011'
#define poPos12    b'00110011'
#define poPos23    b'00111100'
#define poPos30    b'11001100'

#define poBrkN    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          ; RAM PAGE 0
        bcf STATUS,RP0          ; RAM PAGE 0
;
; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;

    movlw 7
    movwf CMCON        ; CMCON=7 set comperators off

;
; ----------------------
; INITIALIZE PORTS
; ----------------------
;
    movlw b'00000000'       ; set up portA
        movwf PORTA   
       
        movlw b'00000000'    ; set up portB
        movwf PORTB


        bcf STATUS,RP1          ; RAM PAGE 1
        bsf STATUS,RP0          ; RAM PAGE 1


        movlw b'11111111'    ; portA all pins input
        movwf TRISA

        movlw b'00000000'
        movwf TRISB        ; portB all pins output

        bcf STATUS,RP1          ; RAM PAGE 0
        bcf STATUS,RP0          ; RAM PAGE 0

;
; ----------------------
; INITIALIZE VARIABLES
; ----------------------
;
    movlw    0x00        ;Inicializo a 1 la Posicion Actual del Rotor
    movwf    dStepPos

    movlw    poPos0        ;Inicializo el estado Medio de las Bobinas a Pos1
    movwf    dpoPosMed

;
; ----------------------
; INITIALIZE PROGRAMA
; ----------------------
;

gInicio
    movlw    poOFF        ;Activo Freno
    movwf    PORTB
    movlw    poBrkN
    movwf    PORTB

gWaitP    isPinHj    piEnab
    goto    gWaitP

    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   .50
    call     DEMORA        ;0.25ms en Activacion Previa

    movlw    poOFF         ;Doy Paso Medio         -> Hasta Aqui han pasado 22us.
    movwf    PORTB
    movf    dpoPosMed,W
    movwf    PORTB

    movlw   .150
    call     DEMORA        ;0.75ms en Doble Activacion

    movlw    poOFF         ;Doy Paso Actual
    movwf    PORTB
    movf    dpoPosAct,W
    movwf    PORTB

    movlw   .8             ;8x0.25ms=2ms
    call    DEMORA1        ;2ms como Maximo en Simple Activacion

gD1RetH
    movlw    poOFF        ;Activo Freno
    movwf    PORTB
    movlw    poBrkN
    movwf    PORTB

gWaitEL    isPinLj    piEnab
    goto    gWaitEL
    goto    gWaitP

gD1RetL
    movlw    poOFF        ;Activo Freno
    movwf    PORTB
    movlw    poBrkN
    movwf    PORTB
    goto    gWaitP


;
; ----------------------
; Funciones de DarPaso
; ----------------------
;
gDoStepUp
    movf    dStepPos,W
    ADDWF    PCL, F
    goto    gStep01
    goto    gStep12
    goto    gStep23
    goto    gStep30

gStep01    movlw    0x01
    movwf    dStepPos
    movlw    poPos01
    movwf    dpoPosMed
    movlw    poPos1
    movwf    dpoPosAct
    goto    gDoStep

gStep12    movlw    0x02
    movwf    dStepPos
    movlw    poPos12
    movwf    dpoPosMed
    movlw    poPos2
    movwf    dpoPosAct
    goto    gDoStep

gStep23    movlw    0x03
    movwf    dStepPos
    movlw    poPos23
    movwf    dpoPosMed
    movlw    poPos3
    movwf    dpoPosAct
    goto    gDoStep

gStep30    movlw    0x00
    movwf    dStepPos
    movlw    poPos30
    movwf    dpoPosMed
    movlw    poPos0
    movwf    dpoPosAct
    goto    gDoStep

; ----------------------
gDoStepDown
    movf    dStepPos,W
    ADDWF    PCL, F
    goto    gStep03
    goto    gStep10
    goto    gStep21
    goto    gStep32

gStep03    movlw    0x03
    movwf    dStepPos
    movlw    poPos30
    movwf    dpoPosMed
    movlw    poPos3
    movwf    dpoPosAct
    goto    gDoStep

gStep10    movlw    0x00
    movwf    dStepPos
    movlw    poPos01
    movwf    dpoPosMed
    movlw    poPos0
    movwf    dpoPosAct
    goto    gDoStep

gStep21    movlw    0x01
    movwf    dStepPos
    movlw    poPos12
    movwf    dpoPosMed
    movlw    poPos1
    movwf    dpoPosAct
    goto    gDoStep

gStep32    movlw    0x02
    movwf    dStepPos
    movlw    poPos23
    movwf    dpoPosMed
    movlw    poPos2
    movwf    dpoPosAct
    goto    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    ; Bucle de 5 us. Compruebo que piEnab este en HIGH       
    goto      PLoop3  
        decfsz    PDel0, F
        goto      PLoop2        ; 2 no, loop
        decfsz    PDel1, F
        goto      DEMRA11        ; 2 no, loop
    goto      gD1RetH

DEMRA12    movlw      .50
    movwf      PDel0

PLoop3  isPinLj      piEnab    ; Bucle de 5 us. Compruebo que piEnab este en LOW
    goto      gWaitP
        decfsz    PDel0, F
        goto      PLoop3        ; 2 no, loop
        decfsz    PDel1, F
        goto      DEMRA12        ; 2 no, loop
    goto      gD1RetL

        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...

iCprog
Este es el aspecto del programa que pasa el fichero .hex al pic...

configuracion iCprog
Ventana de opciones del programa según el programador usado. En este caso, el TE20...

programador pics
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!!!
Motor Paso a Paso de mi fresadora...
Tres Controladoras Bipolares de mi Fresadora!!!
Tres Controladoras Bipolares...