Hola chicos,
Recurro a uds. a ver si me pueden dar alguna idea para solucionar el problema que tengo. Necesito medir las revoluciones de un motor que acciono con el PWM y mido su periodo con el modulo de captura de entradas, para luego enviarlas por el bus CAN. Por algun motivo que desconosco, los valores que mido con el InCap son pura basura, a veces un valor muy grande y a veces uno pequeño o cero. El motor da una vuelta cada 200 ms aproximadamente, la frecuencia es 120MHz y si el timer esta con preescaler de 1:256 deberian ser (si me equivoco diganme!!) unas 93.750 cuentas!!!creo que es mucho para un unsigned int (16bit). Existe un preescaler mayor o como podria hacer para no tener que ocupar un long (despues tengo que enviarlo por el CAN)? No se si me falta algo por configurar o que se me escape. Aqui les dejo gran parte del codigo a ver si encontrais algun error o sugerencia.
Rutinas para InCap
=============================================
void InCapConfig() /*Configura el modulo InCap 7 para el pin RB4*/
{
ConfigIntCapture7(IC_INT_PRIOR_1 &
IC_INT_ON);
T3CON = 0x8030; /* Timer 3 On */
OpenCapture7(IC_IDLE_STOP &
IC_TIMER3_SRC &
IC_INT_1CAPTURE &
IC_EVERY_FALL_EDGE);
}
void __attribute__((interrupt,auto_psv)) _IC7Interrupt(void) /*Rutina de Interrupcion
{
Interrupt_Count++;
if(Interrupt_Count == 1)
ReadCapture7(&timer_first_edge);
else if(Interrupt_Count == 2)
ReadCapture7(&timer_second_edge);
Int_flag=1;
IFS1bits.IC7IF = 0;
}
Main
===================================================
unsigned int timer_first_edge, timer_second_edge;
int Interrupt_Count = 0, Int_flag;
int main(void)
{
unsigned int periodo,uiRxIn;
unsigned char ucTxData[8], ucRxData[8], n=1;
InCapConfig();
CANConfigure(BAUDRATE_20k, 0xFF, 100, 0);
Int_flag = 0;
uiRxData=170;
while(1)
{
if (CANReceive(ucRxData, n) ==1) /*Mira si hay mensaje en el buffer de entrada*/
{
uiRxIn = ucRxData[0];
SetDCMCPWM(1,uiRxIn,0);
}
while(!Int_flag); /* wait here till first capture event */
Int_flag=0;
while(!Int_flag); /* wait here till next capture event */
periodo = (timer_second_edge - timer_first_edge); ///* calculate time count between two capture events */
Interrupt_Count = 0;
ucTxData[0]=(unsigned char) periodo & 0x00FF ; /* Pone los primeros 8 bits en la posicion 0 */
ucTxData[1]=(unsigned char) (periodo>> 8 ) & 0x00FF; /*Pone los siguientes 8 bits en la posicion 1*/
CANTransmit(300,ucTxData,2); /*Transmite el mensaje con el valor del periodo*/
}
CloseCapture7();
return 0;
}