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 CCSControl motor paso a pasocreated 01 de febero de 2015by 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