Autor Tema: Modificar programa de microstep  (Leído 4694 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Modificar programa de microstep
« en: 30 de Julio de 2006, 14:46:40 »
He realizado en Ares la placa de microstep (www.embeddedtronics.com a quienes estoy muy agradecido) para utilizar los componentes que tengo en mi distribuidor, tamaño de conectores etc. Ademas de eso he comprado los pics 16F628, pero no los encontre de 20 Mhz por lo que los adquiri de 4 Mhz

Por eso necesito modificar el programa que ellos publican y no estoy del todo seguro de lo que tengo que cambiar, a ver si alguien me ayuda.
Solo necesito cambiar los tiempos por lo que con cambiar la frecuencia del reloj y los contadores seria bastante, pero.....¿que valores debo usar?

Os pego la parte principal del programa y a ver que podeis decirme


Código: [Seleccionar]

#include <16F627.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,MCLR,NOPROTECT,BROWNOUT,NOLVP
#byte   PORT_A =  5
#byte   PORT_B =  6
static char pos = 0;
static int16 timer_count=0;           // timer1 sobrecarga del contador

#define step_input    PIN_B0
#define dir_input     PIN_B1
..........................................

// solo pego lo necesario
...........................................
/*------------------------------
     RUTINAS
----------------------------------*/
void step(char dir)
    {
#if  !defined (microstep10)  && !defined (microstep10new)
      pos = (steps + pos + dir) & (STEPS-1);  //trabaja solamente con STEPS de 4,8,32
#else
      pos = (pos + STEPS + dir) % STEPS;    //for microstep10, this one works for any STEPS length value but takes longer to calculate
#endif
      PORT_A = PA[pos];  //salida a los drivers
      PORT_B = PB[pos];
    }

void stepper_off() //Corta toda la alimentacion (bloqueo).
{
PORT_A = 0;
PORT_B = 0;
}

void init_stepper() //Mueve un poco para conseguir una posicion correcta de paso.
{
int i;
for (i=0;i<8;i++){
step(-1);
delay_ms(100);
}
for (i=0;i<8;i++){
step(1);
delay_ms(100);
}
}

#INT_EXT             //Interrupcion del Pin B0 la rutina para Step con la entrada activa a nivel bajo
void ext_isr() {
//lee la direccion de entrada y el avance del motor
signed int dir,i,temp;

   dir=input(dir_input);

#if  !defined (microstep10)  && !defined (microstep10new)
   if (dir==0){
   dir=-1;}
#endif

//Rutina de multiplicacion de pasos. En estado de test.
#ifdef step_multiply
      for (i=0;i<step_x;i++){
         step(dir);
         delay_us(5);   //Nota: Puese ser necesario aumenta o disminuir este delay  dependiendo de como vaya de rapido el motor.
      }
#else

#if  !defined (microstep10)  && !defined (microstep10new)
    pos = (steps + pos + dir) & (STEPS-1);  //Trabaja solamente con  STEPS de 4,8,32
#else
    if(dir==0){            //rutina rapida  microstep10
        pos = (pos + 1);
        if (pos==40) {
        pos=0;
        }
    }
    else{
        if (pos==0) {
        pos=40;
        }
        pos = (pos - 1);
    }
#endif
      PORT_A = PA[pos];  //salida a los drivers
      PORT_B = PB[pos];
#endif

timer_count=0;         //resetea el contador del timer1 para empezar el conteo
}

#int_timer1                       //Esta funcion es llamada cada vez que
timer_isr() {                     //timer1 sobrepasa (2^16).
    timer_count++;
    }

void main() {
   setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 );  //inicializa timer1
   enable_interrupts(INT_TIMER1);  //activa la interrupcion de timer1
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   ext_int_edge(H_TO_L);           //inicializa la interrupcion por cambio de estado de B0, Activa a nivel bajo
   enable_interrupts(INT_EXT);     //activa la interrupcion externa de B0
   enable_interrupts(GLOBAL);

   set_tris_a(0x10);  //inicializa los puertos A&B para que sean correctas las direcciones i/o
   set_tris_b(0x03);
   #use fast_io (A)
   #use fast_io (B)

stepper_off();     //Deja el motor sin corriente.
delay_ms(1000);    //retardo de 1 seg antes de andar.
init_stepper();

loop:
if (timer_count>1700){     //Apaga el motor despues de 3 min sin pulsos de actividad (cambiar en caso de usar otro cristal)
   PORT_A = 0b0010;     //Fija la corriente a un nivel del 12% de mantenimiento
      PORT_B = (PB[pos] & 0b00001111) | 0b00100000;
      }
goto loop;    //bucle de vuelta, espera a que se requiera una interrupcion
}


