Autor Tema: Controlador con microstepping PaP, para mill  (Leído 1802 veces)

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

Desconectado Archangel_Tyrael

  • PIC10
  • *
  • Mensajes: 5
Controlador con microstepping PaP, para mill
« en: 17 de Febrero de 2006, 14:37:00 »
Hora a todos, estoy haciendo un controlador para motores paso a paso con microstepping para una maquina de mill que ando haciendo, en la teoria me baso en la AN906 usando el modulo ECCP, pero me atore en una cosa:

Todo funciona a la perfecion, pero esto nada mas no pude solucionarlo, a la hora de combiar los TRIS de  P1A y P1B es donde esta el problema, combiando el tris de P1A(C2), a entrada ok, me da estado de alta impedancia, pero con el P1B(D5) la cosa cambia, sigue mandando el PWM de los micropasos, se supone que cuando el tris esta en entrada se pone por que se pone, puesto que segun un diagrama en el datasheet, es lo que determina la direccion, lo raro es que en los otros D pins si respeta el TRISD.

Espero que algien me puede ayudar por favor.... por que creo que va a ser cosa de apagar algo que se me esta llendo... pero que quien sabe..., pero haber que pasa, el codigo esta adjunto.
Css 3.222
PIC18f4550

Muchas gracias!!! y saludos de MEXICO!!!

por alguna razon no me dejo subirlo--decia que no hay espacio suficiente???


//*#include "PIC18f4550Test.h"


#include <18F4550.h>
#device adc=8
#fuses   NOWDT,WDT128,HSPLL, NOPROTECT, BROWNOUT_NOSL, NOBROWNOUT,
         BORV20, NOPUT, NOCPD,NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN, NOWRTC,
         NOWRTB, NOEBTR, NOEBTRB, NOCPB, MCLR, NOLPT1OSC, NOXINST, PLL5, CPUDIV1
#use delay(clock=48000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)


typedef short  BOOL;



enum STEP_STATE
{
   SS_STOP = 0,
   SS_PAUSE,
   SS_LEFT,
   SS_RIGHT
};

enum STEP_MODE
{
   SM_FULL_1PH = 0,
   SM_FULL_2PH ,
   SM_HALF,
   SM_MICRO
};

enum STEP_TIME
{
   ST_ONE   = 0x01,
   ST_TWO   = 0x02,
   ST_THREE = 0x04,
   ST_FOUR  = 0x08
};

const struct STEP_PARAM
{
   INT   iStepsCicle;
   INT   iStepSequence[8];
}SP_MODES[4] = {
                  {4, { ST_ONE,        ST_TWO,           ST_THREE,          ST_FOUR}},        // FULL_1PH
                  {4, { ST_ONE|ST_TWO, ST_TWO|ST_THREE,  ST_THREE|ST_FOUR,  ST_FOUR|ST_ONE}},  // FULL_2PH
                  {8, { ST_ONE,        ST_ONE|ST_TWO,    ST_TWO,            ST_TWO|ST_THREE,  // HALF_STEP
                        ST_THREE,      ST_THREE|ST_FOUR, ST_FOUR,           ST_FOUR|ST_ONE}}  // HALF_STEP
                  {8, { ST_ONE|ST_TWO,    ST_TWO|ST_THREE,  ST_TWO|ST_THREE, ST_THREE|ST_FOUR,
                        ST_THREE|ST_FOUR, ST_FOUR|ST_ONE,   ST_FOUR|ST_ONE,  ST_ONE|ST_TWO  }} // FULL_2PH
               };

const INT iPWMControl[8] = {0,0,1,1,0,0,1,1}; // PARA LOS TRIS SEGUN LOS PASOS

enum MICROSTEP_MODE
{
   MSM_MICRO_4,
   MSM_MICRO_8,
   MSM_MICRO_16,
   MSM_MICRO_32
};

const struct MICROSTEP_PARAM
{
   INT   iMicroSteps;
   LONG  lMicroSequencePWM[32];
}MSM_MODES[4] = {
                     {4, {1023, 828, 316, 0}},        // CALCULADO SEGUN LA FORMULA DE AN906
                     {8, {1023, 961, 784, 511, 178, 0}},
                     {16,{1023, 1006, 954, 870, 756, 616, 456, 280, 94, 0}}
                     {32,{1023, 1018, 1005, 982, 950, 909, 861, 804, 740, 670, 593, 511, 424, 335, 241, 146, 49, 0}}
                };

