Vistas de página en total

domingo, 1 de febrero de 2015

CONTROL MOTOR PASO A PASO CON PIC




Motor Paso a Paso


  Voy a controlar el motor paso a paso Malasia 35S1N15D7YA que viene con las impresoras HP mediante 4 salidas del pic acoplada a un UN2003.
 Las salidas usadas eran  son A1,A2,A3,A4. Reservo la A0 para leer un potenciómetro de referencia para la velocidad. En el ejemplo bastaría validar la lectura analógica para usarlo.

  La forma de controlar la secuencia será, un poco diferente a lo que he visto por la red. Será mediante un PIC18F2550 usando la interrupción Timer 2.
  La forma habitual que se encuentra es utilizando un bucle. Este bucle se coloca en un a función a la que se llama cuando se quiere poner en marcha el motor.
  Esa forma de  comandar el motor, es totalmente  operativa, pero tiene desde mi punto de vista un problema. Y es detener el flujo del programa mientras se realiza el movimiento del motor. En caso de movimientos concretos, por ejemplo 100 pasos, este sistema es válido, pero en le caso de desear mantener el motor en movimiento más tiempo y simultaneamente a esto realizar alguna operación, como mostrar en pantalla un determinado valor, resulta inoperativo.
  Por lo tanto así muestro una manera de mover el motor, de forma independiente al ciclo del programa principal. para ello usaré el Timer 2 del PIC. He usado este timer porque es el único capaz de darme una interrupción de 1ms con el cristal de 20MHZ en el PIC.
   Esta interrupción será la que controle los pasos del motor. Por lo tanto en ella se controla la velocidad y el sentido del motor.

  Control de Velocidad
  La molificación de velocidad se consigue mediante un contador. Este contador realizado con una variable, sirve para pasar la secuencia solo 1 vez cada un número de interrupciones. Así si coloco 3 habré dividido por tres la velocidad del motor. Para que la velocidad se entienda como mayor a mayor número, le realizamos un complemento. de forma que el numero de interrupciones a esperar será 127-(abs)velocidad.

  Para conseguir parar el motor solo habrá que colocar la velocidad = 0.


   Cambio de sentido
  Por otro lado el orden de secuencia se realizará en un orden diferente si la velocidad es negativa, que si es positiva. De forma que conseguiremos cambiar el sentido con solo dar números positivos o negativos.

   Tipo de control


  Por último está el funcionamiento del motor en paso completo o medio paso. Para ello he creado dos constantes MEDIO_PASO y PASO_COMPLETO. Para usarlas en una variable "paso", a través de la cual configuramos la forma de recorrer la secuencia de encendidos del motor y la frecuencia de la interrupción.

  El motor da 48 pasos completos por vuelta.
  Para que el motor responda necesita 1ms para mover medio paso y 1,4ms para mover un paso.


  Por lo tanto en medio paso:
      Tardará 48*2 *1 ms en dar una vuelta .Esto son 96ms. Esto son 625 rpm
  En paso completo
      Tardará 48.1,4ms en dar una vuelta. Esto son 67 ms. Esto son 892 rpm

 por debajo de este tiempo al motor no le da tiempo a conmutar de posición.

  Se ha definido dos contantes MEDIO_PASO Y PASO_COMPLETO para manejar la secuencia,
 de forma que si se tiene PASO_COMPLETO, se saltará los pasos intermedio.
   Así mismo estas dos constantes servirán para cambiar la definición del Timer2,
 mediante la función Timer_2.
   La velocidad está comandada por la variable vel, que puede variar de -127 a 127.
   Siendo 127 es su velocidad máxima y 0 parado.

    Para mejor visualización, en vez del la referencia analógica, he utilizado un for, que permite pasar al velocidad de -127 a 127, cambiando el sentido de giro.
   Como se ve en el main, el control de velocidad queda tansparente al proceso principal.



PAP_MOTOR.C
/* Copyright (C) 2015 José Ángel Moneo Fernández
 COMPILADOR CCS
Control motor paso a paso
 created 01 de febero de 2015
 by José Angel Moneo
//   This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//   (at your option) any later version.

//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.

//   You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "Main.h"

#include "LCD420.C"


#define MEDIO_PASO 0
#define PASO_COMPLETO 1

int secuencia [8] ={0b1000,0b1100,0b0100,0b0110,0b0010,0b0011,0b0001,0b1001};

int i_sec=0,t_vel=0;
signed int vel=0;
int1 paso=0;


void  RTC_isr(void)
{
}

#int_TIMER2
void  TIMER2_isr(void)
{ if(vel!=0)
 if (t_vel--<=0){
      t_vel=128-abs(Vel);
    
      if (i_sec++>6) i_sec=0;
           if (vel>0)output_a(secuencia[i_sec]<<1);
           else output_a(secuencia[7-i_sec]<<1);
      if (paso!=MEDIO_PASO) i_sec++;
     }
}



void Timer_2(int1 t)
{
  if(t==PASO_COMPLETO)
   setup_timer_2(T2_DIV_BY_4,230,8);    // 1 paso por milisegundo
  else
    setup_timer_2(T2_DIV_BY_4,230,5);    // 1 paso por milisegundo
   paso=t;
}

void main()
{
   set_tris_a(0x00);

   //Analogica
   setup_adc_ports(AN0 |VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);

   setup_spi(SPI_SS_DISABLED);

   //define el timer 2 para el  control de motro paso a paso
   Timer_2(MEDIO_PASO);
   //timer para pulsos

   setup_wdt(WDT_OFF);
   //setup_timer_0(RTCC_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);


   //comparadores
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
 

//ACTIVACION DE INTERUPCIONES
  // enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);


   // TODO: USER CODE!!
    lcd_init();
    set_adc_channel( 0 );
    delay_ms(50);
    paso=PASO_COMPLETO;


   while (TRUE) {
     //******************Lectura potenciómetro
    // vel= Read_ADC();
   //Secuencia de programa que permite pasar el motor de rápido en un sentido a rápido en el contrario
     for (vel=-127;vel<127;vel++)
      {  printf(lcd_putc,"\fValor:%d " ,vel);
         delay_ms(100);
    }
    

 }
}

No hay comentarios :

Publicar un comentario