Si alguien quiere el diseño de placa o el codigo o algo que me lo diga y estare encantado de pasarselo


« Última modificación: 30 de Julio de 2006, 15:51:55 por Algec »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Modificar programa de microstep
« Respuesta #1 en: 30 de Julio de 2006, 15:30:53 »
#use delay(clock=4000000) en lugar de #use delay(clock=20000000)
fuses XT, ... en lugar de fuses HS, ...
Recalcular valores de timer1 sabiendo que:

Un Incremento de Timer se produce cada 4 ciclos de reloj o sea (1/FOSC)*4
con lo que antes se producía cada  (1/20000000)*4=0,0000002 segundos
y ahora en cambio se produce cada (1/4000000) *4=0,000001   segundos
pero como además en TIMER1 tienes un preescaler de T1_DIV_BY_8
con lo que todo es 8 veces mas lento luego
antes se producía cada   (1/20000000)*4*8=0,0000016 segundos
y ahora se produce cada (1/4000000) *4*8=0,000008  segundos

Como el TIMER1 es un contador de 16 bits cuenta desde 0 hasta 65535 (2^16)
o sea que cuenta 65536 veces lo anterior y como tienes habilitada la interrupción
por desbordamiento del TIMER1 o sea que se interrumpe cada vez que TIMER1 pasa
de 65535 a 0 entonces dicha interrupción
antes se producía cada  (1/20000000)*4 * 8 * 65536= 0,1048576 segundos
y ahora se produce cada (1/4000000) *4 * 8 * 65536= 0,524288  segundos.

Veo en tu post que solo aparece una referencia al contador mediante timer_count que
se incrementa cada interrupción TIMER1 luego el valor de 1700 interrupciones que cuenta
antes eran  0,1048576 * 1700 = 178,25792 segundos
y ahora son 0,524288 * 1700 =  891,2896 segundos
por lo que para que los segundos en interrupciones sean lo mismo debes
usar el valor de 340 en lugar de los 1700 ya que 178,25792 / 0,524288 = 340 y
entonces el tiempo que esperas es el mismo.

Esta es la forma larga, razonada, lógica y elegante de decirtelo ...  :mrgreen:

La que yo hubiese hecho es ....

Como 20 Mhz es 5 veces mas rápido que 4 Mhz entonces 1700/5 = 340  ja ja ja  :D  :D  :D






« Última modificación: 30 de Julio de 2006, 15:48:04 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Modificar programa de microstep
« Respuesta #2 en: 30 de Julio de 2006, 15:43:40 »
Mas rapido preciso y claro imposible
Mil gracias,
Por cierto que era lo que habia que poner para que el codigo quede como codigo?
Nunca me acuerdo y me sabe mal

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Modificar programa de microstep
« Respuesta #3 en: 30 de Julio de 2006, 15:46:42 »
Pos m'alegro.

Seleccionas el código y despliegas en ComboBox llamado GeSHi y seleccionas idioma de tu código ...

