Mi amigo y yo queremos diseñar un controlador remoto de aprendizaje universal, como éste , con fines de aprendizaje. Básicamente, lo que queremos hacer 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 \ $ \ mu \ $ s.
Queremos utilizar un microcontrolador PIC de 8 bits, por ahora hemos seleccionado PIC16F616, que funcionará a un oscilador de cristal de alta velocidad de 20MHz. Tenemos dos opciones disponibles:
- Use el módulo
Interrupt On Change
. - Utilice el modo de captura del módulo CCP.
La primera opción será la siguiente:
Supongamos que un registro se establece como: unsigned char _10_us = 0;
. Este registro mantendrá el tiempo. El módulo TMR2 con registro de período está configurado para crear una interrupción cada 10 \ $ \ mu \ $ seg. Cuando se produce una interrupción, incrementará el registro _10_us
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 como _1_ms
según sea necesario.
Ahora, cada vez que se genera una interrupción por cualquier tipo de cambio (alto a bajo o bajo a alto), el programa anotará la hora actual, que es el valor del registro _10_us
. Después de un tiempo, cuando se genere la siguiente interrupción, el programa restará el valor guardado del registro _10_us
y, por lo tanto, el tiempo que se toma mientras tanto, con una unidad de 10 \ $ \ mu \ $ segundos. .
Esta opción me hace rascarme la cabeza; La interrupción de TMR2 ocurrirá aproximadamente cada 50 instrucciones. El manejo de interrupciones tomará alrededor de 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 (alto a bajo) en el pin CCP1. En la rutina de interrupción, establecerá una marca 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 de bajo a alto. Y luego esperará el próximo evento. No puedo estimar el rendimiento de este método ya que nunca lo he usado.
¿Otra opción?
Podemos usar un IC de demodulador infrarrojo como TSOP17xx series. Eso resolvería nuestro problema completamente. Sin embargo, algunas preguntas vienen a la mente.
Nuestro requisito de distancia de lectura no es mucho; 1 metro (~ 3 pies). Si seleccionamos un TSOP1738 que está destinado a funcionar en 38 kHz, ¿cómo bueno funcionará con señales de 36 kHz y 40 kHz?
La página 4 de la hoja de datos de la serie TSOP17xx muestra el gráfico "Dependencia de la frecuencia de la responsabilidad". Por lo que entendemos;
- 40kHz, que es ~ 1.053 de 38kHz, dará una responsabilidad relativa de ~ 0.6.
- 36kHz, que es ~ 0.95 de 38kHz, dará una responsabilidad relativa de ~ 0.65.
¿Qué significan estos valores? ¿Podemos usar un TSOP1738 y estar bien?