Paso 3: Configurar la interrupción para el software activado versión
Ha habido varios excelentes instructables en configuración de captura de datos rápida de arduino.
He desarrollado el siguiente de una variedad de fuentes.
Utilizar la variable prescalar para el control de la frecuencia de la interrupción de muestreo.
Básicamente hemos creado una interrupción que agarra los datos automáticamente a una frecuencia controlable.
Una vez que la interrupción se inicia, los datos se capturan en una rutina de interrupción.
Si disparo está encendido, los datos no se transfieren al búfer hasta que se cumple la condición desencadenante.
La variable adport especifica el puerto analógico. (ADMUX | = adport)
La frecuencia se define utilizando un prescalar. (Registro ADCSRA: bits ADPS2, ADPS1 y ADPS0.)
Estos bits determinan el factor de división entre la frecuencia de reloj del sistema y el reloj de entrada para el ADC.
.
5V de Arduino se utiliza como una referencia de voltaje. (El bit de REFS0)
Tenga en cuenta que el voltaje en mi puerto USB parece conducir mi Arduino en 4.76V.
Si conecto una fuente de alimentación para el Arduino la línea '5V' es en 5.06V
Si usted está buscando precisión, fuente de alimentación externa.
.
Establecer el número de bits utilizados en la captura de puerto analógico. Para la velocidad de 8 bits se leen. La broca ADLAR controla la presentación de la conversión ADC ajuste escribir uno para ADLAR a izquierda. De lo contrario, el valor se ajusta derecho. Esto tiene un efecto inmediato en el registro de datos del ADC.
.
Establecer los bits en ADCSRA para la prescalar de frecuencia. (ADPS0, ADPS1, ADPS2 bits)
.
Establecer la interrupción en varias ocasiones Auto Trigger cuando se lee el puerto analógico. (El bit ADATE y ADIE)
Permitir que el ADC. (El pedacito de ADÉN)
Observe el uso de la función de OSE. Esto y la función de la cbi son muy útiles para el ajuste y bits de registro de datos de claro.
Iniciar la interrupción ADC. (La ADSC bit)
.
Lectura continua del puerto adc 'adport' con una interrupción de la instalación
//
CLI(); deshabilitar interrupciones por lo que podemos cambiar registros sin ser interrumpido
borrar registros ADCSRA y ADCSRB
ADCSRA = 0;
ADCSRB = 0;
ADMUX | = adport; establecer muestreo continuo de pin analógico adport
ADMUX | = (1 << REFS0); tensión de referencia conjunto de AVCC
ADMUX | = (1 << ADLAR); izquierda alinear el valor de ADC - por lo que podemos leer más 8 bits del registro ADCH sólo
Establecer la prescalar. 8 es la mayor frecuencia realizable
8 Khz 143 prescalar (después de la reducción de la velocidad de interrupción tolerable)
Si (prescalar == 8) ADCSRA | = (1 << ADPS1) | (1 << ADPS0);
prescalar 16 - 72 Khz de muestreo
Si (prescalar == 16) ADCSRA | = (1 << ADPS2);
prescaler 32-16mHz/32 = 500 kHz - produce 37 Khz de muestreo
Si (prescalar == 32) ADCSRA | = (1 << ADPS2) | (1 << ADPS0);
64 prescalar produce 19,2 Khz de muestreo
if(prescalar==64) ADCSRA | = (1 << ADPS2) | (1 << ADPS1);
128 prescalar - 9,4 Khz de muestreo si (prescalar == 128) ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADCSRA | = (1 << fecha); activar el gatillo automático
ADCSRA | = (1 << ADIE); Activar interrupción completa de conversión ADC
SBI(ADCSRA,Aden); permiten ADC
ADCSRA | = (1 << ADSC); iniciar medidas de ADC en interrupción
startTime=micros(); registrar el tiempo de modo que podemos calcular el período y la frecuencia
Permitir interrupciones y apagado vamos!
SEI();
.
El código de interrupción
La interrupción del adc es atendida por la rutina de ISR(ADC_vect).
Bufcount variable es la posición en el búfer, cuyo tamaño es BUF_SIZE (= 1000).
Bandera activada es cierto cuando los datos pueden ser capturados.
Cuando el buffer está lleno writeit bandera está verdadera y el adc está deshabilitado. (cbi(ADCSRA,ADEN);)
Para activar la interrupción ya sea activa se establece en true en la configuración y las salidas de datos recodificación inmediatamente.
O el elemento de datos de transfondo se compara con la anterior oldval.
Si la diferencia es mayor que el gatillo y disparado está establecido en true y los datos se almacenan en el búfer.
La variable trigcount se utiliza para contar el número de datos artículos leídos durante el disparo.
Este número se agrega al tamaño de búfer durante el cálculo de la frecuencia para mantener la precisión de la frecuencia observada.
.
Esta es la clave para el programa!
{ISR(ADC_vect)}
Si {} (disparada)
bufa [bufcount] = ADCH;
bufcount ++; contador de búfer de incremento
Si (bufcount == BUF_SIZE) {}
CBI(ADCSRA,Aden); desactivar la ADC
EndTime=micros(); endtime récord para el cálculo del intervalo
writeit = true; bandera que una escritura es necesario
}
} else {}
busca un disparador
transfondo = ADCH;
trigcount ++;
viaje = oldval de transfondo;
if(!trigplus) viaje = - viaje;
Si (viaje > trigger) activa = true; otro oldval = transfondo;
}
}