14 votos

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

Mi amigo y yo queremos diseñar un mando a distancia de aprendizaje universal, como este para el aprendizaje. Lo que queremos hacer básicamente es almacenar y reproducir los pulsos infrarrojos.

Queremos detectar señales de 36kHz, 38kHz y 40kHz. Una señal de 40kHz tendrá un periodo de 25 \$\mu\$ s.

Queremos utilizar un microcontrolador PIC de 8 bits, por ahora hemos seleccionado el PIC16F616, que funcionará con un oscilador de cristal de alta velocidad de 20MHz. Tenemos dos opciones disponibles:

  1. Utilice el Interrupt On Change módulo.
  2. Utilice el modo de captura del módulo CCP.

La primera opción será la siguiente:

Supongamos que un registro está configurado como: unsigned char _10_us = 0; . Este registro mantendrá el tiempo. El módulo TMR2 con el registro de periodo está configurado para crear una interrupción cada 10 \$\mu\$ sec. Cuando se produce una interrupción, se incrementará el _10_us registrar y salir. Esto dará un tiempo máximo de 2,55mseg. Si se necesita medir más tiempo, se pueden utilizar registros adicionales como _1_ms puede definirse e incrementarse según sea necesario.

Ahora, cada vez que se genere una interrupción por cualquier tipo de cambio (de alto a bajo o de bajo a alto), el programa anotará la hora actual, es decir, el valor de _10_us registro. Después de un tiempo, cuando se genere la siguiente interrupción, el programa restará el valor guardado del _10_us registro, y por lo tanto ahora el tiempo que se toma en el ínterin, con una unidad de 10 \$\mu\$ segundos.

Esta opción me hace rascarme la cabeza; la interrupción TMR2 se producirá aproximadamente cada 50 instrucciones. El manejo de la interrupción tomará unas 20 instrucciones. Me quedan 30 instrucciones para calcular y guardar el periodo en un array. ¿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 se produzca un evento (high-to-low) en el pin CCP1. En la rutina de interrupción, establecerá una bandera 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 dispare la interrupción cuando se produzca un flanco bajo-alto. Y luego esperará al siguiente evento. No puedo estimar el rendimiento de este método ya que nunca lo he utilizado.

¿Otra opción?

Podemos utilizar un IC demodulador de infrarrojos como TSOP17xx serie. Eso resolvería nuestro problema por completo. Sin embargo, se me ocurren algunas preguntas.

Nuestro requisito de distancia de lectura no es mucho; 1 metro (~3 pies). Si seleccionamos un TSOP1738 que está destinado a trabajar en 38kHz, ¿cómo así ¿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 la frecuencia de la respuesta". Por lo que hemos entendido;

  • 40kHz, que es ~1,053 de 38kHz, dará una sensibilidad relativa de ~0,6.
  • 36kHz, que es ~0,95 de 38kHz, dará una sensibilidad relativa de ~0,65.

¿Qué significan estos valores? ¿Podemos usar un TSOP1738 y estar bien?

11voto

lillq Puntos 4161

Sí, el TSOP1738 servirá para esta corta distancia. La sensibilidad relativa de 0,65 significa que a 36 kHz su LED IR tiene que ser \$\sqrt{0.65}\$ = 0,8 veces más cerca para ver la misma intensidad de señal, debido a la ley del cuadrado inverso . Así que si tu TSOP1738 ve un cierto nivel para 38 kHz a 1 m, tendrás que mantener el transmisor a 80 cm para obtener la misma intensidad de señal a 36 kHz. Por cierto, con un mando a distancia con pilas nuevas he medido una recepción perfecta a más de 15 m de distancia, así que no hay 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 es eliminada por 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 bordes con precisión.

Las siguientes imágenes de alcance lo ilustran:

enter image description here

Este es un código RC5. La señal superior es la señal modulada de 36 kHz, la inferior la señal de banda base con el código real.

enter image description here

Se trata de una ampliación de un pulso de la señal de banda base. Se pueden ver los pulsos individuales de la portadora de 36 kHz.

Unas palabras más sobre la frecuencia portadora. Puede que estés utilizando un mando a distancia del que no conozcas esta frecuencia. El TSOP1738 no la da en su salida, así que si quieres leerla tendrás que conectar un fotodiodo IR o un transistor a una de las entradas del PIC y leer el tiempo entre dos mismo bordes. Eso es factible. Tiempos de periodo 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!). Así que las lecturas para las tres frecuencias deberían ser aproximadamente 125, 131 y 139. Eso debería ser suficiente para distinguirlas. Pero si quieres puedes dejar pasar un número de flancos y sólo leer el temporizador después de la décima interrupción, por ejemplo: 1250, 1316, 1389. No mucho más porque tienes que mantener el tiempo más corto que un pulso de la señal de banda base.

¡Éxito!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X