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);
}
}