¿Cómo medir el ancho de pulso de una señal IR usando un PIC de 8 bits?

14

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:

  1. Use el módulo Interrupt On Change .
  2. 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?

    

1 respuesta

11

Sí, el TSOP1738 funcionará a esta corta distancia. La capacidad de respuesta relativa de 0.65 significa que a 36 kHz su LED IR debe estar \ $ \ sqrt {0.65} \ $ = 0.8 veces más cerca para ver la misma intensidad de señal, debido a la ley del cuadrado inverso . Entonces, si su TSOP1738 ve un cierto nivel para 38 kHz a 1 m, tendrá que mantener el transmisor a 80 cm para obtener la misma intensidad de señal a 36 kHz. Por cierto, con un control remoto con baterías nuevas, medí una recepción perfecta a más de 15 m de distancia, por lo que no tengo ningún problema.

No te preocupes por el rendimiento del PIC. El TSOP1738 no emitirá la señal de 38 kHz. Esa es la frecuencia portadora, que se elimina con el TSOP1738 para recuperar la señal de banda base, que tiene una frecuencia mucho más baja, con duraciones de pulso del orden de 1 ms, por lo que hay mucho tiempo para medir el tiempo entre los bordes con precisión.

Las siguientes imágenes de alcance ilustran esto:

EsteesuncódigoRC5.Laseñalsuperioreslaseñalmoduladade36kHz,lainferioreslaseñaldebandabaseconelcódigoreal.

Esto se amplía en un pulso de la señal de banda base. Puede ver pulsos individuales de la portadora de 36 kHz.

Una palabra más sobre la frecuencia portadora. Puede estar usando un control remoto del cual no conoce esta frecuencia. El TSOP1738 no lo da en su salida, así que si quiere leerlo, tendrá que conectar un fotodiodo IR o un transistor a una de las entradas del PIC y leer el tiempo entre dos bordes iguales . Eso es factible Periodos de tiempo para diferentes frecuencias portadoras:

40 kHz: 25 µs
38 kHz: 26.3 µs
36 kHz: 27.8 µs

Un PIC16F616 de 20 MHz tiene un ciclo de instrucción de 200 ns (¡divide el reloj por 4!). Por lo tanto, las lecturas para las tres frecuencias deben ser aproximadamente 125, 131 y 139. Eso debería ser suficiente para diferenciarlas. Pero si lo desea, puede dejar pasar una serie de bordes y solo leer el temporizador después de la décima interrupción, por ejemplo: 1250, 1316, 1389. No mucho más tiempo porque debe mantener el tiempo más corto que un impulso de la señal de banda base .

¡Éxito!

    
respondido por el stevenvh

Lea otras preguntas en las etiquetas