o escribes (sin espacios) [ c o d e = c ] Tu Código [ / c o d e ]

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Modificar programa de microstep
« Respuesta #4 en: 30 de Julio de 2006, 15:53:16 »
Gracias de nuevo.
Asi esta mejor el post, jjejej es que nunca me acuerdo de que son corchetes y el terminador

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Modificar programa de microstep
« Respuesta #5 en: 30 de Julio de 2006, 15:59:22 »
Si, pero le has puesto solo el [c o d e] Si le pones el [c o d e = c ] queda mucho mas bonito.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Modificar programa de microstep
« Respuesta #6 en: 30 de Julio de 2006, 16:42:30 »
Magnifica explicacion Red...

Yo tampoco pude encontrar el 16F628 a 20Mhz.
De todas formas yo utilizo el mismo micro (16F628-04/P) con un cristal de 20Mhz y funciona perfectamente.
Saludos desde Granada, España.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Modificar programa de microstep
« Respuesta #7 en: 30 de Julio de 2006, 16:57:50 »
No da problemas?
¿prefiero no forzarlo por si acaso no?
la verdad es que estara sobredimensionado

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Modificar programa de microstep
« Respuesta #8 en: 30 de Julio de 2006, 17:09:45 »
Jeje, en todos los proyectos utilizo el cristal de 20Mhz.
Y tanto el 16F877, 16F876 y el 16F628 funcionaron y funcionan bien a 20Mhz.
Ademas los distintos proyectitos los probé con un numero no inferior a 4 o 5 Pic iguales
(por si era simple suerte) para los distintos modelos que utilizo y te puedo decir que
no es casualidad que funcionen todos correctamente a 20Mhz.
Saludos desde Granada, España.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Modificar programa de microstep
« Respuesta #9 en: 30 de Julio de 2006, 17:22:23 »
Gracias Carlos, sin embargo a mi los 628 (sin A) que tengo, un par de ellos comprados aqui en Sevilla antes de saber que Microchip enviaba samples, no quieren funcionar por encima de 12 Mhz. He ido cambiandoles los cristales, 4, 6, 8 10, 12 y 20 y hasta ahí llegué, con los de 20 Mhz no he logrado que funcione nada.  :shock:


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Modificar programa de microstep
« Respuesta #10 en: 30 de Julio de 2006, 17:49:22 »
Pues del 16F628-04/P tengo unos 10, y de ellos he utilizado 4 si no recuerdo mal,
durante las pruebas del prototipo, por cierto, prototipo que tu tuviste en las manos...
Recuerdas? la plaquita azul... se ve que los unicos que funcionan los tengo yo...  :D
« Última modificación: 31 de Julio de 2006, 11:14:31 por dogflu66 »
Saludos desde Granada, España.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Modificar programa de microstep
« Respuesta #11 en: 31 de Julio de 2006, 01:13:15 »
Tambien es posible que cuando se les hace trabajar overclockeados si tengan mucha importancia las inductancias, capacitancias, reactancias y otras ancias de nuestros montajes chapuceros y de carreras ... y puede ser que el mio tenga muchas ancias de las chungas y el tuyo las tenga de las gueno-por-esta-vez-te-las-dejo-pasar-pero-que-no-ta-costumbres ... aj ja ja  :D  :D  :D

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Modificar programa de microstep
« Respuesta #12 en: 31 de Julio de 2006, 11:12:52 »
Si quieres, mándame una dirección al privado y te envio un ansias de estos para que lo pruebes...  :D
Saludos desde Granada, España.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Modificar programa de microstep
« Respuesta #13 en: 06 de Agosto de 2006, 14:43:52 »
A ver si podeis ayudarme, ya he realizado la placa fisicamente pero me temo que algo no esta bien.
He tratado de hacer rodar el motor con el programa de microstep solamente modificado para 4 Mhz y aun sin usar el PC solamente poniendo el pin de Direccion a cero y el de brake a cero tambien, y metiendo pulsos por el pin de Steps con un 555.
Suponia que asi deberia funcionar variando la velocidad en funcion de la frecuencia de los pulsos, y cambian de direccion en funcion de que tuviese un 1 o un 0 en el pin Direccion. Ciertamente logre que el motor gire pero siempre a la misma velocidad y siempre en el mismo sentido. ¿que hago mal?