Mi amigo y yo queremos diseñar un control remoto de aprendizaje universal, como este , con fines de aprendizaje. Lo que queremos hacer básicamente es almacenar y reproducir pulsos infrarrojos.
Queremos detectar señales de 36kHz, 38kHz y 40kHz. Una señal de 40 kHz tendrá un período de 25 s.
Queremos usar un microcontrolador PIC de 8 bits, por ahora hemos seleccionado PIC16F616, que funcionará con un oscilador de cristal de alta velocidad de 20MHz. Tenemos dos opciones disponibles:
- Usa el
Interrupt On Change
módulo. - Utilice el modo de captura del módulo CCP.
La primera opción será la siguiente:
Supongamos un registro se establece como: unsigned char _10_us = 0;
. Este registro retendrá el tiempo. El módulo TMR2 con registro de período está configurado para crear una interrupción cada 10 seg. Cuando ocurre una interrupción, incrementará el registro y saldrá . Esto le dará un tiempo máximo de 2.55 ms. Si se necesita más tiempo de medición, se pueden definir e incrementar registros adicionales, según sea necesario._10_us
_1_ms
Ahora, cada vez que se genera una interrupción por cualquier tipo de cambio (de mayor a menor o de menor a mayor), el programa _10_us
registrará la hora actual, que es el valor del registro. Después de un tiempo, cuando se genera la próxima interrupción, el programa restará el valor guardado del _10_us
registro y, por lo tanto, ahora tomará el tiempo que se toma mientras tanto, con una unidad de 10 segundos.
Esta opción me hace rascarme la cabeza; La interrupción de TMR2 ocurrirá aproximadamente cada 50 instrucciones. El manejo de interrupción tomará aproximadamente 20 instrucciones. Me quedan 30 instrucciones para calcular y guardar el período en una matriz. ¿Funcionará este método?
La segunda opción será la siguiente:
Configure el modo de captura del módulo CCP para que genere una interrupción cuando ocurra un evento (de mayor a menor) en el pin CCP1. En la rutina de interrupción, establecerá un indicador para que una tarea en el programa pueda calcular (si es necesario) y guardar el valor de CCPR1H (probablemente no será necesario) y CCPR1L. Luego, cambiaremos la configuración del modo de captura para que active la interrupción cuando ocurra un borde bajo a alto. Y luego esperará al próximo evento. No puedo estimar el rendimiento de este método ya que nunca lo he usado.
¿Otra opción?
Podemos usar un demodulador de infrarrojos IC como la serie TSOP17xx . Eso resolvería nuestro problema por completo. Sin embargo, algunas preguntas me vienen a la mente.
Nuestro requisito de distancia de lectura no es mucho; 1 metro (~ 3 pies). Si seleccionamos un TSOP1738 que debe funcionar en 38kHz, ¿qué tan bien funcionará con señales de 36kHz y 40kHz?
La página 4 de la hoja de datos de la serie TSOP17xx muestra el gráfico "Dependencia de frecuencia de la capacidad de respuesta". Por lo que entendimos;
- 40kHz, que es ~ 1.053 de 38kHz, dará una respuesta relativa de ~ 0.6.
- 36kHz, que es ~ 0.95 de 38kHz, dará una respuesta relativa de ~ 0.65.
¿Qué significan estos valores? ¿Podemos usar un TSOP1738 y estar bien?