(EDITAR: Se agregó TMR0 & TMR1 código de configuración)
Tengo un pequeño vehículo robot controlado por un PIC18f4585. Tiene dos ruedas (rodamiento de bolas en la parte delantera), así como dos codificadores giratorios. Se supone que la siguiente función recorre una distancia específica en pulgadas perfectamente recta. Viaja lo suficientemente recto, el problema es la distancia. La distancia recorrida tiene un error de hasta 2 cm. Me preguntaba si alguien más podría ver un error que no haya visto.
Información adicional: el PIC está sincronizado a 40MHz. Estoy contando los tics del codificador utilizando TMR0 y TMR1 en modo de 8 bits.
Cualquier ayuda / sugerencia sería muy apreciada, gracias.
CONFIGURACIÓN TMR:
TRISAbits.TRISA4 = IO_INPUT;
OpenTimer0( TIMER_INT_OFF &
T0_8BIT &
T0_SOURCE_EXT &
T0_EDGE_RISE &
T0_PS_1_1 );
TRISCbits.TRISC0 = IO_INPUT;
OpenTimer1( TIMER_INT_OFF &
T1_8BIT_RW &
T1_SOURCE_EXT &
T1_PS_1_1 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_ON );
FUNCIÓN RECTA MOVE:
void moveForwardDistance(double distance, int power)
{
int tickGoal = distance * 5.13348; //This seems to get ~the correct distance
int masterPower = power;
int slavePower = power;
int error = 0;
int kp = 50; //error factor
int totalTicks = 0; //used to keep track of total ticks
resetEncoder();
while(totalTicks < tickGoal)
{
SetRightMotor(masterPower);
SetLeftMotor(slavePower);
error = TMR1L - TMR0L;
slavePower = power + (error / kp);
resetEncoder();
DelayMs(100);
totalTicks += TMR1L;
}
SetRightMotor(0);
SetLeftMotor(0);
DelayS(1);
}