// STATE VARIABLES
INT         iMicroStepPos  = 0;     // Numero de el micro paso dentro de las dos fases
INT         iStepPos       = 0;     // Numero para el paso de control
STEP_STATE  ssState = SS_STOP;  
STEP_MODE   smMode  = SM_HALF;  
MICROSTEP_MODE msmMode = MSM_MICRO_4;
BOOL        bChange    = FALSE;     // Variable aux para saber cuando hay que ir de mas a menos o de menos a mas en el arreglo
INT PWMA; // Hacia el tris de P1A - > TRISC.2
INT PWMB; // Hacia el tris de P1B - > TRISC.5

void SetMode( STEP_MODE Mode )
{
   if(Mode != SM_MICRO )
   {
      /*setup_timer_2(T2_DISABLED, 0xFF, 1); --> cuando no es nigun micropaso se desabilita y P1A, P1B como entradas
      setup_ccp1(CCP_OFF);
      set_tris_c(0xBF);
      set_tris_d(0xFF);*/
   }
   else
   {
      setup_timer_2(T2_DIV_BY_1, 0xFF, 1);
      setup_ccp1(CCP_PWM_HALF_BRIDGE|CCP_PWM_H_L);
      set_tris_c(0xBF);//--> Cambia a salida para ver el PWM de los pasos, como salida esta en alta iMpedancia, SI JALA
      set_tris_d(0xFF);//--> Igual que arriba solo que para el P1B no jala sigue saliendo el PWM en lugar de la tan ansiada alta impedancia :(
   }
   smMode = Mode;
}

void SetMicroMode( MICROSTEP_MODE Mode )
{
   msmMode = Mode;
}

void SetState( STEP_STATE State )
{
   ssState = State;
}

void Step( void )
{
   if( ssState == SS_PAUSE )
      return;
   if( ssState == SS_STOP )
   {
      output_b(0x00);
      return;
   }


   if( ssState == SS_LEFT )
   {
      if( smMode != SM_MICRO )
      {
         --iStepPos;
         if( iStepPos == -1 )
            iStepPos = SP_MODES[smMode].iStepsCicle-1;
      }
      else
      {
         if(bChange)
            --iMicroStepPos;
         else
            ++iMicroStepPos;
         if( iMicroStepPos == -1 || iMicroStepPos == (MSM_MODES[msmMode].iMicroSteps/2)+2 )
         {
               --iStepPos;
               bChange = !bChange;
               if(bChange)
                  iMicroStepPos-=2;
               else
                  iMicroStepPos+=2;
         }
         if( iStepPos == -1 )
            iStepPos = SP_MODES[smMode].iStepsCicle-1;;
      }
   }
   if( ssState == SS_RIGHT )
   {
      if( smMode != SM_MICRO )
      {
         ++iStepPos;
         if( iStepPos == SP_MODES[smMode].iStepsCicle )
            iStepPos = 0;
      }
      else
      {
         if(bChange)
            ++iMicroStepPos;
         else
            --iMicroStepPos;
         if( iMicroStepPos == -1 || iMicroStepPos == (MSM_MODES[msmMode].iMicroSteps/2)+2 )
         {
               ++iStepPos;
               bChange = !bChange;
               if(bChange)
                  iMicroStepPos+=2;
               else
                  iMicroStepPos-=2;
         }
         if( iStepPos == SP_MODES[smMode].iStepsCicle )
            iStepPos = 0;
      }
   }

   if( smMode == SM_MICRO )
   {
      PWMA = iPWMControl[iStepPos]; // se supone que con estos uno estaria en PWM y el otro en alta impedancia
      PWMB = !PWMA;


      /* AQUI EL PROBLEMA, el TRISD no sirve!!!!!*/
      set_tris_c(0xBF);//--> Cambia a salida para ver el PWM de los pasos, como salida esta en alta iMpedancia, SI JALA, BF para RX, TX
      set_tris_d(0xFF);//--> Igual que arriba solo que para el P1B no jala sigue saliendo el PWM en lugar de la tan ansiada alta impedancia :(

      set_pwm1_duty(MSM_MODES[msmMode].lMicroSequencePWM[iMicroStepPos]);
      printf("POS = %u - DUTY = %lu  
6",iMicroStepPos, MSM_MODES[msmMode].lMicroSequencePWM[iMicroStepPos]);

   }
   output_b(SP_MODES[smMode].iStepSequence[iStepPos]);
}


void main()
{
   INT DSE = 0;

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_tris_b(0x00);

   SetState(SS_RIGHT);
   SetMode(SM_MICRO);
   SetMicroMode(MSM_MICRO_32);

   while(1)
   {
      Step();
      output_d(DSE++); // para calar cuando TRISD = FF, todas se apagan menos P1B
      delay_ms(100);
   }
}


 

anything