Este tipo de cosa se puede hacer con el evento de la discriminación.
Un evento discriminador acepta señales con la debida amplitud y contenido de frecuencia.
Para lograr esto en un simple micro-controlador de moderada capacidad de decir a 16MHz o mejor):
Olvidar el A2D, y aplicar su piezo señal a un comparador analógico. El comparador de salida, a continuación, se conecta a un pin de entrada configurada como una interrupción.
Una vez que el 1 de pulso llega, iniciar un temporizador, y continuar el conteo de pulsos de entrada. Una vez que el número de pulsos detectados, o el temporizador ha terminado, salir del bucle.
Si usted consigue el número de cuenta, y el temporizador está por debajo de algunos de recuento, a continuación, la señal es demasiado alta frecuencia, y puede ser descartado.
Si el temporizador ha expirado, y el número es demasiado bajo, entonces la señal es demasiado baja frecuencia, y puede ser descartado.
Otra cosa, la señal puede ser considerado como un evento.
Por supuesto, usted puede hacer todo esto con su A2d de datos, se acaba de tomar un cpu con más caballos de fuerza.
"¿Cuáles son los ajustes correctos?" Mirar en una bola de rebote con un alcance conectado al comparador de salida. Determinar el número de pulsos que son las más comunes por s sola pong pelota de rebote, así como el mínimo y el máximo de tiempo correspondiente a la frecuencia.
Buena suerte!
Pseudo Código:
//******************************************************************************
//
// INTERRUPT HANDLERS
//
//******************************************************************************
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt
void Port_1(void) {
//Only defined interrupt should be (P1.0). Yes, slimy cheating here to keep things fast.
//Bit1.0 - Initial Pulse detected. Start Discrimination.
//Start Window timing, TA1R should already be set to 0 somewhere else.
TA1CTL |= TIMER_A_CONTINUOUS_MODE;
//Start Pulse counting, TA2R should already be set to 0 somewhere else.
TA2CTL |= TIMER_A_CONTINUOUS_MODE;
//Disable this pin input interrupt
P1IE = 0x0; //Hard-coded and blunt-force trauma for speed.
State = Active;
}
//Handle interrupts from Timer A1 ('Timer1_A'), section 0 ('0') which connects to CCR0
//This is the Frequency Window timer.
#pragma vector=TIMER1_A0_VECTOR
__interrupt
void TIMER1_A0_ISR(void){
//if we've made it here, then we've run out of time. Abort. Low Frequency.
//Turn off/reset Pulse counter
Timer_A_stop(TIMER_A2_BASE);
Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
//Turn off/reset this (Window) counter
Timer_A_stop(TIMER_A1_BASE);
State = LowF;
}
//Handle interrupts from Timer A2 ('Timer2_A'), section 0 ('0') which connects to CCR0
//This is the pulse counter.
#pragma vector=TIMER2_A0_VECTOR
__interrupt
void TIMER2_A0_ISR(void){
//if we've made it here, then we have enough pulses. Check for event...
//Turn off/reset the window counter
Timer_A_stop(TIMER_A1_BASE);
Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
//Turn off/reset this (Pulse) counter
Timer_A_stop(TIMER_A2_BASE);
//Verifiy timer results outside the ISR, and determine is this is really a good event
State = Verify;
}