¿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 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:

  1. Usa el Interrupt On Changemódulo.
  2. 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_usregistrará 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_usregistro 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?


¿Por qué no simplemente escribir un bucle de software que cuenta cuántos bucles entre pulsos?
Rocketmagnet

@Rocketmagnet No lo entiendo. ¿Podría escribir una respuesta si tiene tiempo? Además, tenga en cuenta que haremos muchas otras cosas como RS232 y SPI, aparte del problema mencionado.
abdullah kahraman

Respuestas:


11

Sí, el TSOP1738 funcionará a esta corta distancia. La respuesta relativa de 0.65 significa que a 36 kHz su LED IR debe estar0,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, deberá 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í la 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 de la portadora, que es eliminada por el TSOP1738 para recuperar la señal de la 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:

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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 de la portadora. Es posible que esté utilizando un control remoto del que no conoce esta frecuencia. El TSOP1738 no lo da en su salida, por lo que si desea leerlo, deberá conectar un fotodiodo o transistor IR a una de las entradas del PIC y leer el tiempo entre dos mismos bordes. Eso es factible. Períodos 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 deberían ser aproximadamente 125, 131 y 139. Eso debería ser suficiente para distinguirlas. Pero si lo desea, puede dejar pasar varios 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 pulso de la señal de banda base .

¡Éxito!


Eso ahora es relajante, gracias. Hace mucho tiempo que creé un "alumno de IR" basado en TSOP1738, pero eso fue un desastre.
abdullah kahraman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.